Excel VBA 質問スレ Part59

■ このスレッドは過去ログ倉庫に格納されています
2019/02/09(土) 15:12:30.70ID:3lTArmdf0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512

ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part58
https://mevius.5ch.net/test/read.cgi/tech/1542577644/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
483デフォルトの名無しさん (ワッチョイ 6a7c-RjxB)
垢版 |
2019/02/25(月) 22:06:28.97ID:U7AKD+aj0
フォームに張り付けたMediaPlayerプレイヤーのコントロールのプロパティが勝手に変わる謎のエラーが頻発。
どうもフォームのサイズを変更するAPIがイタズラしているらしい。
こまかく切っていってようやくまさかの原因が解ったが対処方法わからずに対処療法してしまったがそれでも半日あまりを費やした。
よくわからないサンプルコード使うと謎のエラーが出てハマることを覚えた。
プログラマーってすごいな、これ毎日やってたらほんと禿げるわ。
2019/02/25(月) 22:14:43.73ID:RXoXH9qp0
>>483
>よくわからないサンプルコード使うと謎のエラーが出てハマることを覚えた。
これやると一番時間を無駄にする
・サンプルコードをざっと眺めて全体の流れを把握
・APIの仕様をしっかり読む
・一からテストコードを書く
・APIもう一回読み直しながら、もう少し詳細に作り直し
・本番環境で書く

こんな感じ。仕様を把握してから書いたほうが絶対に早い
2019/02/25(月) 22:46:07.98ID:TP8zPbuZ0
>>448
オーバーロードってあったっけ?それに、ジェネリクスがないから全部の定義されてる型について生成しなきゃいけないから地獄なんだよ!リテラルで配列を生成できたらいちいちDimしなくてもいい
2019/02/25(月) 22:51:30.74ID:TP8zPbuZ0
ちなみに、望むシグニチャーはこんな感じ
' T = Generic
Public Function ArrayOf(/* vararg */ element As T) As Array<T>
どうせVBAは浮世離れしすぎてて書けないけどな!
2019/02/25(月) 23:00:26.05ID:F8HPsJ9/0
ジェネリックはないがヴァリアント型つかえば良いのだよ

無いものねだりしてもしょうがない
問題解決のためにあるものを使うだけ
2019/02/26(火) 06:28:56.69ID:QryMFy3y0
>>429
これ。面白いな。試していないが、頭から見て行ってまずForが出て来るのにForがないって言われるの?w

VBAも構文を修正するのはいろいろと問題があるだろうけど、こういうペリフェラルな部分では改良できるところは
いくらでも残ってるよねえ
2019/02/26(火) 06:39:06.54ID:QryMFy3y0
構文チェックくらいなら、どっかサードパーティが作ってアドオンとか出来ないのかな
xlsファイルの中からプログラム文ってテキスト抽出って出来ないんだっけ
2019/02/26(火) 06:56:12.34ID:Dl2cSn2NM
>>488
If〜Thenでブロック作るからNext出て来たらForがないと見なされる
C言語とかはEnd IfとNextの両方が } なので発生しないけどイメージとしては
for(i = 0; i <= 10; i++)
 if(true){
next
 }
みたいな感じになってる
2019/02/26(火) 07:22:50.54ID:Dl2cSn2NM
>>489
やれるやれないという意味ならやれる
そもそも*.basとか*.clsとかにエクスポートしたらテキストファイルだし
セキュリティの設定はいるけどCOM経由ならそんなに難しくない
ただ>>429みたいなケースでわかりやすいメッセージを出すのは思ったより難しい
2019/02/26(火) 07:28:56.02ID:wxY2HVgtM
>>487の言うとおりだ
生成もジェネリックに出来ないが使う方の関数だってジェネリックは出来ない。
つまりVariant を避けてると型別定義地獄になるって事だ
2019/02/26(火) 12:32:40.78ID:5MxkS3P70
>>476-482
wget は簡易クローラーだから、これで複数ページをダウンロードすれば?
その後、vba で処理すれば?

