Excel VBA 質問スレ Part68

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ dbda-8BP0)
垢版 |
2020/08/30(日) 11:55:27.33ID:Oy/VxFsh0
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付ける

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

※前スレ
Excel VBA 質問スレ Part67
https://mevius.5ch.net/test/read.cgi/tech/1593104489/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
181デフォルトの名無しさん (ワッチョイ 3dad-sCec)
垢版 |
2020/09/10(木) 18:36:01.33ID:VdzBOqiR0
https://i.imgur.com/poQzyJO.jpg
これです
2020/09/10(木) 19:09:29.54ID:yo745YZ80
打ち込んだだけで実行してないからじゃね
2020/09/10(木) 19:30:20.82ID:L0+T18/AM
どこに打ち込んだかも分からないしなんとも
184デフォルトの名無しさん (ラクッペペ MM3e-Pwf7)
垢版 |
2020/09/10(木) 19:46:53.46ID:cO3BfNoWM
汚えコードだな
2020/09/10(木) 19:55:23.47ID:T9YJeJvx0
>>166
コードが汚すぎる
2020/09/10(木) 20:10:09.84ID:QatXFD490
>>181
セルの幅や高さは初期状態?
2020/09/10(木) 20:12:24.09ID:QatXFD490
あ、なんでもない
2020/09/10(木) 20:17:20.03ID:QatXFD490
普通に動いたんで入力ミスとか環境の問題かな
2020/09/10(木) 20:49:46.36ID:Rp5mNNXSd
パズルゲームを作ってます。

セルを奇数列から横2マス選択してドラッグさした場合に、移動先が同じ奇数列から始まる場所なら許可。偶数列から始まる場所に移動した場合は不可にして移動をキャンセルさせたいんですがどうしたら出来ますか?良いEVENTってあるんですかね?
2020/09/10(木) 21:52:44.31ID:WalExY5Hd
>>180
そのまま入力してちゃんと動いたから、問題文には間違いはない
https://i.imgur.com/kojc0gJ.png

それにしても学校の宿題だとしたらひどすぎるな
先生がこんなに汚いコードしか書けないとか生徒がかわいそう
2020/09/10(木) 21:54:41.31ID:WalExY5Hd
ああ最後の方に入力ミスあったわごめん
2020/09/10(木) 21:56:12.36ID:WalExY5Hd
>>189
SelectionChange
193デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/10(木) 21:56:18.66ID:a+RPoaYl0
>>181
コメント行の終わりにシングルクォーテーションが付いているのは初めて見たw

コメントというより、文字列リテラルに見えてくるw
2020/09/10(木) 21:57:24.01ID:b8lNN7jK0
>>190
こんな意図がこんなに読みづらいコード初めて見たわ
2020/09/10(木) 22:01:54.82ID:qPrgFXQ2a
>>181
先生変数宣言しないの?
2020/09/10(木) 22:06:42.97ID:YMu2GFxia
教師は必ずしもコード書いてた人じゃないししゃあないんちゃう
197デフォルトの名無しさん (ワッチョイ 668e-0TEw)
垢版 |
2020/09/10(木) 22:22:10.32ID:6Lj7sAI40
>>180
馬鹿過ぎる帰れ
2020/09/10(木) 22:28:05.12ID:WalExY5Hd
>>193
HTMLみたいにコメントが改行で終わるとは限らない言語はまれによくあるけどな
それよりもインデントの汚さと、Cellsのパラメータにx, yを使ってるあたりがめちゃくちゃ気になる
2020/09/10(木) 22:28:20.02ID:QatXFD490
Kirakira1 のコードにそっくりなのが検索で見るかるけど
そっちでは変数宣言しているw
2020/09/10(木) 22:31:17.53ID:/qwml5cpa
これか
https://my-tax-nology.com/excel-vba-animation-rnd-function-cells-glitter
>>マクロ(Excel VBA)を使えば、簡単なアニメーションを作ることができます。
>>アニメーションを作っていると楽しいだけでなく、プログラミングのスキルアップに繋がります。

