Excel VBA 質問スレ Part58

■ このスレッドは過去ログ倉庫に格納されています
2018/11/19(月) 06:47:24.99ID:Qq88xGOU
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK


※前スレ
Excel VBA 質問スレ Part57
https://mevius.5ch.net/test/read.cgi/tech/1536583359/
2018/12/21(金) 05:00:28.02ID:PkTs+Gix
>>300
夜中まで必死に考えたんだろうな… w
2018/12/21(金) 07:57:42.03ID:zXpLrdoZ
>>290
他の言語と比べて微妙だから
vbaでも出来るけど他の言語ならもっと楽 なんで使わないの言語使えないの?て思考する人が一定数いるから
2018/12/21(金) 08:20:20.78ID:j+w4FFhE
>>302
普段から寝るのはあんなもんだ。

>>301
実際のところ、俺も「普通に一気に配列に読み込んで空白行を詰める処理を入れればいいかと」だね。

でも、データ総数300とかじゃどんなやり方でも良いし、気にしない。
効率を気にするなどと言っていても、実際は他で大きなロスしてても気にしない奴多数。
動かした所で大きなロスをしてる所がデータ読み込み部分と分かってから考えれば良い。
俺は一気に配列に読み込むのに慣れてるし、それで早いからそうするのが普通なだけで。

そもそもこういう場合でよくよくやりたいことの詳細を聞くと配列に取り込む必要が無かったりする場合も多い。
2018/12/21(金) 08:22:45.52ID:j+w4FFhE
>>301
あと、コードの量を減らすのはあまり意味が無い。
速度のためにコードの量はかなり増えることがある。
2018/12/21(金) 08:32:12.60ID:choQhZIj
誰でも知ってるようなことでドヤ顔ww
2018/12/21(金) 15:58:03.36ID:HaYV4Ucy
突っ込みが幼稚
2018/12/21(金) 20:47:54.84ID:GEdmC2dK
VBとVBAを間違えてるやつがいるよな
2018/12/21(金) 22:54:11.09ID:PkTs+Gix
>>307
>>307
2018/12/22(土) 04:42:53.90ID:LntJy5xX
アンカーを重ねて煽るのは幼稚
2018/12/22(土) 06:45:30.74ID:FmWZGIo3
>>310
>>307
2018/12/22(土) 21:23:35.57ID:P36khfsB
アンカーだけで煽った気になるのは幼稚
2018/12/23(日) 00:54:04.25ID:9AXglOVX
>>312
>>307
2018/12/23(日) 09:47:19.69ID:qHW9w8NX
>>313-314
>>312
2018/12/23(日) 10:45:49.13ID:lGbB3Xz8
>>314
>>307
316デフォルトの名無しさん
垢版 |
2018/12/23(日) 14:14:36.79ID:52OagQlj
バカvsバカはまだ静かに継続中かw
2018/12/23(日) 15:09:00.33ID:O7Ty6bBB
listviewでマルチセレクトから通常にもどすさいに再描画してるんですが、そのさい行がずれるんですが listboxのtopindexみたいなものはないのでしょうか? どうすればずれないようにできますか?
2018/12/23(日) 19:45:55.65ID:M7vXJwnP
チェックボックス有効無効をきりかえるため再描画してます。その際行がずれます。 すみませんでした。
2018/12/24(月) 22:13:09.28ID:USpopZY5
Excel VBAにlistviewなんてあったか?
2018/12/24(月) 22:49:04.51ID:+FgUdfMA
あるよぉ
2018/12/24(月) 23:02:54.97ID:kr6Bf1Pl
参照設定でね。
2018/12/24(月) 23:56:46.20ID:USpopZY5
それはVBAじゃないし
何を参照設定したかちゃんと書けよ
2018/12/25(火) 00:16:00.70ID:su/K5Fi6
参照設定もVBAの機能の一つだろ
デフォルトでもいくつか入ってるし、ファイル操作する時はFSOを追加するし、Outlookの操作も定番のテクニックだし
2018/12/25(火) 01:26:51.15ID:fCRLWXqM
ListViewはライセンス的に微妙なんだよな。
配る場合はダメだった気がする。