まあ、適度に時間をおきながら、アクセスしなよ。
頻繁にアクセスすると、営業妨害で逮捕されるかも
2019/02/26(火) 17:27:28.56ID:8+gQOZAja
win10(64bit)にoffice2013(32)入れたら動作おかしくなったので
新しいoffice買ってきた
2019/02/26(火) 21:19:16.14ID:bIfQynSTx
bitsadmin.exeやPowerShellを使う手もあるな
2019/02/26(火) 21:29:55.31ID:7VOH1icT0
Variantか…型安全をぶち壊してる気がするけど…
2019/02/26(火) 21:52:08.87ID:3hFiWozk0
>>496
いいんだよ

型安全な汎用プログラムを書けない時点で、個別のプログラムを型安全にする気は失せるというものだ
2019/02/26(火) 21:57:39.80ID:tGZ/aMnha
>>493
有料のRPAツールを使ってもダメなんでしょうか?
2019/02/26(火) 23:46:14.88ID:VNg9bOSA0
暗黙の型変換が拡大縮小の両方に効く時点で型安全なんてあり得ないわけで
2019/02/27(水) 03:06:02.10ID:s/3R2a1B0
vbaで型安全ってなんのギャグだよ

Sub foo()
Dim bar As Long
bar = 1 & "0"
msgbox bar
End Sub
2019/02/27(水) 06:45:27.86ID:OKB4dgT5x
>>500
これって 1 & "0" のところが 1 + 0 と評価されて出力が 1 になるのか?
502デフォルトの名無しさん (JP 0H2e-eSdf)
垢版 |
2019/02/27(水) 09:24:25.27ID:94mgNWr4H
数値を“”で括って連結させるって普通はやらないよな
もはやクレーマーの域
2019/02/27(水) 09:27:38.25ID:ev0DPtJU0
>>501
ならない。

---------------------------
Microsoft Excel
---------------------------
10
---------------------------
OK
---------------------------
2019/02/27(水) 10:08:05.65ID:TCTVEEoa0
>>502
アホはお前
505デフォルトの名無しさん (JP 0H2e-eSdf)
垢版 |
2019/02/27(水) 10:14:24.05ID:94mgNWr4H
>>504
自己紹介かな?
2019/02/27(水) 10:21:18.29ID:TCTVEEoa0
>>505
本当、馬鹿は食いつきがいいな。エラーも起こさずに動くのが問題なんだよ。
馬鹿には難しいか?
2019/02/27(水) 10:48:04.11ID:hD6s3+cfM
&演算子が勝手に文字列に変換するのは利便性考えたらわかるし
Long型の変数に文字列代入する時に暗黙のキャストするのもわからなくはない

けど警告ぐらいは出してほしいね
508デフォルトの名無しさん (JP 0H2e-eSdf)
垢版 |
2019/02/27(水) 10:48:12.18ID:94mgNWr4H
>>506
それはエラーであってほしいというお前の願望だろ
2019/02/27(水) 11:32:27.96ID:WN1Wln/+0
VBAにも当然、厳密な構文ルールは存在するだろう

数字 & 文字列は文字列にするってのがルールじゃね。 一度覚えたらそれでいい
2019/02/27(水) 11:45:10.68ID:K1qNq431M
& が + に解釈されたらたまったもんじゃない
2019/02/27(水) 12:38:47.93ID:JcvtiT+vd
>>497
Variantは意識して使う。
型安全も意識する。
当然、暗黙の型変換でどうなるのかも意識して組んでいれば、そうそう問題になることもあるまい。
2019/02/27(水) 12:41:38.23ID:JcvtiT+vd
どんな言語でもツボは有るわけでね。
押さえてコードを書けない奴がアホなだけだろ。

初めて触った初心者じゃあるまいし警告なんて全く必要無い。
2019/02/27(水) 13:03:51.61ID:aJqXXkY2d
>>509
代入先が数値だろ
2019/02/27(水) 13:08:23.01ID:OA+HeXxoM
同じマクロを使っている複数の文書があって、マクロの一部を修正したいんですが、
別ファイルのモジュール内の変更を行うマクロは VBA を使って書けますか?

または、別ファイルのモジュールを削除(開放)してインポートする形でも構いません。

