Excel VBA 質問スレ Part54

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/05/26(土) 20:37:37.74ID:Lty78diJ
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK


最近プロによる書き込みが多々見うけられますが
彼らに絡むと話がこじれるので質問したい方は適当にスルーしてください


※前スレ
Excel VBA 質問スレ Part53
http://mevius.5ch.net/test/read.cgi/tech/1524823358/
2018/06/11(月) 18:49:21.09ID:reMFgRN5
>>240
何度も呼び出す機能はfunction
同じ処理をコピペであちこちに書くと
直すとき大変ですし
スコープが狭くなると把握しやすくなるよね
2018/06/11(月) 19:01:52.91ID:ga7441Wg
>>240
むしろ関数の方が基本
ここぞというところだけプロシージャ
2018/06/11(月) 20:23:25.35ID:Jd6lebUg
>>242
戻りが必要なときがFunctionだと思ってた。
「ここぞ」ってどんなとき?
2018/06/11(月) 20:38:01.83ID:MCKH0IFJ
プロシャージャから呼ばれるものは原則ファンクション。とりあえずブーリアン型にしてtrueを返してるわ
プロシャージャはイベントハンドラと、ファンクションのデバッグ用くらいかなー
2018/06/11(月) 21:11:25.77ID:Jd6lebUg
>>244
ProcからSubProcを呼ぶのは邪道ってこと?
2018/06/11(月) 21:29:44.32ID:WRNhFr5s
ほとんど哲学の話だから気にしなくていいよ
2018/06/11(月) 23:00:51.68ID:IkuRhDJZ
>>240
馬鹿は死ねよ
248デフォルトの名無しさん
垢版 |
2018/06/11(月) 23:00:58.03
値の戻し方だって
関数の戻り値か、ByRef引数か、グローバル変数か、セルか、テキストファイルかは自由自在
2018/06/11(月) 23:08:19.54ID:VLKc0T55
>何度も呼び出す機能はfunction
さすがプロは違うなあ
2018/06/11(月) 23:20:37.50ID:ToxnEFH5
>>248
Document Properyもね。
2018/06/11(月) 23:21:58.92ID:ToxnEFH5
>>248
Document Properyもね。
>>250
あちゃ、Properyってなんだ?
2018/06/11(月) 23:43:56.97ID:ga7441Wg
関数のありがたみがわからない初心者のみんなは副作用、参照透過性、例外安全という観点で関数とプロシージャを比較してみよう
それだけでスキルアップだ
コードがグンと洗練されるぞ
やったね!
2018/06/12(火) 05:17:47.61ID:UBgzW1A3
> 副作用、参照透過性、例外安全
最近覚えたので使いたくてしょうがないんだろうな w
頓珍漢過ぎて笑うしかないけど
254デフォルトの名無しさん
垢版 |
2018/06/12(火) 05:37:01.98ID:bL9bvKzR
いつも行と列がわからなくなるんだがいい覚え方ある?
列方向とか言われると頭が混乱する
2018/06/12(火) 06:10:19.11ID:08LecQze
>>253
初心者くん
お勉強は大事だぞ
2018/06/12(火) 06:30:13.12ID:ujVgl+Aq
>>254
Row
Column
それぞれの先頭文字見たら
2018/06/12(火) 06:33:02.24ID:ujVgl+Aq
>>254
途中で書き込んでしまった

https://lambdalisue.hatenablog.com/entry/2013/07/18/134507

