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/
291デフォルトの名無しさん
垢版 |
2018/12/20(木) 22:38:23.73ID:2i7dcD7b
webパーはバカやからおいとくとしても
VBAエンジニアとゆうてもうたら言語としてのVBAをメンテナンスしとるエンジニアと思われるやろ
そこはただのエンジニアでええねん開発言語として主にVBAつことるゆうだけで

てかVBA叩いとるのこのスレにおるプロさんゆうバカな連中だけやぞw
2018/12/20(木) 23:05:37.29ID:rQxzM92i
ロックマン作れるレベルなら、バカにされないんじゃないの?
2018/12/20(木) 23:13:35.65ID:7HwS24Ld
>>290
恥ずかしいんじゃなくて、根本的に間違ってるんだよ

アプリの開発にはVBAは適してないし、普通は使わない
ちょっとでも複雑なことをしようとするとAPIが必須になるし、ツールも貧弱で開発の効率が悪いから
そして、ワークシートに付属のマクロを書くだけの人はエンジニアと呼べるレベルにないことが多い

まあVBAで作られた社内アプリもあちこちで見た事あるけど、とにかく結果さえ出ればいいって感じでひどいもんだった
体裁の整ったアプリも作れないことはないけど、それこそVBAでは無駄に手間がかかるだけで、ようするに言語(道具)の選び方が適切じゃない
2018/12/20(木) 23:17:37.85ID:7HwS24Ld
>>292
趣味ならいいけど一般的に商品はVBAで作るわけにいかない
同じ物がVB.netならもっと少ない手間で作れるんだから、開発コストの無駄遣いになる
2018/12/20(木) 23:19:19.18ID:7HwS24Ld
「趣味でシステムエンジニアやってます」というのは成立しないと思うのは俺だけか?
趣味の一つとして認知されてるんなら、ここまで俺が書いたことは完全にひっくり返ってしまう
2018/12/20(木) 23:22:10.52ID:7HwS24Ld
別に国家資格が必要なわけじゃないから「俺は(VBA)エンジニアだ」と名乗るのは自由
聞いた人がどう思うか、どう思われるかはわからない
2018/12/21(金) 00:33:22.33ID:ykBrDntQ
>>290

 VBAは、あくまでOffice付属のマクロ言語なので、そこに何十年(最大24年)もしがみついてるとかだと、
自己紹介でそうと言われたら、叩くまではないにしても、「はぁ」で流しはするかも知れない。
 他の色々出来る中で、「VBAも触れます」なら、構えられることもないんじゃないかな。
2018/12/21(金) 00:45:40.95ID:t4pJ79vS
情報処理資格を受かった学生が「こんなの誰でも受かりますよ」って言うけど、
10年以上受からない奴は「いや、そんな簡単じゃないよ」って答える

会社では、新人・老害の会話が噛み合わないw
そういう老害が新人に教えるから、矛盾だらけw

勉強していない奴は、システムを組めない。
何も知らんからw

データ処理に適さない、表示情報が入った、Excel, PDF を成仏させる供養寺を、
住職(エンジニア)が開催してるw
2018/12/21(金) 01:07:43.82ID:KP9XHOoX
普通にプロとしてやってる人なら、言語仕様とライブラリ構成さえわかれば、どんな言語でも一定の結果は出せるもんだ
VBAだって言語の一つとして、文法や演算子、変数タイプ、組み込み関数なんかが把握できればプログラムは書けて当たり前なんだよ
2018/12/21(金) 02:33:59.15ID:j+w4FFhE
>>287
バ−カw
お前が確認したのはお前の1通りの解釈を元に一気に配列に読み込めるかどうかだけだ。

本来、以下のようにすべきところを
Function Check112(strHatsugen As String) As String

If strHatsugen="要件全てを1行" Then
Check112="頓珍漢"
Else If strHatsugen="オ−トフィルタのみ1行" Then
Check112="頓珍漢"
End If

End Function

お前のコードは以下の通りだ。
Function Check112(strHatsugen As String) As String

If strHatsugen="要件全てを1行" Then
Check112="頓珍漢"
End If

End Function

お前のコードではstrHatugen="オートフィルタのみ1行"の場合、戻り値は"頓珍漢"とならない。
2018/12/21(金) 03:18:22.04ID:KP9XHOoX
空白を取り除いて配列に入れるのって、結局どうやるのが一番シンプル?
マルチステートメントはとりあえず無しとして、作業シートを使って3行までは短縮できたけど
(セル範囲が決め打ちだからできたとは言えないかな

Sheets("Sheet1").Range("A:C").AutoFilter Field:=1, Criteria1:="<>"
Range("A1:C5").Copy Destination:=Sheets("Sheet2").Range("A1")
ary1 = Sheets("Sheet2").Range("A1:C3")
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
実際使い捨てならそれで問題になる事はないんだが
使い捨てのループ変数がループ内でスコープが閉じないのがなぁ
あと宣言位置の問題もあるけど
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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