実際はワードでやりたいことですがワードVBAスレがなさそうなのでこちらで質問しました。
Normal を書き換えて対応するというのはできない前提です。
2019/02/27(水) 13:17:59.19ID:aJqXXkY2d
>>514
スレ一覧よく見てみろ。そういういい加減で他人にすぐ聞くからできないことだらけなんだよ。
2019/02/27(水) 13:19:02.81ID:K1qNq431M
ByRef x As Variant
517デフォルトの名無しさん (JP 0H2e-eSdf)
垢版 |
2019/02/27(水) 13:19:50.19ID:94mgNWr4H
>>514
書けるよ
2019/02/27(水) 14:41:22.10ID:+oDGw9vfM
>>503
Option Explicit付けてもエラーにならないのかな?
2019/02/27(水) 15:47:12.82ID:WN1Wln/+0
>>510
お前は何を言ってるんだ?
& は文字の連結子だろ。 だから、文字としての1と0を連結したんだよ
>>513
代入先は数値だな。 文字処理をしてそれがVariantだからそれから数値変換したんだな
文字処理が優先なんだろ
2019/02/27(水) 15:48:15.94ID:WN1Wln/+0
>それがVariantだから
すまん。これはなし

まあ変な構文ではある
2019/02/27(水) 16:29:49.69ID:K1qNq431M
>>519
だから連結じゃなく加算と解釈されたらたまったもんじゃない
と言っている
2019/02/27(水) 17:58:08.46ID:HrTieKXOM
>>507
& 演算子は文字列同士の連結だから
2 & 1 ⇒ "21"
"2" & 1 ⇒ "21"
2 & "1" ⇒ "21"
"2" & "1" ⇒ "21"
になる
逆に - 演算子は数値同士の引き算だから
2 - 1 ⇒ 1
"2" - 1 ⇒ 1
2 - "1" ⇒ 1
"2" & "1" ⇒ 1
になる
問題は + 演算子で普通は数値の足し算なんだけど両辺が文字列の時は文字列連結になるので
2 + 1 ⇒ 3
"2" + 1 ⇒ 3
2 + "1" ⇒ 3
"2" + "1" ⇒ "21"
になる
なのでVariant使っててA + Bとかやってると両方が文字列の時にはあ?ってなことになったりする
2019/02/27(水) 18:25:55.24ID:hD6s3+cfM
>>522
>"2" + "1" ⇒ "21"
&、-と合わせて考えるとめちゃくちゃ気持ち悪いなこれ
2019/02/27(水) 18:25:56.15ID:U+okKr8Fa
出力する時以外に文字列と他の型を演算させる需要ってあるか?
すごい変なプログラム書いてそう
2019/02/27(水) 18:31:15.76ID:hD6s3+cfM
>>524
Cells(1,1) + Cells(1,2)
とか気軽に書いて文字列セルなのに気づかず発狂するがいい
2019/02/27(水) 18:45:49.28ID:U+okKr8Fa
>>525
セルの値同士の計算をダイレクトにやろうとする発想にまず疑問を感じる
2019/02/27(水) 18:48:38.08ID:JcvtiT+vd
だから、型を意識してコード書かない奴は駄目なんだ。
あと、Cells(1,1) + Cells(1,2)じゃなくて、Cells(1,1).Value + Cells(1,2).Valueとすべき。
2019/02/27(水) 18:53:54.71ID:sssEi30aM
>>524
セル値が16進で、その値で計算させるとかかな。
昔はよく使ってたが、最近は使わなくなったな…
2019/02/27(水) 19:19:30.96ID:s/3R2a1B0
>>527
いや、そこじゃない
cellsのデフォルトプロパティがvalueな事ぐらい皆分かっている
valueの型がヤバイんだ
2019/02/27(水) 19:31:13.45ID:zqU1UpTE0
>>527
> だから、型を意識してコード書かない奴は駄目なんだ。
そんなのわかってるからいちいちマウント取りに来なくていいよ
世の中には変数宣言すらしないやつとかもいるし使い捨てコードとかもある
2019/02/27(水) 19:35:36.50ID:kQabADAE0
本当によくできたプログラムっていうのは変数がどんどん減っていくものだよ
2019/02/27(水) 19:49:19.80ID:J+jPuAvg0
やっぱVBAってクソだわ
2019/02/27(水) 19:52:19.85ID:Vhp/GCq70
>>532
と罵りたいだけが為にここに来るんだろ?  プ
2019/02/27(水) 20:02:27.43ID:J+jPuAvg0
やっぱVBAスレってクソだわ
535デフォルトの名無しさん (ワッチョイ 89c5-T+SP)
垢版 |
2019/02/27(水) 20:17:03.40ID:INBREE+00
クソレスすんなプロさん
2019/02/27(水) 21:22:24.52ID:rA0fzWNE0
>>531
デバッグはやりづらくなるけどな
2019/02/27(水) 21:48:46.20ID:WN1Wln/+0
まあやっぱり、1 & "0" とか  "2" + 1
とかが出てきたら、エラーで落とすのが普通だろうなあ
で、プログラマはそこで、Val関数で数値にするとか逆に文字列にするとか
やっぱり型変換、確認をプログラムの中に入れながら作るのが本来の筋だと思うわ
そもそもの構文を変えないのであればね
2019/02/27(水) 22:04:09.28ID:6/kMoeDHa
どうでもいいよ
所詮VBAだし
2019/02/27(水) 23:43:00.80ID:APPBNRQYM
>>538
そういうこと
540デフォルトの名無しさん (ワッチョイ 1feb-IBRN)
垢版 |
2019/02/28(木) 00:41:55.86ID:ULaFt4eB0
質問です。お願いします。

