Excel VBA 質問スレ Part73

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 4668-xJJl)
垢版 |
2021/09/13(月) 07:29:59.47ID:GNx0xRRz0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ

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

※前スレ
Excel VBA 質問スレ Part70
https://mevius.5ch.net/test/read.cgi/tech/1616072923/
Excel VBA 質問スレ Part71
https://mevius.5ch.net/test/read.cgi/tech/1621914481/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/10/05(火) 15:45:39.37ID:dJ3N05Swa
補足ながら>>311はMPもマルチページとして宣言するか該当箇所をMP.Pages("D3").Name = "X3"に書き換えれば期待通り動くんですよね
どういう仕組みなのか
2021/10/05(火) 15:56:25.07ID:hS5WuwV9r
worksheetfunctionの引数に配列入れるときって数に上限があるな
警告も出さないしほんまクソ
2021/10/05(火) 15:56:31.46ID:hS5WuwV9r
worksheetfunctionの引数に配列入れるときって数に上限があるな
警告も出さないしほんまクソ
2021/10/05(火) 16:15:51.73ID:2oqKIsmm0
>>312
いや
普通に通るけど。ちな2016。
2021/10/05(火) 16:19:44.73ID:2oqKIsmm0
あ、でもこっちはOption Explicit 付けてたから
MPはキチンと型宣言してたな。
でもそこはあまり関係ないよね?
317デフォルトの名無しさん (アウアウキー Sa87-Kp1k)
垢版 |
2021/10/05(火) 16:21:29.24ID:dJ3N05Swa
>>316
や、たぶん関係するっぽいですかね?
こちらオプション無し、宣言は無しまたはas objectだとダメでas multipageだと通った
2021/10/05(火) 16:29:34.84ID:2oqKIsmm0
>>317
ふーん
不思議だねぇ
ちなみに宣言しないで走らせたときの
MPの内部型ってどうなってる?
ごめん、もう走ったからこっちは
EXCELのブック消しちゃったんだ。
2021/10/05(火) 16:32:02.05ID:dJ3N05Swa
variant/object/multipageでした
2021/10/05(火) 16:36:45.31ID:2oqKIsmm0
>>319
やっぱり不思議だねぇ
その辺の内情は分からないな
一応片付いたことになるのかも知れないけど
誰かその辺知ってたらレスが付くんじゃないかな
2021/10/05(火) 16:39:04.47ID:dJ3N05Swa
そうですね、とりあえず急ぎとか困りではないので一旦これで…
ご回答ありがとうございました
2021/10/05(火) 18:26:27.16ID:jAVyPZWcM
型推論するのに失敗してるんじゃね
2021/10/05(火) 21:37:47.06ID:LdUtAYwX0
Pagesの引数に変数渡すと数字として解釈しようとしてるっぽいな
buf = "2" とかにするとIndex=2のページを参照してるようだ
文字列リテラルならちゃんと名称として解釈してるっぽい
ちな365の64ビット

これ以上はサポートにでも問い合わせるしかねぇんじゃね
324デフォルトの名無しさん (アウアウウー Sa27-4HLA)
垢版 |
2021/10/07(木) 18:28:58.89ID:p9itA/YXa
マクロの記録機能使ってマクロの作成したいんだがピボットテーブルのプルダウンから任意の値だけを抜き出すのってどうやってやればいいの?