恐ろしく面倒な方法で実装すればライセンス的にも問題無いけどそこまでやれる人は殆どいないと思う。
2018/12/25(火) 01:55:29.77ID:fCRLWXqM
あとツールボックス右クリックでその他のコントロールを参照設定とは呼びたくないな。
2018/12/25(火) 07:15:44.70ID:wRBkGyE7
>>325
設置すると勝手に参照設定されますから、同じことです
2018/12/25(火) 08:33:21.08ID:gnAfBdjP
お前が呼びたいとか呼びたくないとか、お前の気分なんぞ知ったことではない
2018/12/25(火) 18:45:28.39ID:Is6QTt21
Excel に入ってるんじゃないの?
329デフォルトの名無しさん
垢版 |
2018/12/25(火) 23:18:20.70ID:wH59ARy4
入っとるね
2018/12/26(水) 01:42:12.21ID:BN5rbpb6
いまのExcel VBAに標準でListViewあるのか?
2018/12/26(水) 05:15:51.11ID:43KasKaO
標準の意味とは

VBA可の環境ならコントロールの追加は誰でもできるが
2018/12/26(水) 13:12:31.75ID:RgV9orAX
シートのコピーでafter:=worksheets.countしても最後尾に追加されないことがあるんだけど何これ
通常なら問題無い 非表示シートだか同名シートだかが混ざると不穏な動きする
2018/12/26(水) 17:11:11.31ID:43KasKaO
>>332
思い込みで書いててて仕様を正確に理解してない
コード晒してみ
2018/12/26(水) 17:49:40.48ID:Le9KM/M7
>>332
afterに入れるのはシートオブジェクトやで?
2018/12/26(水) 21:16:35.59ID:Y8+MwfS4
>>332
https://sugoikaizen.com/excelvba/worksheets_sheets/
2018/12/27(木) 18:50:28.99ID:0mQlyYIj
Worksheets.Countだけ指定して最後尾にシート追加することもできるんだな。初めて知ったわ。
2018/12/28(金) 00:28:35.21ID:M7adF/cl
>>333
解決してるけど状況だけ説明
Thisworkbook.Worksheets("雛形").Copy After:=Thisworkbook.Worksheets(Worksheets.Count)
普通に実行出来て追加される けど末尾に追加されない
雛形シートは非表示で他にブック開いてないのが前提
原因は他の非表示シートが末尾にあったから?ぽい見えるシートの末尾に追加されてた
原因があってるのかは不明だけどコピーの前に全シート表示させる処理書いたら想定どおりに末尾に追加されたから解決としてそれ以上調べてない
2018/12/28(金) 08:07:29.84ID:7PkHI2ZE
>>337
これで解決は酷いなあ。
このコードじゃダメだろ。
初心者が一番ハマるのに引っ掛かってる。

Worksheets.Countはどのブックのシート数を示してるの?
人間の思い込みと現実が違うことはよくある。
ブックが複数開いてたらThisworkbookがActiveとは限らない。

まあ、これが原因かどうかは分からんけど。
2018/12/31(月) 13:34:36.98ID:P9+LicCn
コピーしたシートも非表示に設定されてるからじゃね?
2019/01/03(木) 20:12:26.04ID:m9d94GZ9
すみません、一般論として教えてください

一つのプロージャ内に複数のForNext文を使う場合
カウンタ変数はそれぞれ用意したほうがいいんでしょうか?
それとも全部「i」とかで固定したほうがいいんでしょうか?
2019/01/03(木) 20:38:50.80ID:rHu6ErP8
単純にカウンタとしてしか意味が無くて充分に短いループなら全部iでいいよ
2019/01/03(木) 20:52:55.74ID:m9d94GZ9
>>341
ありがとう
これまで全部「i」で統一してて他で使いたいときは違う変数に明け渡したり…ってしてたんだけど
この前業者の人が書いたコードを見たらそれぞれに変数を与えてたので…
デバッグの時に有利?とか何かプログラム業界の常識みたいなのがあるのかな?と気になって
343デフォルトの名無しさん
垢版 |
2019/01/03(木) 21:24:04.00ID:3ahyrkeA
>>342
自分の頭使えよ
2019/01/03(木) 21:38:30.48ID:BKcPgeWW
>>342
他で使いたいときに明け渡すなら最初からそれぞれ違う名前にした方がいいんじゃね
2019/01/03(木) 22:08:38.04ID:/hb1raIC
>>343
ここ質問スレだからそういう幼稚な発言はやめようね。
色んなレベルの人がいるから。
2019/01/03(木) 22:16:13.64ID:rzUuzEne
>>340
そもそもプロは1つのメソッドに複数のループを書かない
2019/01/03(木) 22:45:11.18ID:9E4VKJOH
>>340
「プロシージャ」な
procedure
348デフォルトの名無しさん
垢版 |
2019/01/03(木) 22:57:49.15ID:YFBXiFl7
>>342
ループがネストする場合にi,j,kとしたりするのは
FORTRAN由来でコンピュータ黎明期からある
https://qiita.com/yaju/items/38f63900491d4ac51af7
座標だとx,yとかで回したりもするがあまり長い名前は使わない方が良いかと
2019/01/03(木) 23:18:24.27ID:rHu6ErP8
i,j,kは慣習だけど、それ以外はループ変数といえど意味のある変数名を使うほうがいいぞ
長い名前使うなとか、インタプリタ時代の悪習でしかない