public sub shuukei()
'集計してシートに書き出してそそのシートのコピーを別ファイルとして保存
end sub

こういうコードを作りましたが、少しでも速く処理されるようにもっと工夫したいと思っています。
そこで、少し書き直しては速度に変化があるか確認したいのですが、コードの実行速度を
測る方法がわかりません。教えていただけないでしょうか?

public sub jikantest()
  '計測スタート
  call shuukei
  '計測終り
  msgbox かかった時間
end sub


こんな感じでいちいち確認したいです。
2019/02/28(木) 00:46:39.13ID:3O1mZe4/0
>>540
dim st as single, ed as single
st = timer
(処理)
ed = timer
debug.print ed - st & "sec"

いつもこんな感じでやってる。
2019/02/28(木) 00:47:31.02ID:CZa6uBrL0
Debug.Print Now でもしとけ
2019/02/28(木) 00:51:18.30ID:ULaFt4eB0
>>541
ありがとうございました!
2019/02/28(木) 01:23:05.26ID:8R6HTxA70
変数の型はトレースの時だけでもシンタックスハイライトして欲しい。
それか左辺に合うように強制キャストで。
2019/02/28(木) 02:06:55.62ID:u4sOxAKE0
>>540
早くなってもわかりにくいのはやんない方がいいぞ
546デフォルトの名無しさん (ワッチョイ 1feb-IBRN)
垢版 |
2019/02/28(木) 06:51:30.57ID:ULaFt4eB0
お恥ずかしい質問ですが、もうひとつお願いします。

私は、変数の中身でもなんでも、とにかく確認したいときはmsgboxを使うんです。
そのほうが楽だし。

でも、こういう場所で回答するような人のほとんどは、>>541-542さんのように、
debug.なんとか ってのを使いますよね?
よくわからないけど、debugって、msgboxとは違って、どこかのウィンドウに表示させるってことだけ
は知っています。
そして、msgboxよりも、そっちの方がなんとなく本格派っぽいことも感じてます。