なるほど??
2020/09/10(木) 22:37:08.36ID:uWh6vQvPa
エクセルVBA は当分なくならないですかね
2020/09/10(木) 22:43:44.96ID:WalExY5Hd
>>200
VBAを教えてるサイトでコメントをシングルクォートで閉じたりカッコを全角で書くやつなんて世界に一人しかいない
本人ならDimやインデントはちゃんと書くはずだし、完全にパクリだな
203デフォルトの名無しさん (ワッチョイ 3dad-IT/D)
垢版 |
2020/09/10(木) 22:59:03.63ID:VdzBOqiR0
180ですなんとかできました。ド素人なんで申し訳ない
このコードはそんなできのいいものじゃないんですか?
先生凄く威圧的でいつもそんなんもわからんのかみたいな喋り方なんすけど
2020/09/10(木) 23:10:15.32ID:8/CQSYne0
すまん
wsfやhtaでvbs書くとき 'コメント' って書くわ
エディタの色付けがjs用だから
2020/09/10(木) 23:26:05.51ID:8/CQSYne0
>>203
「なんで乱数を整数化するのにRoundを使ってしまったんですか?」って聞いてみて
206デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/10(木) 23:27:44.84ID:a+RPoaYl0
他の言語でも行コメントで見出し風にするプロはそれなりにいる。

ただ、初心者に教える人間が行コメント構文を、ブロックコメント構文と同じ使い方をするのは、初心者を混乱させるだけで、何のメリットもない。
2020/09/10(木) 23:29:02.40ID:b8lNN7jK0
>>203
なんで変数宣言しないんですか?
なんでx1とかわかりづらい命名するんですか?
なんでx1とかを上書きするようなわかりづらい変数の使い方してるんですか?
インデントの使い方に意図はありますか?
6の意味が説明されないとわからないのは不親切ですね

などなど…色々質問してみたらいいよ
2020/09/10(木) 23:31:52.10ID:ewRWdYKCd
>>203
その先生は、少なくともVBAの知識だけは大したことないことは誰が見てもわかる
ほかの言語のエキスパートでVBAをバカにする人もいるけど、人に教えるんならちゃんとしろと思う

>>199
よく見つけたな
209デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/10(木) 23:31:53.48ID:a+RPoaYl0
>>205
それもなんか見ると気になるな。コードの順番も変だし、数値の精度やデータ型をわざとヘンテコにしているのかも謎。
2020/09/10(木) 23:33:45.89ID:ATM2a6JOd
>>205
Rndの定義から考えればIntを使うのが自然だけど、まあそこは100%間違いとは言い切れないからなあ
211デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/10(木) 23:33:50.53ID:a+RPoaYl0
その先生だと6は数値ではなく数字です!
マジックナンバーって何と言いそうw
2020/09/10(木) 23:34:53.46ID:ATM2a6JOd
コードのおかしさは、その先生よりコピペ元のサイトの責任だろ
2020/09/10(木) 23:37:35.65ID:8/CQSYne0
>>212
ドコモロは黙っててくれないか
2020/09/10(木) 23:43:13.95ID:b8lNN7jK0
>>212
教える側の立場として教材として使うかどうか判断したんだから元のところに責任はねーだろ
なんか改悪もしてるし
215デフォルトの名無しさん (ワッチョイ 7dda-SnFp)
垢版 |
2020/09/10(木) 23:50:48.35ID:Q3JELDTy0
ループの外でウエイトしてたら速すぎてキラキラしないんじゃ…。
紙に書いてある方。
2020/09/10(木) 23:52:06.33ID:2cDIJpauM
>>200
こいつもかなり怪しいな
i, jを宣言してないし、変数をゼロクリアしてるのも謎
2020/09/10(木) 23:53:08.37ID:/1fuNzSOa
>>215
確かに言われてみれば
キラキラの意味
218デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/11(金) 01:20:18.01ID:66INGyZB0
>>216
本業が税理士なのに、詳しくもないことをひけらかすやつだから、税理士としてもいまひとつの癖のあるやつだと思う。
219デフォルトの名無しさん (ワッチョイ a95f-Sism)
垢版 |
2020/09/11(金) 01:22:28.25ID:66INGyZB0
>>216 彼も他人のパクリなのかもね
220デフォルトの名無しさん (ワントンキン MM7a-nV8z)
垢版 |
2020/09/11(金) 01:27:34.96ID:iTcJm+RBM
ゆとり世代の馬鹿に教えるゆとりかよ
2020/09/11(金) 08:33:42.89ID:L6SxevYWd
>>146
そいつはバグだと思うよ。
Mougで質問してた人がいて、俺も試したけどTreeViewでのD&Dで座標がバグってる。