いかにわかりやすい変数名つけるかはセンスもあるけどな
2019/01/03(木) 23:56:28.99ID:2qiD+7+U
俺は行ならrow、列ならcolumn、インデックスならindexとかにして
なるべくi, j, kとか使わないわ、別にこだわりはないけど
351デフォルトの名無しさん
垢版 |
2019/01/04(金) 00:30:47.29ID:3QLIqJfD
俺は一文字だけじゃ見失うから
iii jjj kkk ccc rrrって3文字連打してる
別の変数名への置換もしやすいしね
2019/01/04(金) 00:32:01.54ID:GFUZolCB
みなさんどうもありがとう
自分はプログラム屋ではないので業界の常識?みたいなものがあれば知りたくて

今までは使うなら「i」、構造的にかぶるなら「j」あたりを使ってましたが
その都度意味のある変数を使う方が多いんでしょうか
その他の変数も基本一文字が多いんですけどこれもあまり誉められたことでは無いのかな
353デフォルトの名無しさん
垢版 |
2019/01/04(金) 00:39:25.54ID:T+XMZC4N
>>352
馬鹿は頭を使うことができんの?
2019/01/04(金) 02:10:11.62ID:+nkelZ7z
>>350
そんな予約語っぽいの、使いたくない。
2019/01/04(金) 02:40:32.55ID:MgMPlhfY
俺は row col idx i i2 i3 をよく使う
2019/01/04(金) 07:27:59.80ID:M3G9sl2d
シート上の特定Rangeを表してるときならrowとcolumnもありだけど、一般にはiとjかな
それ自体が検索対象になることもまずないし
2019/01/04(金) 08:41:36.91ID:zy8oD3uq
ローカルのカウンタ変数をiで使いまわしてるけどi2とか分けたほうが良いの?
好み?
2019/01/04(金) 09:27:17.18ID:+4+fWqKR
>>357
誤読の可能性があるなら、分けた方がいいと思う。

>>349,350あたりが妥当じゃないかな。ただ、例えば行そのものでは
なく行を導出するための数値を入れる変数には、rowじゃなくてrowナントカ
だのにした方がいいのかな。単なるループカウンタならヘタに意味のある
名前を付けない方が「無意味なカウンタ変数です」ということを示すことが
できる気も。自分はループカウンタはとりあえず一文字二文字の変数を
放り込んでそのまま、ということが多い(簡単な処理しか書いたことない)。
359デフォルトの名無しさん
垢版 |
2019/01/04(金) 09:54:15.33ID:DCvNugNP
個人目的ならそれこそ自由、自分が解りやすければなんでもいい
社内使用で他の人が今後も手を加える可能性があるなら
可読性と一般的な用途を考えてijk辺りがよいと思う
2019/01/04(金) 10:05:37.21ID:NtMlYI+L
カウンタ変数の1つや2つぐらいケチらず定義しろよ
それこそ先頭で
Dim i1 As Integer , i2 As integer,,, とかやっとけばいいだろ。
こう書くとIntegerよりLongだとか言い出すやつも出てくるけど w
2019/01/04(金) 11:53:23.85ID:aVQoc2JA
>>359
3ヶ月後の自分は他人