みなさん、どうしてmsgboxよりそっちを使うんですか?本当にそっちが便利なんですか?
547デフォルトの名無しさん (ワッチョイ 9701-j5yB)
垢版 |
2019/02/28(木) 06:56:12.35ID:PI/gJuny0
>>546
msgboxだと毎回画面が出ちゃうから
2019/02/28(木) 07:04:09.83ID:TTqJ1VR80
Debugって俺も使ったことないんだが、過去何行くらいまで遡れるの?
それとその結果ってファイルに出力できる?
2019/02/28(木) 07:09:57.92ID:syDDbQ630
自分はstopとローカウルィンドウ派だな
2019/02/28(木) 07:10:06.15ID:3O1mZe4/0
>>546
OK押すのメンドいし、押したら消えるし。
Printならイミディエイトウィンドウにどんどん溜まっていくから比較しやすいし。
VBE上でCtrl+Gで呼び出せる。
コード書くときは常に表示してるな。
他にもいろいろ便利に使えるからGGってみて。
2019/02/28(木) 07:28:40.77ID:/X5EyKzha
debug.printなら開発画面を見ない他の使用者が
気付かないで済む
2019/02/28(木) 08:31:53.34ID:3CdGs56rM
>>540
ちょっと本格的にやるなら…
https://blogs.yahoo.co.jp/yangzh_jp/26557113.html
注意!
中にも書いてあるけど使用時にコードを改変するから使うならバックアップはちゃんと取ること
2019/02/28(木) 12:28:10.25ID:wbPQJw42d
>>531
そうとも限らない。
速度の為に変数増やすこともあるから
2019/02/28(木) 12:32:41.06ID:wbPQJw42d
>>548
そんなに大量には残らないね。
1000行くらいか?
大量に残したいときは普通テキストファイルに書き出すだろ。
2019/02/28(木) 12:33:37.47ID:qWkUq+5ha
>>553
まああくまで傾向だな
システム開発に絶対はないから大まかに語るしかない

しかしまあプログラマって柔軟性がないから何か意見を言ったら必ず特殊な状況を想定して反論しようとする人が出てきて面倒くさいな
556デフォルトの名無しさん (JP 0H4f-j5yB)
垢版 |
2019/02/28(木) 13:23:20.67ID:qor22oN3H
柔軟性がある人は出世するからね
2019/02/28(木) 13:59:45.70ID:TjDXn6TQM
>>555
後々のテスト工程考えてるからじゃない?
そこまで考慮しなくても…となる気持ちは分かる
2019/02/28(木) 14:20:36.03ID:x4ZPjfd7M
考慮すべき場面とするべきでない、しても意味がない場面の判断ができないとも言える
559デフォルトの名無しさん (JP 0H4f-j5yB)
垢版 |
2019/02/28(木) 14:36:57.48ID:qor22oN3H
だから日本は開発が遅いんだよ
アジャイルでやれ
2019/02/28(木) 14:57:38.31ID:7AaSmpPf0
想定される状況なんか結局は本人にしか分からないし、説明すんのもめんどくさい
まあ本人が気付いてないこともあるけど
2019/02/28(木) 17:57:19.76ID:3CdGs56rM
>>555
決めつけで語って指摘されたら逆ギレかよ w
2019/02/28(木) 18:42:40.55ID:jqfgz8pY0
ーーここまで型変換関数なしーー

身内が意味がわかるっていうなら変換関数抜きにしてもいいかもしれない、けどコンテキスト的に関数噛ませたい
2019/02/28(木) 18:45:13.08ID:OctLDBwCx
Debug.Assertも割とよく使う
2019/02/28(木) 21:21:18.29ID:7AaSmpPf0
Variant使わなきゃいい
2019/02/28(木) 22:12:12.40ID:TWIU4lxdM
>>564
いやいやいやいや
ByRef As Variant
の意味論がわかってないだろ
2019/02/28(木) 23:20:59.71ID:JVzuLoidx
Variant型がないとそれはそれで不便
実行時にならないと変数の保持データの参照型やデータ構造が決定できないような関数を定義するときには必須
Object型では限界があるし、多態性とか考えたら特に
2019/03/01(金) 00:53:35.24ID:oijdm3qva
VBAにもInterfaceがあるの知らない人かな
2019/03/01(金) 08:24:19.03ID:KSyELWIpd
だから意識して使うぶんには良いんだよ。
Variant配列で高速化は良くやるだろ。
あるいはあえていろんな型を受け付ける関数を作る場合とか。

