Excel VBA 質問スレ Part49©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ bb2e-8SzA)
垢版 |
2017/06/26(月) 02:15:14.60ID:T3ylemnb0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

スレ立ての際は一行目に
!extend:checked:vvvvv:1000:512
と入れてスレ立てして下さい

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK

※前スレ
Excel VBA 質問スレ Part48
http://mevius.2ch.net/test/read.cgi/tech/1494890685/

※関連スレ
VBAなんでも質問スレ Part2
http://mevius.2ch.net/test/read.cgi/tech/1432173164/
Access VBA 質問スレ Part1
http://mevius.2ch.net/test/read.cgi/tech/1328536426/
Excel総合相談所 126
https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0141デフォルトの名無しさん (ワッチョイ bf6d-LaqR)
垢版 |
2017/07/07(金) 23:55:59.29ID:IHJ5BTGs0
>>139
残念ながらかなり根本的な事がわかっていない

function〜はユーザー定義関数っつって、処理をひとまとめにしたもの

numってのは変数名。これは自分で決めるもので、
「num」でも「namu」でも「ナンバー」でもなんでもいい。
「sub」「if」みたいな単語は予約語と言ってそれらは使えないんだけど、まぁ何となく分かるだろう

毎回'こう書くのがめんどくさいから
Range("b1") = Range("a1") / 100 & "%"
'functionを定義して、使い回しできるようにしているだけの話
Range("b1") = percent(Range("a1"))

function作るのめんどくさくね?
と思ったかもしれないけど、それは何もわかっていないだけ
素直にこういうもんだと覚えてくれ
0142デフォルトの名無しさん (ワッチョイ d701-LW04)
垢版 |
2017/07/07(金) 23:57:08.34ID:cLxiai6C0
すみません。意味が分かりました。
0146デフォルトの名無しさん (ワッチョイ f791-nB+A)
垢版 |
2017/07/08(土) 00:07:48.82ID:ieaMtMqy0
>>143
多分だが、引数を理解できてなくて
numに勝手にマッピングされてる、みたいに思ったんじゃないか
なんか勉強の順番おかしいんじゃない?
もっと前のフェーズでの学習が抜け落ちたまま次進んでる気がする
0150デフォルトの名無しさん (ワッチョイ 97ea-okny)
垢版 |
2017/07/08(土) 04:13:51.39ID:4CWa99QQ0
Private Sub Worksheet_Calculate()


If Worksheets("sheet1").Cells(3, 20) > 4000 Then

Worksheets("sheet1").Range("V4:AP4").Insert

End If


end sub