で、15ってのはそのバグを何とか実情に合わせたものだと思う。
俺もその時似たようなことやって15っていう数字には覚えがある。
2020/09/11(金) 09:37:00.89ID:mn04Qg6+M
>>221
>>146 です。色々調べた結果、TreeViewのMouseMoveやMouseDownのイベントで渡される座標が他のフォームとは異なりピクセルで渡される事が原因でした。
なのでGetDesktopWindow,GetDC,GetDeviceCapを用いてDPIを取得し、
取得した値で1440(1440twips=1Inch)を割り、
その値をピクセル数に掛ける事でポイントでの換算に成功しました。
標準の設定ですとDPIが96になるそうなので1440/96で15、となるようです。
2020/09/11(金) 16:13:39.65ID:qEgHhc430
VB6だとScreen.TwipsPerPixelXってあったんだがなあ

VBAだとPointsToScreenPixelsXとかあるなと思ってみてみたけど、これ、つねに72DPIで計算するっぽいな
2020/09/11(金) 18:44:31.89ID:+9zmYtvxd
>>192
それだと1回めの選択範囲で動いて、移動したら動きますよね?
1回目の行や列を記憶させて2回目で比較する感じですか?
2020/09/11(金) 22:11:41.98ID:L6SxevYWd
>>222
>>223
うん、その辺みんな知ってるけどTreeViewの問題って違ってたと思うんだが。
226デフォルトの名無しさん (ワッチョイ 7910-lSnV)
垢版 |
2020/09/12(土) 08:12:41.83ID:cGm6fMBf0
動的配列に値を追加していきたいのですが要素番号を0ではなく1から始める方法はありませんか?
2020/09/12(土) 08:24:59.90ID:OyGZa+nz0
Sub testtttt()
Dim arr() As Variant

ReDim arr(1 To 1)
arr(1) = 10
ReDim Preserve arr(1 To 2)
arr(2) = 20
ReDim Preserve arr(1 To 3)
arr(3) = 30

MsgBox arr(1) & " " & arr(2) & " " & arr(3)
End Sub

ちょっとはぐぐれよな
https://www.relief.jp/docs/excel-vba-shift-array-index-to-1-start.html
2020/09/12(土) 08:28:00.30ID:FkIM4E0+M
『[ VBA ]「Option Base 1」使うなよな!反論は聞かない!』
2020/09/12(土) 15:06:14.92ID:X8G1U5XY0
アレイリスト使うほうがかんたんじゃね?
2020/09/12(土) 20:26:44.99ID:+6u/uPRn0
先頭を1にするのはセンスないね
2020/09/14(月) 18:06:26.03ID:YLQY1Qz5r
i++とか+=使えないのマジで不便だな
前置インクリメントもできないし一行でもend ifとかloop書かなきゃいかんしめんどくさくね?
この言語もうちょい進化しないの?
2020/09/14(月) 18:10:50.73ID:CnoY9xmOM
1行でEnd If書きたくないならThenの後に半角スペースいれたら改行しないで処理書いてみ