見ろ
2018/06/12(火) 06:37:59.94ID:rsKFgPQp
>>254
今時ほとんど横書きだから「行」と言えば横方向でしょ
一行目って言われて縦読みする奴はあまりいないし w
2018/06/12(火) 06:39:41.54ID:rsKFgPQp
頓珍漢なお勉強した結果 ⇒ >>255 w
260デフォルトの名無しさん
垢版 |
2018/06/12(火) 07:06:59.16ID:bL9bvKzR
ありがとうございます
これで行列を判別できそうです
2018/06/12(火) 08:05:50.28ID:08LecQze
>>259
そのうち君にもわかる時が来る
めげずに勉強しよう
今はわからなくても大丈夫だ
2018/06/12(火) 08:19:29.16ID:DCDELge2
constがないから効果半減だぞ
2018/06/12(火) 12:25:55.59ID:rsKFgPQp
>>261
ごめんねー、頓珍漢な勉強なんてしたくないから w
2018/06/12(火) 16:53:42.24ID:uqGpbG9r
>>254
長文は3行にまとめろ
この時「3列に」とは言わない
これが行と列の違い
2018/06/12(火) 19:32:41.56ID:DCDELge2
まあ自分もほとんどがFunctionでSubは数えるほどだな。
Subを使うのは求める値を直接値として返すのはデカすぎるときとか。
2018/06/13(水) 02:55:36.27ID:63Q03/Wf
値を戻す必要のある手続きならFunction
その必要がない手続きならSub

原則的にはこれしかないわけだが
Functionの戻り値以外で値を返す手続きは例外的なものに限るべき

>>252
お前はVBAで、何と何を比較してるの?
2018/06/13(水) 03:53:54.39ID:g5iHfrqr
>>266
あぁ、それなら認識通りだわ。邪道なのかと思った。
268デフォルトの名無しさん
垢版 |
2018/06/13(水) 06:41:50.05ID:AbU9Bfwe
>>254
2018/06/13(水) 06:45:07.28ID:a6LcHevh
>>268
横だが、それいいね。今目に焼き付いたわ
2018/06/13(水) 07:47:19.69ID:xCQwBm/v
>>266
> 値を戻す必要のある手続きならFunction
> その必要がない手続きならSub
複数の値を返したい時は?

> Functionの戻り値以外で値を返す手続きは例外的なものに限るべき
C# の TryParse() 系の奴は例外的だと言う主張ですか?

> お前はVBAで、何と何を比較してるの?
そいつには触れない方がいいかと
2018/06/13(水) 08:03:40.57ID:rWAWAyN4
配列かユーザー定義、あとは引数を参照にして引数で返すとか。
そのプロシージャの内容で変える。

クラスにするとか場合によっちゃコレクションに複数のクラスを入れて返すとか配列を配列に入れて返すとかする場合も。

複数かどうかではなくそのプロシージャにとってどうあるべきかが重要。
272デフォルトの名無しさん
垢版 |
2018/06/13(水) 08:25:56.30
>>271
結局FunctionとSubの使い分けは値を返すかどうかなんかとは関係ないってことだよね
2018/06/13(水) 08:33:38.51ID:P6ISw7WJ
例外もあるってだけで原則は>>266じゃないのか
2018/06/13(水) 09:00:39.02ID:Dklmt2kz
>>242,>>244,>>252
sub も function も両方ともプロシージャです
2018/06/13(水) 09:44:34.86ID:aJvJT0ED
副作用あるならsubでないならfunction
2018/06/13(水) 09:59:08.35ID:bw/iOSvB
副作用が一切ないSub
2018/06/13(水) 10:20:33.97ID:IL7yIAnv
functionにした事で起こる副作用って何?
可読性とか、解析とかに影響が出るだけで、動作自体はfunctionが完全上位互換だと思ってたんだけど。
2018/06/13(水) 10:34:42.38ID:U79y3YwB
どうせグローバル変数弄るんだから、どっちも同じだろ?
279デフォルトの名無しさん
垢版 |
2018/06/13(水) 11:59:36.53
SubにしろFunctionにしろ、あんまり分割しすぎるのはBASIC的ではないので、可能な限りGoSubを使いましょう
2018/06/13(水) 19:45:28.16ID:MfFyOg3y
>>270
>>266
>> 値を戻す必要のある手続きならFunction
>> その必要がない手続きならSub
>複数の値を返したい時は?
関係ないものを複数返したいなら多くの場合は設計ミス
関数の責務が複数あると考えていい
関係のあるものを複数返したい場合はそれらを含む別のクラスが隠れているのかもね
何れにせよ複数返したいと思った時点で冷静に考えを整理すべき