毎回モジュール見直すとvisible farceになってて要するに抜き出したいもの以外を表示しないようにしてる構文て事だよね?
こうなると仮に次回このマクロを使う時にvisible farceになってない値が新しく出てくるとそれも表示されちゃうって事だよね?
じゃなくていくら値が増えても決められた値だけを抜き出すように作りたいんだ
どなたか教えて下さい
2021/10/07(木) 20:11:24.24ID:70iiidwq0
>>324
記録してみてどうなってるか見てみれば分かるじゃん
2021/10/07(木) 21:05:39.19ID:D5dO/oMJ0
>>324
Falseね
ピボット周りのフィルタはFor EachでTrueFalseを一つ一つやっていかないと無理な仕様
遅いしわかりにくいけど割り切って
2021/10/07(木) 21:29:48.70ID:AykPZAFh0
ActiveSheet.PivotTables("ぴぼっとてーぶる").PivotFields("ふぃーるど").ClearAllFilters
ActiveSheet.PivotTables("ぴぼっとてーぶる").PivotFields("ふぃーるど").PivotFilters.Add Type:=xlCaptionEquals, Value1:="表示したいもの"
2021/10/07(木) 23:55:42.12ID:P9pCLiyt0
VBAで最適化したら仕事増やされた話ってよく聞くけど
そいつが辞めたらそいつに回されてた膨大な仕事はどうなるん
329デフォルトの名無しさん (アウアウキー Sacb-h0Ad)
垢版 |
2021/10/08(金) 00:17:45.54ID:sJT5Ti/qa
うちの職場は適当にvbaでつくったやつをちゃんとしたアプリに置き換えてるよ
2021/10/08(金) 00:31:33.80ID:GXvDbP/z0
アプリだろうがvbaだろうが作った人間がやめたらメンテできなくて終わるんじゃないの
開発者が大勢いるようなレアな職場ならともかく
vba使ってるところなんてたいてい事務で
エクセル職人が少数いるだけだろ
2021/10/08(金) 00:37:30.31ID:d3eTt0zpM
実際にはそういうときには業務そのものが消滅するケースも多いよ
そもそもVBAで簡単に自動化できるような業務はもともと無意味であるものが多いからな
2021/10/08(金) 02:32:08.41ID:KEaimES90
人がやめた後に職場がどうなるかはその職場の責任者が決めるんじゃね
下っ端が気にすることじゃない
2021/10/08(金) 04:11:36.40ID:vcejz6/Ud
市販アプリでも、天才的な開発者が辞めて、会社もろともアプリもダメになって終わったパターンをいくつも見てきた
2021/10/08(金) 07:11:46.26ID:GXvDbP/z0
>>331
>>333
なるほどねありがとう
335デフォルトの名無しさん (アウアウウー Sa2f-YkK2)
垢版 |
2021/10/08(金) 08:09:49.53ID:Am1Ugnvua
>>326
>>327
丁寧にありがとう
色々試してみます
336デフォルトの名無しさん (ワッチョイ 8a05-GJBa)
垢版 |
2021/10/08(金) 09:40:27.58ID:JQJjKarL0
CPU使用率が大きかったのでダメもとで開いて修復を実行したら
かなり軽くなるのな、知らんかった
これ定期的にやったほうがいいのか?
VBAのコードを一旦退避させるのが面倒だが...
2021/10/08(金) 17:00:42.44ID:EVmjGNOc0
>>336
詳しく
2021/10/08(金) 22:11:41.59ID:x7uCSItJ0
属人的にならない仕組みで効率化できればいいんだが、頭の中が古き良きな方々が幅を利かせる日本ではなかなか難しい
2021/10/09(土) 01:49:50.17ID:98oBjVW70
自分が初めてVBAを使って解決した時点で、他にVBAを使う人がいないんだから属人化しないわけがないと思うけどな
しかもVBAってプログラミング言語の中では非常に初心者向けなわけで、
誰もVBAで組めない=プログラミングに全員疎いのはほぼ決定なんだから尚更さ

VBAを共通知識にしたいっていうのは、
最初にプログラミングっていう一般的には取っ付き難い物に興味を持たせるっていう途轍もなく大きなハードルを超える必要があって、
それは「興味がある生徒に教える」プログラミング講師以上に難しいと思う