++とかは禿同
2020/09/14(月) 18:13:56.53ID:YLQY1Qz5r
>>232
おおこんなことが、、、
ありがとう!
234デフォルトの名無しさん (ワッチョイ 668e-0TEw)
垢版 |
2020/09/14(月) 18:15:50.60ID:LbAMjRkX0
>>231
馬鹿は死ねよ
235デフォルトの名無しさん (ワッチョイ 7910-lSnV)
垢版 |
2020/09/14(月) 19:51:50.83ID:ZpzZ2vr50
ガイジ君ブチ切れw
2020/09/14(月) 19:57:09.34ID:lPVfhwtb0
ざわ・・ざわ・・
237デフォルトの名無しさん (ワッチョイ 668e-0TEw)
垢版 |
2020/09/14(月) 20:46:20.36ID:LbAMjRkX0
+=使えるだろうが
2020/09/14(月) 20:54:32.80ID:P2Bbq2Qk0
使えません
239デフォルトの名無しさん (ワッチョイ 668e-0TEw)
垢版 |
2020/09/14(月) 20:56:59.34ID:LbAMjRkX0
あー、VB.Netスレだと思ってた。スマン、死んでくる。
2020/09/14(月) 21:01:00.11ID:P2Bbq2Qk0
逝かないで
2020/09/14(月) 21:01:06.64ID:K/D9SivKp
制御構造は、キーワードの選び方がやや独特だけど、基本的なものについては、概ね他の言語と同等のことはできると思う。
どちらかというと、変数の宣言・定義が一緒にできないとか、配列・コレクションの要素参照が角括弧でなく丸括弧だとか、プロシージャ呼び出しの丸括弧の要否とかの方が不便さを感じるかな。まぁ、これらも慣れと言われればそれまでだが。
2020/09/14(月) 22:06:22.62ID:9LhT2bwK0
gotoとラベルでできるっちゃあできるけどcontinueとbreakが欲しい
2020/09/14(月) 22:20:37.59ID:8aASiVNY0
breakは、一応Exit 〜が概ね対応しているのでは(While〜Wendでは使えないけど)?
脱出するループを明示的に指定するので、breakより便利な場合もごくたまにある。もっとも、二重のForループから抜ける場合などは結局GoToに頼ることになるので中途半端ではあるけど。
2020/09/14(月) 23:27:12.72ID:EMg7ooaX0
俺もたまにラベルでcontinueするけどめちゃくちゃ見栄え悪くて嫌
2020/09/15(火) 08:35:58.25ID:Ny+/GOwEd
>>232
>>233
基本、それは使わないな。
読みやすさとか構造の分かり易さ優先。
勿論、時と場合による。
2020/09/15(火) 09:16:48.30ID:Ty4jOAMY0
ユーザーフォームの2つリストボックスで選択された値を変数に代入する方法を教えてください

■Module1
Public str As String

■ThisWorkbook
Sub tes1()

UserForm1.Show vbModeless
Range("A1").Value = str
End Sub

Sub tes2()
Range("A2").Value = str
End Sub
2020/09/15(火) 09:17:03.49ID:Ty4jOAMY0
■UserForm1
Private Sub UserForm_Initialize()
Dim r As Long
For r = Year(Date) - 1 To Year(Date) + 2
UserForm1.ListBox1.AddItem r & "年"
Next r
For r = 1 To 12
UserForm1.ListBox2.AddItem r & "月"
Next r
UserForm1.Show vbModeless
End Sub

Private Sub OKbtn_Click()
str = Replace(UserForm1.ListBox1.Text, "年", "") & "_" & Replace(UserForm1.ListBox2.Text, "月", "")
Unload UserForm1
End Sub

テストで変数strをA1・A2に入れたいのですが、この方法だとどちらも入りません。
2020/09/15(火) 09:33:07.65ID:q5KWnXWXM
ボタン押してstrに代入するところModule1.strじゃないとダメなんじゃないの
2020/09/15(火) 09:45:50.10ID:Ty4jOAMY0
>>248
試しましたがだめでした

追記
ブックを開いたまま、tes1を2回目に実行するとA1には書き込みますが、
ブックを開いて、1回目のtes1実行ではA1には書き込まれないようです。
2020/09/15(火) 09:57:04.92ID:q5KWnXWXM
モードレスだから
ボタン押した時にUnload UserForm1する前にModule1.tes2を呼び出さないとだ

Sub tes1()
UserForm1.Show vbModeless
End Sub