>> Functionの戻り値以外で値を返す手続きは例外的なものに限るべき
>C# の TryParse() 系の奴は例外的だと言う主張ですか?
いいとおもうよ
あれはパフォーマンス追求するときと並列処理、相互運用ぐらいにしか使わん
実際にref/outを使う標準ライブラリはほとんどない
ParseやTryGetValueは使用頻度が高く、例外でエラー通知するのはオーバーヘッドがあるからoutにするメリットの方が大きいと考えられて例外的に導入されたもの


>> お前はVBAで、何と何を比較してるの?
>そいつには触れない方がいいかと
2018/06/13(水) 20:25:33.06ID:xCQwBm/v
>>280
> 何れにせよ複数返したいと思った時点で冷静に考えを整理すべき
で、結局どうするのさ?

> あれはパフォーマンス追求するときと並列処理、相互運用ぐらいにしか使わん


> ParseやTryGetValueは使用頻度が高く
結局よく使うのか使わないのかはっきりしろよ w
無理矢理反論してるのがバレバレだぞ
2018/06/13(水) 21:02:10.70ID:0T3bSaKS
入れる穴が複数あるのに出す穴が1つってのが間違ってるんだよ
だから入れる穴から出す
283デフォルトの名無しさん
垢版 |
2018/06/13(水) 21:10:06.85ID:qak7HNFr
もはやプロさんによるプログラミング脱初心者講座
エクセルマクロはどこいったんや
ほんま役に立たんプロさんばかりやなw
2018/06/13(水) 22:26:11.41ID:OXky9+iL
>>281
もう少し理解力つけよう
285デフォルトの名無しさん
垢版 |
2018/06/13(水) 22:29:45.50ID:IQOPO94p
もう全部参照渡しやっとけば?
2018/06/13(水) 22:35:46.81ID:63Q03/Wf
>>270
あれはあくまでもVBAでのSubとFunctionの使い分けの指針な

>複数の値を返したい時は?
複数の値を返したい時点で例外的な処理だと思った方がいい
複数の値が必要なら、複数の値をまとめた「何か」を一つ返すのが原則
まあ実際はそうガチガチにはやらんけどな

>C# の TryParse() 系の奴は例外的だと言う主張ですか?
まあ、例外的
あれは、変換が可能かどうかと、変換した値という二つの処理をまとめてるから

>>274
おれもそう思ってはいるが
VBAにはいまでもGoSub Return ってのがあるからなぁ
2018/06/13(水) 22:44:58.50ID:fGM4jS90
>>284
説明も反論もできないなら黙ってろよ w

>>286
> あれは、変換が可能かどうかと、変換した値という二つの処理をまとめてるから
どうみてもその処理はまとめるべきだろ
別々にやれと言うならちょっと頭おかしい
2018/06/13(水) 22:45:26.77ID:p7d4mVR0
Sub 色の付いたセルの値をクリア()
Dim C As Range
For Each C In ActiveSheet.Range("A1:J25")
If C.Interior.ColorIndex = 15 Then
C.ClearContents
End If
Next
End Sub

で色の付いたセルの値をクリアしたいのですが、結合したセルからは値を消せない的なメッセージが出るのですが、結合しているセルに入っている値を消すにはどのようにすればよいかどなたか教えていただけませんでしょうか?
2018/06/13(水) 22:51:21.44ID:QpS6R6sw
セルが結合されているかどうか調べて、結合していたら解除すれば?
290デフォルトの名無しさん
垢版 |
2018/06/14(木) 03:03:05.09
>>288
C.MergeArea(1).ClearContents
2018/06/14(木) 06:45:04.65ID:6PgoTBhO
結合セルはバグの温床
2018/06/14(木) 07:28:41.46ID:/1DDiwrg
神エクセルへの反逆は許されない
事務員さんに信仰を捧げよ
2018/06/15(金) 20:24:29.69ID:Z5uPnQ18
はじめまして
最近vbaでマクロ書くようになりました