相当な根気が必要だと思うよ
2021/10/09(土) 02:16:01.12ID:2HXwYm4Z0
そもそも人に仕事が割り振られた段階で属人化されてるわけで
たんに次の人が困って終わりだよ
2021/10/09(土) 02:30:43.66ID:98oBjVW70
確かに。
レス漁ってみたが、
ここでいう「属人化で困る」は「他の人にはできないVBAというテクニックを持つオレスゲー」を単にオブラートに包んだだけっぽい感じがするな
2021/10/09(土) 02:49:32.47ID:0Qsp0NFP0
マクロの効率化ガン無視で社員の手が開いた分だけ仕事を割り振る上司がいるらしいけど
その時点である意味属人化してるよね
その仕事引き継ぐやつ
まずさばき切れないだろ
2021/10/09(土) 04:49:21.33ID:UCXjyRPA0
うちの職場ではほとんどの人がマクロできるけど、新人に自信持たせるためにわざわざ気を使って
「君マクロできるなんて凄いね〜」っておだててるのに同調するのが正直めんどくさい
2021/10/09(土) 04:50:24.64ID:0Qsp0NFP0
そういうとこは給料高そうで羨ましい
2021/10/09(土) 05:01:41.26ID:UCXjyRPA0
>>344
給料は個人の能力に比例します
2021/10/09(土) 08:10:48.77ID:KDe6uexsd
新人の育成は面倒だけど将来的に必要なことだからなあ
褒めた方が上達が早いってのも科学的に証明されつつあるし、そういうもんだからあきらめろ
2021/10/09(土) 08:19:40.75ID:0Qsp0NFP0
全員VBAできるとか絶対給料高いとこだろ
うちのところなんて一人しかいないよ
しかも残りは関数すらまともにあつない
2021/10/09(土) 08:21:07.29ID:0Qsp0NFP0
おかげで効率がすげー悪い
基本は専用ソフト扱うからエクセルは必須ではないとはいえ
それでもエクセルやVBAやれるのとやれないのとでは効率が雲泥の差
2021/10/09(土) 08:31:06.39ID:HlWFX8NcM
選民思想ここに極まれり
2021/10/09(土) 08:33:14.89ID:qDyUb0P50
研修とか外部の自宅学習プログラムでもやったら?
費用は会社持ち、報奨金も少しは付けて
2021/10/09(土) 08:37:41.66ID:0Qsp0NFP0
そんな金あったら給料上げてレベルの高い人材雇うか
もうちょっとマシな専用ソフト使ってる
金をケチったせいでオンボロ専用ソフト使わせれて
専用ソフトじゃフォローしきれないのでエクセル活用しないと行けない羽目になってる
2021/10/09(土) 08:57:09.18ID:g5OHjBNSd
会社は社員に楽させたいと思ってるわけじゃない、という大前提
人材なんて時間いっぱい、めいっぱい働かせてナンボ
安いアプリを買って、あとは社員にやらせて、それで回ってるなら何も問題ないんだよ
2021/10/09(土) 09:27:27.16ID:0Qsp0NFP0
高い金出して高価な専用ソフト使うくらいなら
多少残業代だしてもいいからボロソフト使ったほうが安上がりだからな
2021/10/09(土) 09:42:15.79ID:58+qPlR+0
エクセルはマス目状に文章を入力できるソフトぐらいにしか思ってない人もいるしなあ
2021/10/09(土) 15:35:55.10ID:8vFa8kgUd
>>354
ウチの会社の事務方ほとんどそれだわ
セルの結合しまくって数値手入力とか当たり前
2021/10/09(土) 20:10:49.92ID:J89rndhPa
セル結合せずにせめて広げろや、とは思う
2021/10/09(土) 20:26:49.65ID:XLSjDb/pM
セル結合とvlookupをディスってようやくエクセル使いとして一人前
2021/10/09(土) 20:30:33.16ID:0Qsp0NFP0
べつにvlookupは悪くないだろ俺は使いたくないけど
2021/10/09(土) 20:58:23.98ID:ZXG2HktNM
>俺は使いたくないけど
さりげないアピール
2021/10/09(土) 20:59:19.46ID:ZXG2HktNM
>俺は使いたくないけど
さりげなさを装ったアピール
2021/10/09(土) 21:05:39.47ID:LYlfiTybM
VLOOKUPディスってるのは情弱だろ
2016からめっちゃ高速化されてるから数万行ぐらいなら普通に使える
2021/10/09(土) 21:11:18.66ID:0Qsp0NFP0
高速化とかどうでも良い
左端しかデータが使えないのが不便
無駄な検索用データが全部左端に固まる
2021/10/10(日) 06:43:03.77ID:LB6rENWtp
個人的に使いたい使いたくないは仕方がない
適材適所で最適解を出す手段に自ら縛りを掛けているだけだから
それで他の人に迷惑掛けている訳でなければとやかく言う筋合いでも無いしな
2021/10/10(日) 08:15:02.57ID:AQQzB40DM
>>362
XLOOKUP使え
うちの環境だとまだ使えないけど... orz
2021/10/10(日) 10:34:27.64ID:iKRuQHQv0
index matchでええやん
2021/10/10(日) 15:09:30.75ID:2USb7I2AM
MATCHはいちいちIFERROR組み込まなきゃいけないから式が冗長になりがちであんまり好きくない
2021/10/10(日) 15:39:33.06ID:wqZqaK12d
そもそもスピードは求めてない
元データを1日に何回もアップデートするわけじゃないし
2021/10/10(日) 15:46:10.06ID:iKRuQHQv0
>>366は何使ってんの?
2021/10/10(日) 16:04:08.10ID:2USb7I2AM
>>368
あんまり関数でデータベース検索かけたくないけどかけなきゃいけないならXLOOKUP、自分以外が使う可能性があるならVLOOKUPかHLOOKUPかなぁ
状況に合わないならMATCHも使うけど使用優先度は低め