インサートがめっちゃ繰り返される。どうして?
0152デフォルトの名無しさん (ワッチョイ bf6d-KuRC)
垢版 |
2017/07/08(土) 09:26:58.00ID:lNWyFXj50
>>150
Application.EnableEvents = False
で、eventを止める
そうしないと
>セル挿入→再計算→Worksheet_Calculate→ifがtrue→セル挿入→再計算→Worksheet_Calculate→ifが(略
が起こる

Private Sub Worksheet_Calculate()
Application.EnableEvents = False
If Worksheets("sheet1").Cells(3, 20) > 4000 Then
Worksheets("sheet1").Range("V4:AP4").Insert
endif
Application.EnableEvents = True
End Sub
0153デフォルトの名無しさん (ワッチョイ 97ea-okny)
垢版 |
2017/07/08(土) 13:34:02.80ID:4CWa99QQ0
>>151,>>152
的確な指示ありがとう!!(笑)
すごいなここの人は
0154デフォルトの名無しさん (ワッチョイ b7e3-jTKI)
垢版 |
2017/07/08(土) 16:53:25.86ID:Z/1cPHhj0
>>149
別にいいよ、モジュールの一番上にそれを書くのを忘れなければ
0156デフォルトの名無しさん (ワッチョイ ffb9-wcci)
垢版 |
2017/07/09(日) 00:06:53.03ID:8a4WwF270
こんばんは。
困ってます。

先日作成したマクロが動かなくなりました。
作成した日は動きました。
(特定のフォルダをコピーしてリネームするだけの動きです。)
プログラムを手動で実行したときは問題なく動くので、
プログラムの問題ではなさそうなのですが。

エクセルのセキュリティは、「警告を表示してすべてのマクロを無効にする」
にしています。
エクセルの再起動・PC再起動は試しましたが、だめでした。

C:\...Local\Temp\Excel8.0のMSForms.exdも消してみたりしましたがダメでした。

原因は何でしょうか・・・?
0157デフォルトの名無しさん (ワッチョイ ffb9-wcci)
垢版 |
2017/07/09(日) 00:08:43.90ID:8a4WwF270
スペック全然書いてなかった。

Windows8.1
Excel2013 です。
0158デフォルトの名無しさん (ワッチョイ ffb9-wcci)
垢版 |
2017/07/09(日) 00:14:34.37ID:8a4WwF270
すみません。
書き込んですぐに自己解決しました。

コマンドボタンのオブジェクト名が違ってた・・・。
0164デフォルトの名無しさん (アウアウカー Sa2b-nSBM)
垢版 |
2017/07/09(日) 19:05:53.04ID:WoCQL3Mea
初心者的な内容ですいません。
よければ教えてください。

1はなぜactivesheetでなくshが回答となるのでしょうか。
shがworksheetsとして定義されていないのになぜ、worksheetsとして考えられるのかわかりません。

---------

次のイベントプロシージャはブックに新しいシートを挿入したときに実行される。
挿入されたシートのシート名を、ユーザーがダイアログボックスから入力した名前に変更させたい。
このとき、【 1 】に入る適切な命令を解答欄に入力しなさい。
ただし、シート名の重複などのエラー処理は省略しているものとする。

Private Sub Workbook_NewSheet(ByVal Sh As Object)

Dim strSheetName As String
strSheetName = InputBox("新しいシートの名前を入力してください")

If strSheetName <> "" Then

【 1 】.Name = strSheetName

End If

End Sub
0167デフォルトの名無しさん (ワッチョイ bf23-KuRC)
垢版 |
2017/07/09(日) 19:29:29.32ID:e2g8wwYr0
>>164
新しくできたシートが引数Shで渡されている。
(ByVal Sh As Object)の部分。
Workbook_NewSheetのイベントプロシージャの仕様。
たいてい、どのイベントプロシージャも自分自身の参照を引数で渡されている。
ので、この場合、新しくできたシート自身を操作したければ
引数で渡ってきているShを操作すればよい。
0173デフォルトの名無しさん (ワッチョイ bf23-KuRC)
垢版 |
2017/07/09(日) 20:10:27.05ID:e2g8wwYr0
ためしに別の変数にShを突っ込んでみたら
中身が見られるようになった。

どっかで、オブジェクト変数は利用されるまで中身が入らないよ
みたいな話を聞いたような・・・。
0174デフォルトの名無しさん (ワッチョイ bf6d-LaqR)
垢版 |
2017/07/09(日) 20:17:33.00ID:XJb9KLmK0
>>172
試してみたら、ウォッチ式でもイミディエイトウィンドウでもsh.nameはうまく取れた。
ウォッチ式のshは取れない。
なんかバグの温床になりそうで、このshあんまり使いたくないなぁ…

環境はwindows7 エクセル2010

vbaコード
Private Sub Workbook_NewSheet(ByVal Sh As Object)
MsgBox 1 'ブレークポイントを設定している
End Sub

ウォッチ式に
sh
sh.name
を追加
shは図のとおり、変な状態になる。プロパティなどが表示されない
sh.nameはシート名が表示される

イミディエイトウィンドウは正常
?sh.name
Sheet5

http://stamp-uploda.com/src/file7296.jpg

>>173
プロパティ(sh.name)を呼び出してみた後の状態
(メッセージボックスにはsheeet6と正常に表示された)
やっぱりダメだった。
http://stamp-uploda.com/src/file7297.jpg

なんらかの理由でウォッチ式が正常に機能してないだけならいいけど、正常な状態でこれだとどういう状況なんだろう
0175デフォルトの名無しさん (ワッチョイ bf23-KuRC)
垢版 |
2017/07/09(日) 20:42:05.40ID:e2g8wwYr0
>>174
Dim sheet as Worksheet
Set sheet = Sh

これをmsgboxの前に追加すると全部の変数がウォッチで見られると思う。

ググってみたらNewで作ったオブジェクトは初めて利用するまで空ですよ
らしいので、新シートのオブジェクトは内部的にNewで作成している?
Sh.nameが引けるのは何ででしょう?
0177デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/09(日) 20:43:34.76ID:BT4+59vh0
>>174
objectで受け取ってるからshのままでは何のクラスなのかわからないからどんなプロパティがあるかわからない

Nameプロパティを指定したら
Nameプロパティを持っているクラスとして解釈して
Nameプロパティの位置を文字列として表示しただけ

worksheetクラスのデフォルトプロパティがNameだからかな

countプロパティとかとして解釈させたら想定外の値になると予想
0179デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/09(日) 20:49:10.77ID:BT4+59vh0
>>178
VBAだけじゃなくて他のプログラミング言語C言語とかと共通の考え方

メモリ確保とかキャストとか
0180デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/09(日) 20:54:20.52ID:BT4+59vh0
>>164
1が実行されるまでの間にactivesheetが変わるかもしれないからactivesheetでは不正解だと思う

出来るだけactivesheetを使わない方が想定外の動作にならないと思う
0181デフォルトの名無しさん (ワッチョイ 778b-utq/)
垢版 |
2017/07/09(日) 20:55:59.71ID:oI2zN/et0
てかお前らそんなに一か八かでactivesheet使ってんのかよw
0182デフォルトの名無しさん (ワッチョイ bf6d-Rm1X)
垢版 |
2017/07/09(日) 21:19:51.98ID:XJb9KLmK0
これが通るけど、ウォッチ式には現れない
多分ウォッチ式の不具合だと思う
そう考えないと気持ち悪くて仕方ないし疲れてきた・・・

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Calculate
MsgBox Sh.Index
End Sub

http://stamp-uploda.com/src/file7299.jpg

>>175
sheetでもShでも見れるようになりました
Shの参照をコピーしたのでインスタンスが生成されたのかな

>>177
indexプロパティでも通りましたし
Sh.Calculateメソッドでも通りました

>>181
使ってないよ。sheetの指定はsetした変数を使ってる
昔はactive〜やselect〜を使ってたけどね
0183デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/09(日) 21:38:18.71ID:BT4+59vh0
>>182
worksheetクラスではないクラスのプロパティを指定したらどうなると予想する?

例えばRangeクラスのプロパティとか

もしかしたらサイズとかを見ていてサイズが異なる場合はキャスト出来ないかもしれないど

メモリ領域には値が格納されているけどそれをどう解釈するかはクラスが決まらないと特定できない
0186デフォルトの名無しさん (ワッチョイ bf23-KuRC)
垢版 |
2017/07/09(日) 22:03:56.91ID:e2g8wwYr0
Private Sub Workbook_NewSheet(ByVal sh As Object)
 Dim obj As Object
 Set obj = sh
 MsgBox obj.Name
End Sub

これだと中身が見られないけど通る。
やっぱり>>183の型キャスト説じゃないかなぁ。
ローカルウィンドウでも見られないし。

obj.Value = "aaa" で実行時エラーになる。
「ん〜何か知らないけどValueに入れるよ?あっねえわw」 ってことでは?

.Nameや.Range().Addressはあったんで通る。
0188デフォルトの名無しさん (ワッチョイ 9791-Razr)
垢版 |
2017/07/09(日) 22:31:30.92ID:BT4+59vh0
>>184
Debug.Print Sh.Range("a1").Address
ではなくて
Debug.print sh.address
だったらどうなるかって意図だったけど
ためしたら実行時エラーになる
これはtypename(Sh)を表示したらわかるけど
Shという変数自体にクラス(型)に関する情報を持っているから
無理矢理Rangeクラスのプロパティを表示させようとするとエラーになる

dim rng as Range
set rng = Sh
とかやっても実行時エラーになる
文法的にはエラーじゃないからコンパイルは通る

VBAが型チェックしてバグにならないようにしていると思う
他の言語だとこれができるものもある
0189デフォルトの名無しさん (ワッチョイ 9791-Razr)
垢版 |
2017/07/09(日) 22:35:23.27ID:BT4+59vh0
>>187

ShがWorksheetクラスだっていうのが判ってるからRangeを指定するってわかるけど
Objectクラスだったら何のプロパティを持っているかわからなくない?

Objectクラスはすべてのクラスのスーパークラスだから何でも参照できる
Sh as Objectと宣言されているShが実態はRangeクラスである場合もある
その場合は、Sh.Value = "a"でも実行時エラーにはならない
0190デフォルトの名無しさん (ワッチョイ bf6d-J8Ag)
垢版 |
2017/07/09(日) 22:50:14.83ID:XJb9KLmK0
>>188-189
なるほど、意図が分かりました。コンパイルエラーになる意味もわかりました、ありがとうございます

以下の状態だと、shの型はobject/Sheet5としてウォッチ式に認識されます
この「Sheet5」というのは何でしょうか?
デフォルトプロパティでしょうか?

Private Sub Workbook_NewSheet(ByVal Sh As Object)
Dim sheet As Worksheet
Set sheet = Sh
Debug.Print 1 'ここでブレークポイント
End Sub
0191デフォルトの名無しさん (ワッチョイ bf6d-J8Ag)
垢版 |
2017/07/09(日) 22:58:28.17ID:XJb9KLmK0
しかし>>175がどうしてもわかりません

object型をobject型に渡してもプロパティは分からない、それは分かります
http://stamp-uploda.com/src/file7303.jpg

object型をworksheet型に渡すと、ウォッチ式で見れるようになる、それがわからない
http://stamp-uploda.com/src/file7302.jpg
全部のプロパティ・メソッド見たら全部一致してたからworksheetとしてコピーしますね〜ということ?
0192デフォルトの名無しさん (ワッチョイ 9791-Razr)
垢版 |
2017/07/09(日) 23:03:28.23ID:BT4+59vh0
>>190
Set sheet = Sh
を実行した時点で、Sh = sheet = Worksheetクラスのオブジェクトと特定可能
なのでworksheetクラスのデフォルトプロパティを表示しているのではないか

ウォッチ式にsheet変数も追加すると、そのタイミングで
Shの他のプロパティも見えるようになった
0193デフォルトの名無しさん (ワッチョイ bf23-KuRC)
垢版 |
2017/07/09(日) 23:06:31.26ID:e2g8wwYr0
>>191
型キャストで
Shがワークシートだと判明したので
Shとsheetは同じ物なので
両方のプロパティが同じで表示されるのではと思うが。
詳しくはマスターにまかせる。

と思ったらもう回答されていた。

すごい勉強になった。
0194デフォルトの名無しさん (ワッチョイ 9791-Razr)
垢版 |
2017/07/09(日) 23:09:27.92ID:BT4+59vh0
>>191
ウォッチ式の表示更新タイミングはその内容が特定されたときに
即座に表示更新されるとは限らない
つまり表示更新されるよりもずっと前に表示すべき内容が特定されていた可能性もある
0198デフォルトの名無しさん (ササクッテロロ Spcb-9DAm)
垢版 |
2017/07/10(月) 12:47:22.77ID:8dcdQUy6p
>>197
和は加算の結果を表す言葉
0を加算とか足す0じゃないと意味が違ってくる

因みにレコードセットの型はcolumnの最初の7行分のデータから推測されるとかだったと思うから
目的の型になるようにソートすればいいかも
0207デフォルトの名無しさん (ワッチョイ bf6d-KuRC)
垢版 |
2017/07/10(月) 18:40:40.88ID:9dSXLq4x0
デフォルト値は定数式で、って言われるな

デフォルト値を文字列にして"thisworkbook"、evalで…とか考えたけど2013持ってないから試せない
そこまでしても読みにくくなるだけなので、素直に>>206みたいに条件分岐させたほうが良いと思う
0208デフォルトの名無しさん (ブーイモ MMdb-MhHl)
垢版 |
2017/07/10(月) 19:04:18.69ID:fjsjDBbbM
質問です。
ユーザーフォームをShowModal=Falseで表示しており、フォームを表示したまま、フォーカスをフォームからセルに移動することは可能でしょうか?
cells(1,1).select や application.goto cells(1,1) ではフォーカスがフォームから動きませんでした。
0210208 (ブーイモ MMdb-MhHl)
垢版 |
2017/07/10(月) 19:26:18.02ID:fjsjDBbbM
>>209
回答ありがとうございます。
後出しで申し訳ないですがバージョンは2007です。
試せるのが明日になりますが、appactivate試してみます。
0212デフォルトの名無しさん (ワッチョイ 9791-9DAm)
垢版 |
2017/07/10(月) 21:00:26.90ID:N/fNiVFC0
>>211
コンパイル時点で決まってないからかな〜
0213208 (ブーイモ MMdb-MhHl)
垢版 |
2017/07/11(火) 12:39:40.24ID:fzHCV1ljM
>>209
AppActivateもApplication.Visible=Trueでもいけました!
ちなみに以下のも試しましたが全部ダメでした。
ActiveWindow.Activate
ActiveWorkBook.Activate
ActivateSheet.Activate

2010以降だとWIN32APIとかでシートのマウスクリックを挟まないとダメかもですね。
0216デフォルトの名無しさん (ワッチョイ 9f6f-rvkC)
垢版 |
2017/07/12(水) 19:41:14.38ID:qkF1IqO80
↑誤送信すまん。

Sh As Object
Sh As Worksheet

どちらでも動くのは分かる。
Objectにするのって、
どんな値が入るかわからないから、
Variantでいいやって考えるのと同じ?
0218デフォルトの名無しさん (ワッチョイ 778b-utq/)
垢版 |
2017/07/12(水) 19:50:58.17ID:vG3FHDEt0
つっこむならせめて値と型の違いぐらい分かっていて欲しかったなあ
0221デフォルトの名無しさん (ワッチョイ bf23-KuRC)
垢版 |
2017/07/12(水) 20:10:18.44ID:agdmn3RR0
NewSheetイベントの引数の場合、Shには
「Worksheet オブジェクトまたは Chart オブジェクトが渡されます」
と書いてあるので
どっちが渡されてもいいようにObjectなのでしょう
0231デフォルトの名無しさん (ワッチョイ 778b-utq/)
垢版 |
2017/07/12(水) 21:55:54.59ID:vG3FHDEt0
She As Object
Set She = New LoveDoll
She.DressUp(MaidCostume)
She.Attach(SilliconVagina)
I.Fuck(She)
I.FinishAlone()
She.Detach(SilliconVagina)
I.Wash(SilliconVagina)
0234デフォルトの名無しさん (アークセー Sx39-y19a)
垢版 |
2017/07/13(木) 06:37:01.82ID:zrnYEEn3x
NewSheetイベントの引数ShがObject型なのは、WorkSheetクラスとChartObjectクラスの両方でNewSheetイベントの呼び出しが定義されていて、実行時にしかShの型が決まらないからだと思うが
Workbook.Sheets(Index)の戻り値がObject型なのと一緒
0236デフォルトの名無しさん (ワッチョイ 6e1b-MRQN)
垢版 |
2017/07/13(木) 13:12:36.23ID:9SrccZi40
指定日(A)から現時点(B)までの経過時間をミリ秒で取得したい場合、
どのようにしたら上手く取れるでしょうか?
VB.NETの時はGetTimeMillisecondsがあったので、(B-A).GetTimeMillisecondsで取得出来たんですが。
0238デフォルトの名無しさん (ワッチョイ 6e1b-MRQN)
垢版 |
2017/07/13(木) 13:36:43.69ID:9SrccZi40
>>237
ありがとうございます。
GetTickCountも試してはみたんですが、システム稼働してからの時間だからか
自分では上手く取得できませんでした。
「指定日」(今回やりたいのは1970/1/1)からの経過時間をミリ秒取得するには
どのようにしたら良いでしょうか?
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況