Dim lastcol
Dim kokyaku

lastcol = Cells(2, Columns.Count).End(xlToLeft).Column
Set kokyaku = Range(Cells(2, 4), Cells(2, lastcol)).Find(顧客コード).Column

上記はマクロの一部分なのですがこれのColumnでオブジェクトが必要ですというエラーでるのですがどうしたらいいでしょうか。
ちなみにSetをとるとオブジェクト変数およびwithブロックが、、というエラーが代わりにでてきてしまいます。
2018/06/15(金) 21:03:09.72ID:duszHly5
>>293
これならエラーが出ないと思うけど
Set kokyaku = Range(Cells(2, 4), Cells(2, lastcol))
2018/06/15(金) 21:03:46.01ID:0/vjvM+E
列番号を取得したいだけならSetはいらない

顧客コードは変数なの?
変数じゃなく「顧客コード」という文字列を検索したいなら

.Find(顧客コード)
ではなく
.Find("顧客コード")

と書かないと
2018/06/15(金) 21:08:13.48ID:oSOtMGkA
Cellsの使い方が間違ってるんじゃないかね
2018/06/15(金) 21:30:16.61ID:Tyymqq5a
関係無いとも思うけど、顧客コードを検索して見つからなかったらエラー出るぞ。
まずFindまでをオブジェクトに代入し、代入されたオブジェクトがNothingかどうかをチェックすべき。
2018/06/15(金) 21:31:06.68ID:Tyymqq5a
あと、変数は全て型指定すること。
299デフォルトの名無しさん
垢版 |
2018/06/15(金) 21:44:35.90ID:CUf60DnA
どうしたお前ら
いつになくまともやんけ
2018/06/15(金) 21:59:24.92ID:7Mvej+nq
よくこんな馬鹿を相手にするな
2018/06/15(金) 22:09:24.98ID:GmHYQ4ab
あーなんだ
もうSubとFunctionの話は終わっちゃったのか
ちょっと来るのが遅かったな
2018/06/15(金) 22:23:49.95ID:Z5uPnQ18
>>294
列番号ほしくてColumn付けてたんですよねー
でもSetなくしたらとりあえず実行できました・・・なんでできるようになったのか謎です

>>295
顧客コードは変数です
ユーザーフォームで入力させてそれを判別してるような形をとっています

>>300
初めて1週間ですみませんorz



型式って指定したほうがやっぱりいいんですか・・
もう1つ悩んでることあるのでちょっと書かせてください
2018/06/15(金) 22:30:35.92ID:Z5uPnQ18
ユーザーフォームで顧客コードを検索してそれを別ブックに転記したいんですけどうまくいきません
繰り返し文だと i=0 To 5 みたいに回数を決めないと思いまして、代わりにdo until使ってるんですけどバグっちゃって・・
参考にコードと表のSS貼っておきます
ご教授願います

ttps://gyazo.com/08befaf20d8d06c1c09571710d6614b6
ttp://textuploader.com/dp3p2
304デフォルトの名無しさん
垢版 |
2018/06/15(金) 22:44:11.72ID:bCJKcbox
確かウィンドウをサブクラス化し
てコールバック関数でゴニョゴニョ、、、
なんたらする時メモリーの番地が、あーたらで
それでふんくちおnを使うんだったような??。

今はこんなことしないのかな。
2018/06/15(金) 22:46:52.27ID:VwsEC8QK
Dim i
i = 0
Dim kekka
Do Until kekka = vbCancel

この辺が意味不明です。
i=0
だと定数みたいになってる。
kekkaも値自体が入ってないのに、do until kekka =2と書かれても。
(vbcancelは組込定数なので、2という数値と同じ)

型は指定した方がいいと思います。
2018/06/15(金) 22:56:21.89ID:Z5uPnQ18
>>305
単純に変数宣言したかっただけです;;