VBAにやらせる時も中に確実に存在する場合でなければRange型にFind使って放り込む事が多いかも
Is Nothingで見つからない場合でも処理が止まらずに弾けるし
2021/10/10(日) 16:23:38.63ID:iKRuQHQv0
あごめん>>364かと思ってた

処理が止まらずにってのすごい大事だよなぁ
2021/10/10(日) 16:30:18.62ID:6uQRu7X1M
>>370
364だけどVLOOKUP使えるならVLOOKUP
そうでなきゃINDEX+MATCH
大抵そうじゃないの?
2021/10/10(日) 16:51:12.87ID:JSJMRLhD0
ある行を内容の変更は自由にできるけど削除できないようにすることはできますか?
2021/10/10(日) 17:26:53.27ID:rp73utgy0
それ、ここでする質問?
374デフォルトの名無しさん (ワッチョイ 0668-Mxyx)
垢版 |
2021/10/10(日) 17:53:50.05ID:19DRUExW0
>>372
削除を感知して、
https://kirinote.com/excelvba-row-event/

削除されていれば
appliction.undo
ってのはどうだろうか
2021/10/10(日) 18:04:32.90ID:u+pPz2Uo0
ゴミみたいな回答ばかり
376デフォルトの名無しさん (ワッチョイ 9eda-h0Ad)
垢版 |
2021/10/10(日) 19:05:42.11ID:eL4HRu610
じゃあ、ゴミじゃない回答よろ
2021/10/10(日) 19:35:34.55ID:rFwRYXWV0
「削除できないように」というのが:
・「セルや行の削除をできないようにしたい」→シートの保護で対処
・「値の変更はできるが消去(空欄に)できないようにしたい」→入力規則で対処
2021/10/10(日) 20:12:04.54ID:eL4HRu610
対処の方法がわからないのかと思ったら、対処する方法があるのかどうかの質問だったのかw
2021/10/11(月) 00:26:21.39ID:Z2LLk70Q0
>>377
シートの保護で削除不可を選んでも全ての行が削除不可になること,またセルの内容変更もできなくなるので希望に合いません.
374さんのやり方をVBA画面をで書くしか無いですかね
2021/10/11(月) 14:09:59.80ID:7nZn8gcC0
>>379
保護する前に行選択しておけばいいやん
任意の場所だけ編集不可にできるよ
2021/10/11(月) 14:59:32.76ID:Z2LLk70Q0
>>380