Sub tes2()
Range("A1").Value = str
Range("A2").Value = str
End Sub
2020/09/15(火) 11:27:58.65ID:Ty4jOAMY0
>>250
ありがとうございました。解決しました
2020/09/15(火) 18:56:31.81ID:Nzz3069/0
AccessVBAを使用しているのですが、標準モジュールを変数に格納する方法がわかりません。
フォームコントロールの様に変数に入れて扱う方法はありませんでしょうか。
253デフォルトの名無しさん (ワッチョイ 6de5-Pwf7)
垢版 |
2020/09/15(火) 19:29:57.34ID:pZ4d9dfu0
ありません
254デフォルトの名無しさん (ワッチョイ 97da-GUw/)
垢版 |
2020/09/16(水) 00:02:05.57ID:chmz5kZM0
Sub test()
MsgBox Me.TextBox1.Value
Me.Name="a"
Me.Name="Sheet1"
End Sub

1回目の実行 OK
2回目の実行 MsgBoxでエラー
3回目の実行 OK
4回目の実行 MsgBoxでエラー

なんでやねん!
2020/09/16(水) 01:13:07.34ID:fUx+IXsk0
>>254
F8 でステップ実行してみ、あとエラーの内容くらい書いてもよくね?
2020/09/16(水) 10:04:16.38ID:HoY0/Pv80
>>253
ありがとうございます。
フォームを格納できるなら標準モジュールも出来るのかと思って質問しました。
標準モジュール内に書かれた関数の引数として参照先の標準モジュールを渡したかったのですが、別の方法を考えてみます。
2020/09/16(水) 18:43:38.23ID:DJD3HHCL0
動画ファイル(拡張子 mp4,avi等々)の長さ(時間)をvbaで得ること出来ませんかね。
動画用のプログラムでは出ているから何らか手段はあると思うのだけど。
2020/09/16(水) 19:23:25.54ID:u7LyhgECM
>>257
できる
はい、次
2020/09/16(水) 19:55:21.82ID:KOE6L/fW0
>>257
拾い物、動くかどうかは知らん

Sub ボタン1_Click()
Dim Shell, Folder
Set Shell = CreateObject("Shell.Application")
Set Folder = Shell.Namespace(Range("A1").Value)
Fil = Dir(Range("a1").Value & "\*.*")
Rows("5:65536").ClearComments
i = 5
Do While Fil <> ""
For j = 0 To 40
Cells(i, j + 1).Value = Folder.GetDetailsOf(Folder.ParseName(Fil), j)
Next
i = i + 1
Fil = Dir()
Loop
Set Folder = Nothing
Set Shell = Nothing
End Sub
2020/09/16(水) 20:18:38.96ID:pG4LN1Ne0
手を抜くんじゃない!
まじめにヘッダー読み込んで解析しろよ
2020/09/16(水) 20:21:47.41ID:0zA9ovKo0
ファイルのプロパティからは取れない場合もあるよ
2020/09/16(水) 21:31:45.86ID:chmz5kZM0
>>255
今環境ないんだけど、
アプリケーションの定義何とかか、
インデックス何とかか、
オートメーション何とかのどれか。
何か変なものがSetされちゃってるのかと思ったけど、
MeじゃMeしかないよね?
2020/09/16(水) 22:10:00.45ID:jvSIB85Td
>>260
昔、解析したことがある。
aviとかは割と簡単だね。
2020/09/16(水) 23:12:03.30ID:dsrVDQ5Z0
すごく初歩的な質問ですみません

&演算子で文字列と数字をつないで文字列を作った時に
出来上がった文字列に""を付けなくていいのはなぜなのですか?

MsgBox "あいうえお" は""を付ける必要がある
MsgBox "A" & hoge は文字列扱いのはずなのに""を付けて MsgBox ""A" & hoge"のようにしなくていいのが解せません
2020/09/16(水) 23:23:17.92ID:0zA9ovKo0
&とhogeは文字列ではなく演算子と変数
2020/09/16(水) 23:24:34.57ID:0zA9ovKo0
""で囲ったら演算子でも変数でもないただの& hogeという文字列にしかならない
2020/09/16(水) 23:48:53.36ID:dsrVDQ5Z0
ありがとうございます