意味合いとしては、

「処理を続行しますか?」→OKだったら最初のユーザーフォームを起動させて転記する。
                →Cancelだったら転記をしてプログラムを終了。
という感じなのですが。。
307デフォルトの名無しさん
垢版 |
2018/06/15(金) 23:05:16.76ID:ft7Lb6/j
プロパティとメソッドの違いがわかりません
判別する方法とかあるんでしょうか
2018/06/15(金) 23:10:48.49ID:URw708AY
>>307
MSDNを丸暗記する
2018/06/16(土) 01:03:53.77ID:8TxUkyvA
>>307
一度新幹線に跳ねられてみればわかるかもよ
2018/06/16(土) 01:50:39.19ID:XLWdx7iL
>>307
判別して何がしたいの。
VBAなら深く意識しなくて困る事がないんだけど。
2018/06/16(土) 08:49:31.66ID:SRZbv2U9
Propertyとあるのがプロパティ
そうじゃないのがメソッドだ
312デフォルトの名無しさん
垢版 |
2018/06/16(土) 09:50:15.71ID:4sxbGcVv
>>310
本で見て疑問だったので笑
313デフォルトの名無しさん
垢版 |
2018/06/16(土) 11:32:54.10ID:XHohijVT
>>307
シンタックスシュガーというやつだよ
違いはあるともないともどっちともいえる
314デフォルトの名無しさん
垢版 |
2018/06/16(土) 13:33:23.98ID:HgejND06
シンタックス・ショッカーだって!?
2018/06/16(土) 13:40:50.38ID:YKnMAv2c
板を荒らすなよ
2018/06/16(土) 15:27:03.33ID:xcNKL0YA
>>303
クオーテーションマークでコメントアウトが出来ますので、どこでどのような処理をしたいのか書いておくと良いかもしれません。

>ユーザーフォームで顧客コードを検索して
UserForm.Valueで入力された値を参照してから該当の表内に検索をかけることになるでしょう。

>Do Until 文
Do Loop文の中でIf kekka = vbOK Thenがコメントアウトになってますのでこれは機能しません。
また、Loopを記述するより先にEnd ifで完結させないとエラーが出るはずです。

書き慣れるまでは変数宣言は上部にまとめておくのも一つの手かと思います。
317デフォルトの名無しさん
垢版 |
2018/06/16(土) 16:15:37.97ID:6YhuS6G/
サーバーに入ってきた仕事の素材を連番のフォルダを手動で管理しております
現在画像のような感じにサーバーに素材が入ったのを確認したらとなりのセルを塗りつぶすというのを手動で管理しています
それを特定のフォルダをexcelで監視させて新しいフォルダが入ったらとなりのセルを
自動で塗りつぶす、ということをvbaではできないでしょうか

可能であればコードも教えていただければ幸いです