>>360
おれならそう書いてあったら、i1とi2になにかしら特別な意図があるのかと思う
それならちゃんと分かりやすい変数名をつけるべき
362デフォルトの名無しさん
垢版 |
2019/01/04(金) 12:16:24.95ID:YvLbWmko
べきとかええねん
好きなようにしろや
2019/01/04(金) 12:17:38.62ID:M3G9sl2d
integer使う意味が分からんぞ
ループカウンタに限らず
2019/01/04(金) 12:55:43.45ID:aVQoc2JA
VBAは16ビットの時代から生き残ってるからなぁ
2019/01/04(金) 14:22:56.70ID:dyujBTAs
C++試食版みたいな
2019/01/04(金) 15:06:28.56ID:FLK7qEcT
文字コードでInteger使うよ
2019/01/04(金) 17:11:54.33ID:JnujQIz6
個人プログラムのときは Jは大文字にしてる
ijだとぱっと見差がないから
それから、行と列はc、r変数にしてる
2019/01/04(金) 18:43:57.47ID:ry6hJENG
>>367
列・行では?
2019/01/04(金) 22:12:41.23ID:ZmFghfmj
officeのパッチにやられた
2019/01/04(金) 22:26:40.57ID:zvNc5eXN
i,j,kきらい
indexとかcountとかすき
rowIndexとかcolumnCountとかもっとすき
2019/01/04(金) 22:35:43.15ID:8kQ9PR43
好き嫌いはチラシの裏に
2019/01/05(土) 01:06:17.29ID:oO8mkqZ6
何が書いてあるのか、未来の自分がわかり、他人もわかるのが理想
昔ながらのルール(慣習)は理由なく破るべきではない
2019/01/05(土) 03:31:35.86ID:7TsgmPMW
意味のある変数なら意味のある名前をつけてくれよ
2019/01/05(土) 07:37:32.77ID:1YbtJ0wD
i j kは使い捨てのループカウンターとして世界中に広く認知されてるし入力のコストも低い
いちいち For TemporaryLoopCounter = 1 To 5 とか書きたい人は自由にすればいいけど、それこそ自己満足の世界だと思う
2019/01/05(土) 08:45:01.70ID:ORiRzU3d
長く使うプログラムほど扱う対象が汎用的で、変数が具体的に何を指すとか
限定できないため i, j, k になりがち。
逆に具体的対象を扱うプログラムだと変数名も具体的にした方が良いだろうが
汎用的に長く使うものではない。
何が言いたいかというと別に何でもありません。
2019/01/05(土) 09:11:07.61ID:xejHmutN
かなり乱暴だが
> 変数名の長さはスコープの広さに比例させるべし
2019/01/05(土) 09:12:48.40ID:tCoREms1
>>376に同意
一般論でいうと、メンテナンス性に優れたプログラムを書くには次の点を意識するとよい
・変数の生存範囲はできるだけ狭く
・変数の生存期間はできるだけ短く
で、これを意識したプログラムの変数名は自然に短くなる
極論すれば、サブルーチンが適切に分割されていてサブルーチン名だけで何やってるか明らかなら、
その中の一時変数名なんか全部一文字でもいい
2019/01/05(土) 14:06:52.83ID:eDAGI3vR
そもそもループ回すのにループカウンタ使うのが時代遅れ
for each使え
2019/01/05(土) 14:09:46.21ID:tCoREms1
時代遅れとか言い出したらVBA自体が使えなくなる
ナンセンス
2019/01/05(土) 14:28:05.44ID:c7wm3fbX
For Each とループカウンタ使うのとどちらも一長一短あるのを知らない人は早く初心者を脱出してね。
2019/01/05(土) 15:07:14.98ID:ORiRzU3d
一長一短ていうか For Each はワンパターンな使い方しか出来ないからドヤ顔するようなもんじゃないな
2019/01/05(土) 15:49:59.34ID:xejHmutN
>>378
配列Aと配列Bの要素同士を足して配列Cに入れる
って言うのを
For a, b, c in A, B, C
c = a + b
Next
みたいに書けるならいいんだけどなぁ
2019/01/05(土) 16:01:26.52ID:oO8mkqZ6
C = A + B
って書けた方がいいな
2019/01/05(土) 16:09:26.86ID:ORiRzU3d
>>382
・そういう構文がない
・c に代入することが実はできない
の二つの意味でダメなんだよね
2019/01/05(土) 16:17:56.11ID:xejHmutN
>>383
それ自由度が低い
For a, b, c in A, B, C
If b <> 0 Then c = a / b Else c = 0
Next
みたいなことを書きたくなるとかありそうだし
2019/01/05(土) 16:57:08.01ID:BR5BglFG
linq for vba
2019/01/05(土) 20:12:44.53ID:FzRtN9wJ
>>376
しかしvbaにはプロシジャより狭いスコープがないんだよ
2019/01/05(土) 20:30:12.97ID:xejHmutN
>>387
だから何?
最近のモダンな言語と比べてもブロックスコープが無いくらいじゃないの?
2019/01/05(土) 20:53:20.75ID:tCoREms1
>>387
まともなプログラマならブロックスコープが欲しくなるような大きなプロシージャは書きません
2019/01/05(土) 20:57:58.68ID:FzRtN9wJ
実際使い捨てならそれで問題になる事はないんだが
使い捨てのループ変数がループ内でスコープが閉じないのがなぁ
あと宣言位置の問題もあるけど
2019/01/06(日) 01:37:57.50ID:ckNCIF8F
わかる方がいれば教えてください
ユーザーフォームに配置したラベルに、選択中のセルの値を表示したいです
他のセルをアクティブにしたらラベルの内容も次々と変わるようなものを作りたいです