> 任意の場所だけ編集不可にできるよ
編集不可ではなくって、編集可で削除不可にしたいんです。
2021/10/11(月) 18:57:29.54ID:nQqo0+vnM
空白に編集する場合とかどう取り扱うつもりなんだろう
2021/10/11(月) 20:49:58.25ID:SLAXBehE0
クビか配置転換したほうがよいかと
384デフォルトの名無しさん (ワッチョイ 0b8e-o/se)
垢版 |
2021/10/11(月) 21:18:23.92ID:oro4FUng0
馬鹿でもある程度作れてしまうからダメなんだよな
2021/10/12(火) 18:51:44.09ID:F8L1eENx0
それを求める環境が悪い
2021/10/14(木) 18:44:35.26ID:FbYeSmKT0
空白は削除じゃないんじゃね
2021/10/14(木) 19:05:30.78ID:DEjpZ/5cr
メーカー開発設計だけど実験データ処理とかで
なれないながら頑張ってvba使ってるけど
試行錯誤で調べながらだからあんまりシート使ってるときと比べて効率化できてる気がしない…
でもシートでチマチマするよりは知的労働してる気がするし
いつかのペイオフを期待するわ
2021/10/14(木) 20:42:17.77ID:BHqqoV+20
あるレベルを超えると突然やりたいことはこうやりゃいいじゃんってなってバリバリ書けるようになる
389デフォルトの名無しさん (ワッチョイ 0668-Mxyx)
垢版 |
2021/10/14(木) 22:26:04.22ID:FxTzsGq40
set覚えてオブジェクトの概念覚えてイベントを理解してしばらくするとほぼ全ての場面で対応できるようになる
2021/10/15(金) 06:17:54.01ID:YCIon6in0
色々覚えて余計な知識が付いてきて、
これはもっと綺麗に書けるんじゃないか?っていう欲が出て進まなくなる事が増えたんだけどどうすりゃいいのか
今までは明らかに冗長で読みづらいコードが多かったけど、生産性で見れば高かったように思う

特にプログラミング自体に興味が出てきて他の言語の記事も見るようになって、
そこで得た知識をVBAで無理に再現しようとしてドツボに嵌る事態も多いように感じる
2021/10/15(金) 07:30:19.61ID:xvvRRo/+0
>>390
まず単一責任原則に沿って作るといいよ。
つらつらとコードを一直線に書くんじゃなくて、
役割に合わせてメソッドや関数を作って
それを部品として組み立てて行くイメージ。

後、他言語をやっていてクラスや
インターフェースの概念を理解しているなら
行き当たりばったりで最初からコードを
書くんじゃなくてどういう構成で組むかを
一度図に書いてイメージしてから作るといいよ。
そのためにもUMLとかもかじっておくと
いいんじゃないかな。

後は暇なときにデザインパターンの本でも
読んでおいて使えそうなのだけ
使えばいいんじゃないかな。

ただ、VBAでは自分一人で使うんであれば
それでいいけど、後々人が見たり手を入れたり
することを考えると、やり過ぎると
そもそもその辺の概念を理解していない
人が多いからね。自分以外誰も触れない
オナニーコードの完成だよ。
その辺は気を付けないとね。
392デフォルトの名無しさん (ワッチョイ ef68-VjlT)
垢版 |
2021/10/15(金) 07:53:52.36ID:i1GdH9Fr0
>>390
字の練習と同じ
納得できるまで、何度も綺麗に書き直せば良い
その内、早く綺麗に掛けるようになる
「もう少し綺麗に書けそうだけど時間かかるから諦めよう」の判断も出来るようになる

>>391とは逆だけど、vbaの場合は関数やモジュールはあまり分けなくても大丈夫だよ
他の言語だと10行超えたら別モジュール、なんて言われる事もあるけど
vbaだと単一モジュール・単一関数で終わる方が見やすい事も
2021/10/15(金) 08:56:32.98ID:Ob8xTIA6M
メソッドが3つ以上にできそうなときはクラスを検討する
394デフォルトの名無しさん (ラクッペペ MM7f-xEoX)
垢版 |
2021/10/15(金) 09:22:10.96ID:Y66b/sjXM
美しさより速さだよ
最初の頃は両立するが(無駄なSelectなど)
次第によ醜くなっていく
395デフォルトの名無しさん (エムゾネ FFbf-mxW8)
垢版 |
2021/10/15(金) 10:10:42.08ID:Sjupi756F
もう3年くらいExcel使ってないけど全然困らないωωω
2021/10/15(金) 11:34:26.87ID:r1bpZsgJ0
ふーん
2021/10/15(金) 20:36:17.72ID:WLz9ti2OM
>>395
なんでこのスレに居るの?
2021/10/15(金) 21:42:47.27ID:YCIon6in0
>>391,392
ありがとう