俺はInteraceはあまり使わんね。
同じプロパティを持ったクラスを複数作ってグループとして使う場合でもそこまでしなくて良いだろと考える。
2019/03/01(金) 08:58:16.79ID:IB7Yh9y1a
プログラムの基本的な良い習慣を実践すればVariantなんてそう使うことはない
使うとしてもシートIOなど僅かな用途だけだから業務ロジックまで影響することはまずない
570デフォルトの名無しさん (ワッチョイ 9f90-W5e4)
垢版 |
2019/03/01(金) 09:03:46.13ID:BWIoX5Sk0
プロ雑談者どものくだらん蘊蓄語り合いなんぞどうでも良いから質問者の方々は
遠慮なさらずにどうぞ〜
2019/03/01(金) 12:55:03.48ID:3XNO5Z9qM
コードって色々書く場所あると思うんですけど、ある程度共通の切り分けってあるんですか?
フォームにはあまりややこしいものはかかないで標準モジュールを使うとか。
逆にフォームで書けるものは複雑でもそこで終わらせたほうがいいとか。
今迷ってるのはシート1のデータを加工してシート2のデータにマージさせる場合どこに書けばいいんだろうってことです。
そのシートごとに別けるとバラけて解りにくくなるしみたいな感じです。
2019/03/01(金) 13:04:09.15ID:SCR8DJeBM
所詮VBAだしどうでもいいよ
VBAの可読性・保守性を高める唯一の指針があるとしたら、極力VBAを書かないでワークシートの機能を活用することかな
573デフォルトの名無しさん (JP 0H4f-j5yB)
垢版 |
2019/03/01(金) 13:26:59.89ID:HgS5037SH
>>571
標準モジュールに Sub MergeSheet1To2 とか作ってCallすれば、他人が処理部を見なくても「このボタンを押すとマージされるんだなぁ」と想像ができる。
自分はフォーム内は処理に使うデータのチェックくらいにしてる。
2019/03/01(金) 14:04:11.91ID:+h/xS+gL0
フォームモジュールって細々としたイベントのプロシージャであふれちゃって見にくい
だからできるだけ標準モジュールに切り分けてる
例えばフォーム上の複数のTextBoxに全く同じ入力規則を設けたい時なんかは
TextBox・KeyCode・Shiftを引数とするプロシージャを標準モジュールに書いて使い回ししてる
さっきもそういうの書いてた
2019/03/01(金) 17:47:45.49ID:jYXMQwAma
>>571
シート1 IOクラス
シート2 IOクラス
コンバータークラス
マージサービスクラス
2019/03/01(金) 18:53:01.98ID:KSyELWIpd
>>571
そのフォームで完結させたい時はフォームに全部書く。
汎用的なのは標準モジュール、汎用的でなくてもいろんな所から使い回す場合も標準モジュールだな。
シートモジュールにはシートのイベントプロシージャ以外書かないのが基本だけどそのシートのイベントプロシージャと一緒にしたい理由でシートモジュールに書くこともある。

意味論というか、何処に書くかは内容で決める。その方が後でコード見る時に視認性も良くなる。
2019/03/01(金) 20:10:20.22ID:9ceAGmrya
俺ならスコープで書く場所変えてる
2019/03/01(金) 20:18:09.30ID:S/p2I5Nx0
シート1だけでしか使わない関数はシート1
その関数の中で使う関数で他でも使う汎用関数は標準モジュール
シート1のデータを加工ってあるが、それが将来にでも他のシートでも使いそうならその加工関数は汎用化して
標準モジュール。 シート1でしか使わないのならその加工関数はシート1に書く
579デフォルトの名無しさん (ワッチョイ 9f7c-L+km)
垢版 |
2019/03/01(金) 21:39:17.32ID:41cCIQF20
上級者の人がどう使っているかなんとなく解ったような気がします。とりあえず
【クラスモジュール】汎用性のある関数
【標準モジュール】 大きな処理
【シートモジュール】【フォーム】極力使わないが他と絡まない短いコードなら完結しても良い
という感じで試してみようと思います。
あとは関数名の最後に呼び出しする関数がある場所を付けてみようと思います。
何をやりたいかで構成も変わると思うのでそこらへんも加味しながら試してみます。
参考になりました、ありがとうございます!
2019/03/01(金) 22:34:27.56ID:KieDV9lDM
ここに上級者なんていないぞ
2019/03/01(金) 22:48:58.94ID:eQhW3/JV0
>>579
関数名の最後になにを付けるって?
2019/03/01(金) 23:05:06.38ID:jYXMQwAma
また一人、道に迷ってしまった
やっぱりVBAで勉強するのは非推奨ダナ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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