初心者なりに考えたのですが、
セルの選択をダブルクリックにしてシートモジュールの
Private Sub Worksheet_BeforeDoubleClick(〜)
みたいなものを使うパターン、
ユーザーフォーム側にアクティブセルの値を表示するためのボタンをつけるパターン、
それくらいしかラベルに表示する方法が思いつきません
思っていた上に書いたような動きのものが作れません
そもそもそんなものは不可能でしょうか
セルをアクティブにするだけでそんな動きをするものは作れたとしても重くて(?)実用的じゃないでしょうか
2019/01/06(日) 01:43:01.14ID:ckNCIF8F
ユーザーフォームが出ている時だけワークシートイベントを発生させることってできますか?
2019/01/06(日) 01:56:18.52ID:wuHdfDnO
>>391
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
UserForm1.Label1.Caption = ActiveCell.Value
End Sub
2019/01/06(日) 02:17:03.95ID:GQx3m9rS
>>392
発想が根本的に間違っている
イベントは自然に発生するものであり、それを制御しようなどと考えてはいけない
ユーザーフォームが出ていないときはイベントを無視すればよい
2019/01/06(日) 06:33:59.75ID:VjyciGNt
自分もVBA初心者だけど書いてみます

>>392
既に言われてるけど、
イベントの発生は操作できないから受け取り側でフォームが読み込まれてるか調べて、
実行するか選択する形になる

思いつく方法は、
・フォームが一つしかないなら、UserFormsコレクション(読み込まれたフォームの一覧)の要素数が1以上かを調べる
・UserFormsコレクションに該当のフォーム名(typename関数で取得できる)があるか調べる
・印になるパブリック変数を宣言し、フォームのInitializeイベント(読み込まれた時に発生するイベント)で適当な値を代入させ、その値を調べる。

もしくはWithEvents(これを付けて宣言した変数のイベントを受け取れる)でシートのイベントを受け取るクラスモジュールを用意して、
それにフォームのラベルを操作させる方法もある
余程シートに依存した目的でない限り、個人的にはこちらの方が自然だと思う
396デフォルトの名無しさん
垢版 |
2019/01/06(日) 11:55:51.09ID:RBr8Qah/
Excel2010の人は1月3日版のアプデを入れないように

【Win】 WindowsUpdateで入れなくても良いKBリスト。2018年12月12日まで分
http://blog.livedoor.jp/nichepcgamer/archives/1039785182.html
397デフォルトの名無しさん
垢版 |
2019/01/06(日) 13:03:05.58ID:BkO4LwOx
>>395
こんな初心者おる?
398391-392
垢版 |
2019/01/06(日) 13:13:13.46ID:ckNCIF8F
>>395さんが言ってることが全く分からないというか一度も触れた事がないので
これを機会に勉強してみます
謎のクラスモジュールを使ってみたいと思っていたので良かったです
みなさんありがとうございました
2019/01/06(日) 13:25:33.73ID:kaEteaA+
>>397
ググれば出てくることなんだから、初心者でも答えれるやろ。
まあ人によっては初心者は卒業したって判断しそうなくらいのレベルはありそうだが。
2019/01/06(日) 14:02:55.44ID:L4UGmOY3
>>397
新人研修の半ばぐらいかな
2019/01/06(日) 15:46:11.59ID:BcE7MgiE
>>398
UserFormで直接WithEvents付きの変数使えるぞ
いろいろチェックとかはぶくとこんな感じ

Private WithEvents ws As Worksheet
Private Sub UserForm_Initialize()
Set ws = ThisWorkbook.Worksheets(1)
End Sub
Private Sub ws_SelectionChange(ByVal Target As Range)
Me.Label1.Caption = Target.Value
End Sub
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。