分けた方がスッキリするんだけど、
分けすぎると逆に関数があっちこっちに分散してどれが何に使われているのか分かり辛くなる
そういう時に「どこまで分けるか」っていう塩梅はどういう基準で決めてる?
2021/10/15(金) 22:02:32.86ID:xvvRRo/+0
>>398
役割。
モジュールもメソッドも全てに役割分担を持たせてキチンと仕舞うべき場所に仕舞っておく。
だからその役割を行う為なら100行になろうが1000行になろうがそのメソッドに記載する。

何を持ってしてひとつの役割とするかは作る人のセンスに掛かってくるから場数をこなして慣れるしかないかな。
2021/10/15(金) 22:06:51.27ID:xdjJa8Ad0
>>398
変数や関数名や引数である程度分かるようにする
それでも迷うようならコメント付ける
401デフォルトの名無しさん (ワッチョイ ab5f-UsRe)
垢版 |
2021/10/16(土) 13:55:14.29ID:Hx8OP0An0
>>398
> 分けすぎると逆に関数があっちこっちに分散してどれが何に使われているのか分かり辛くなる
関数にカーソル合わせて「Shift+F2」で定義箇所に飛べるよ
https://www.wordvbalab.com/code/2925/

まあ言語自体も開発環境も貧弱すぎるからまとめたくなっちゃう感覚はわかるけど
402デフォルトの名無しさん (ワッチョイ 6b01-Avck)
垢版 |
2021/10/16(土) 16:39:05.71ID:EZGI4ZK10
調べてもわからないのでお聞きしたいです

下の処理でtest3まで処理は正常に行われるんですが
mainに戻ったときに型の不一致でエラーが出て止まってしまいます。

Dim WS As Worksheet

Sub main()
Call test3(TEMP_SHEET)
End Sub

Function TEMP_SHEET() As Worksheet
Set TEMP_SHEET = ThisWorkbook.Worksheets("temp")
Set WS = TEMP_SHEET
End Function

Function test3() As Variant
With WS
.Select
.Cells(1, 1) = "test"
End With
End Function
2021/10/16(土) 16:51:56.90ID:a6cW1Kja0
test3()なのにcallで引数渡そうとしてる
2021/10/16(土) 17:03:21.91ID:cq/EQnSr0
VariantにはArrayとかも入るから ()付けても書式エラーにはならないのかな
2021/10/16(土) 17:06:32.68ID:eJomN4xc0
>>402
test3()は引数がないのに引数をわたそうとしている。

test3()は関数なのにy=test3(x)という構文ではなくてcallでtest3()を呼び出しいる。
2021/10/16(土) 17:09:51.40ID:cq/EQnSr0
test3の実行後にエラーになるのがこの質問のミソだと思うよ
2021/10/16(土) 17:43:21.23ID:nAOL9IkjM
>>402
そもそも「test3までは正常」というのが間違い
これではまったく動かない

とりあえず動くようにするなら、たとえばこう書けばいい
ほかにも色々なパターンが考えられるけど、何がやりたいのかよくわからないので

Dim WS As Worksheet

Sub main()
  Call TEMP_SHEET
  Call test3
End Sub

Sub TEMP_SHEET()
  Set WS = ThisWorkbook.Worksheets("temp")
End Sub

Sub test3()
  With WS
    .Select
    .Cells(1, 1) = "test"
  End With
End Sub
2021/10/16(土) 18:35:14.73ID:Pp6vdwK70
確かにこれではtest3は動かない
2021/10/16(土) 18:36:14.79ID:njPM+lzE0
>>402
test3まで処理が正常に行われたなら気にしなくていいんじゃね
2021/10/16(土) 18:46:34.14ID:m1u7MgLp0
ステップ実行させたら確かにtest3実行するな
こんなのコンパイルエラーで良いと思うんだが、なかなか興味深い
411デフォルトの名無しさん (ワッチョイ 6b01-Avck)
垢版 |
2021/10/16(土) 18:57:45.79ID:EZGI4ZK10
ありがとうございます!
test3はsubでよかったんですね。
参考にしながらいろいろ試したらできました。
すごく助かりました。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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