画像url↓
https://dotup.org/uploda/dotup.org1560186.jpg
https://dotup.org/uploda/dotup.org1560191.jpg
2018/06/16(土) 16:20:58.56ID:IAJ7RXOb
Excelで管理する意味がわからない
2018/06/16(土) 16:27:38.13ID:+7qeuaiQ
そこにエクセルがあるからさ
2018/06/16(土) 16:44:06.49ID:IDYLbmOn
この程度でもお金が発生するんだから知識の安売りしちゃダメだよね
2018/06/16(土) 16:47:32.62ID:gJMjB7oX
>>317
Dir関数
322デフォルトの名無しさん
垢版 |
2018/06/16(土) 17:52:11.74ID:65EvhanH
日本企業は外注には何十万、何百万も払うのに自社の社員が書いたものはタダだと考えてる。
323デフォルトの名無しさん
垢版 |
2018/06/16(土) 18:37:23.14ID:XHohijVT
>>317
本題からはそれるけど、セルを塗りつぶすってのはセルの背景色を直接指定するんじゃなくて
条件付き書式にした方がいいと思うよ。
つまり該当セルに「1」とかの値を入力すると勝手に赤い背景色になるようにしとく。
値ならあとで利用しやすいからね。
324デフォルトの名無しさん
垢版 |
2018/06/16(土) 18:43:20.62ID:Hq2zWLFU
>>322
VBAごときに価値はない
325デフォルトの名無しさん
垢版 |
2018/06/16(土) 19:00:05.51ID:65EvhanH
>>324
VBAスレで吠えるトンスルランドの寄生虫WW
2018/06/16(土) 19:06:20.60ID:gJMjB7oX
>>323
そしてセル数のぶんだけ重くなる。
規模によるけどね。
色付けても検索とか抽出とか面倒なだけだから自分なら記号でも埋めるかな。
色付けるとすれば視認性をあげるためのオマケ。
327デフォルトの名無しさん
垢版 |
2018/06/16(土) 19:11:09.71ID:Bzc+Z3iP
わかったつもりになってUIを根底から否定してしまったプロさんw
2018/06/16(土) 19:12:46.39ID:RfKOBpI2
>>317
開始時刻から終了時刻まで一定間隔でマクロを実行するには?
http://www.max.hi-ho.ne.jp/happy/YNxv9c134.html
を使って
>>321のDir関数を使って指定のフォルダをチェック
みたいな感じで
2018/06/16(土) 19:17:02.30ID:8TxUkyvA
>>317
こんな馬鹿に管理させる馬鹿会社があるのか
2018/06/16(土) 19:27:58.07ID:+7qeuaiQ
アマチュア事務員VBAerしかいない中小企業なんてこんなもんでしょう
331デフォルトの名無しさん
垢版 |
2018/06/16(土) 21:07:12.41ID:XHohijVT
>>326
>そしてセル数のぶんだけ重くなる。
332デフォルトの名無しさん
垢版 |
2018/06/16(土) 21:08:34.68
条件付き書式だらけのワークブックなんて開くのもしんどいわw
333デフォルトの名無しさん
垢版 |
2018/06/16(土) 21:19:39.41ID:XHohijVT
>>332
条件付き書式「だらけ」?
ひとつで十分だよね?
334デフォルトの名無しさん
垢版 |
2018/06/16(土) 21:51:48.05
>>333
ああ、>>323>>317の個別の事例に特化した話だけをしていたってわけね
俺は(恐らく>>326も)てっきり>>323は一般論を話しているものと思ったよ
「本題とはそれるけど」って書いてあったからかなあ

一般論としてはセルの背景色は条件付き書式で塗りつぶすべきなんていう馬鹿な話はないから
2018/06/16(土) 22:01:21.03ID:XHohijVT
>>334
そりゃだって>>317の画像で言えばB列に条件付き書式を設定すれば十分だし、
色はおまけで値で管理したいだろう?
2018/06/16(土) 22:05:25.26ID:wwpjubpj
>>334
Excelの操作(データ整理など)で、
条件付き書式でセルの文字色や背景色を変更するのは一般的なことだと思ってたんだが、どういう点がバカなんだろ?
2018/06/16(土) 22:06:33.94ID:wwpjubpj
おっと、IDを消してる人にレスしてしまった…
2018/06/16(土) 22:13:39.48ID:+7qeuaiQ
アマチュア事務員さんの一般論とプロの一般論は異なるということだね
プロはセルに一個一個色を設定するなんてめんどくさいことはしないよ

状態が1つ変わるたびに別の状態を同期させるようなコードは手続き的で非常にメンテナンスしにくい
まずは問い合わせで解決することを考えよう
これを覚えてまた1つ賢くなったね事務員さん
2018/06/16(土) 22:21:41.19ID:KM0PBFsq
自分で考えない馬鹿には何を教えてもムダ
340デフォルトの名無しさん
垢版 |
2018/06/16(土) 22:29:39.05ID:FpzMctyH
今のエクセルは下手なVBAerが組んだらゴミの山生成するから気をつけたほうがいいのは間違いない
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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