>""で囲ったら演算子でも変数でもないただの& hogeという文字列にしかならない
なるほど確かにです

では、&演算子でつなぐと文字列扱いになるという認識が間違っているのでしょうか?
それとも文字列扱いにはなるけど上記の理由から外すことになっているという感じでしょうか?
2020/09/17(木) 00:09:43.18ID:pIQJoJyT0
>>267
その場合、
hogeは文字列として認識してください
という命令を出している
つまり
文字列(”A”) と(&) 文字列(hogeという変数に入っている文字列) を繋ぎ合わせて表示してください
というのが”A” & hoge
2020/09/17(木) 00:09:48.11ID:MJVBSNKC0
ダブルクォートには引数の囲むような意味はない
引数を囲む記号は丸括弧になる
たとえば X = msgbox("a" & hoge) みたいな書き方になる
返り値をとらない場合は()が省略可能ってだけ
2020/09/17(木) 00:11:18.08ID:D84tTl8o0
リテラルと変数について調べると理解できるかも
2020/09/17(木) 00:13:09.47ID:ncMNPksn0
>>267
hoteの型は何なんだ
2020/09/17(木) 00:21:16.12ID:0EHVBisp0
値に型ってのがあるのを理解しよう
表示したいのは、"A"という値と変数hogeの値(を連結したもの)だろ

&演算子でつなぐと文字列扱いになるってのは、演算対象を文字列に変換して結合するってこと
この場合、hogeの値が文字列以外でも文字列に変換して評価するってことだ

基本を理解したいなら、なんの説明もなく&でつなぐと文字列扱いとかいう教え方するところは避けたほうが良いかな
とりあえず動けばいいってならまあすきにすればいいけど
2020/09/17(木) 02:20:25.53ID:c2bYLY/G0
MsgBoxの第1引数は文字列型の値である必要があり、文字列型の値を表す式として典型的なのは、@文字列リテラルか、A文字列型の値が格納されている変数(文字列型変数)の参照。二重引用符は、文字列リテラルの表記方法に過ぎない。
&演算子は、本来、2つの文字列型の値を被演算数とする演算子だが、被演算数が文字列型の値と数値型の値であるような場合等は、適宜数値の方を文字列型の値に自動変換した上で本来の演算を行う……ということかと。重複になるが。
2020/09/17(木) 04:55:16.59ID:PzgKRL2g0
数値を文字に変換するなら CSTR がある
2020/09/17(木) 07:47:55.65ID:iixTl117d
>>267
法則を暗記するからそうなる。
法則の仕組みを覚えるんだ。
2020/09/17(木) 11:44:40.11ID:1/N+zsdG0
同じフォルダにある"〇〇"というCSVを開いて、そのシートの最終行を取得したいのですが
「インデックスが有効範囲にありません」というメッセージでとまります

Sub salegrp()
Workbooks.Open ThisWorkbook.Path & "\〇〇", ReadOnly:=False
MsgBox Sheets("〇〇").Cells(Rows.Count, 1).End(xlUp).Row
End Sub

他のブックの最終行を表示する方法を教えてください
(A列には最終行まで値が入っています)
2020/09/17(木) 11:54:47.91ID:DZPRMbPmM
csv開いたてからActiveWork ook.ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Rowすれば
2020/09/17(木) 12:14:37.64ID:qGYgSA/Y0
>>276
必要なのは最終行に入ってるデータの内容?行数を知りたいだけ?
全データをワークシートに入れる必要がなければテキストファイルとして開いた方が早いかも
279デフォルトの名無しさん (ラクッペペ MM8f-gT2D)
垢版 |
2020/09/17(木) 12:24:52.75ID:D1QZID39M
Workbooks.Openの返り値をとってそれを操作する

なおRows.Countも省略せずにシート指定する
2020/09/17(木) 13:03:15.94ID:1/N+zsdG0
>>277
できました。
■ このスレッドは過去ログ倉庫に格納されています