X



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


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


※前スレ
Excel VBA 質問スレ Part53
http://mevius.5ch.net/test/read.cgi/tech/1524823358/
0230デフォルトの名無しさん2018/06/11(月) 03:35:25.80ID:Yoq0VGap
現実と願望の区別が出来ない人がいるみたいだね。
それが進むとコンピュータ使うのなんて中小ぐらいしかないなどとなる。
0231デフォルトの名無しさん2018/06/11(月) 03:56:13.19ID:vx8oiu6e
派遣の人にさせる雑用事務仕事ならエクセルくらいしか使えないだろうから仕方ないかな
0232デフォルトの名無しさん2018/06/11(月) 07:19:30.73ID:z84MX3Hd
>>228
まさにこういう人の意見なんだけど、何をもってほとんど使わないと言ってるんだろう?
そんなにたくさんの会社を見てるの?
0233デフォルトの名無しさん2018/06/11(月) 07:39:59.32ID:fIKXCmX7
入力装置としては悪くないプラットフォームだと思う
もちろん神エクセルは論外だけど
小規模のテーブルデータをサクッと作るには便利
ただエクセルのままデータや文書として交換するのはやめてほしいね
0234デフォルトの名無しさん2018/06/11(月) 07:56:19.19ID:Yoq0VGap
>>231
お前より給料貰ってるけどな。

言い訳ばかりじゃたかが知れてる。
何を言っても零細は間違いというわけだ。
0235デフォルトの名無しさん2018/06/11(月) 08:03:09.89ID:z84MX3Hd
>>234
急に給料の話持ち出してどうしたの
0240デフォルトの名無しさん2018/06/11(月) 18:01:59.04ID:uMLVNrv/
フォームを使っていろいろ勉強しながら遊んでるんですが、コードが長ったらしくなるときはcallで別に書いてるんですが、functionの使いどころというかこういうときは絶対functionだ!ってあるんですか?
引数やら戻り値やらネットでみたりするけど使いどころがいまいちで...
0241デフォルトの名無しさん2018/06/11(月) 18:49:21.09ID:reMFgRN5
>>240
何度も呼び出す機能はfunction
同じ処理をコピペであちこちに書くと
直すとき大変ですし
スコープが狭くなると把握しやすくなるよね
0244デフォルトの名無しさん2018/06/11(月) 20:38:01.83ID:MCKH0IFJ
プロシャージャから呼ばれるものは原則ファンクション。とりあえずブーリアン型にしてtrueを返してるわ
プロシャージャはイベントハンドラと、ファンクションのデバッグ用くらいかなー
0248デフォルトの名無しさん2018/06/11(月) 23:00:58.03
値の戻し方だって
関数の戻り値か、ByRef引数か、グローバル変数か、セルか、テキストファイルかは自由自在
0252デフォルトの名無しさん2018/06/11(月) 23:43:56.97ID:ga7441Wg
関数のありがたみがわからない初心者のみんなは副作用、参照透過性、例外安全という観点で関数とプロシージャを比較してみよう
それだけでスキルアップだ
コードがグンと洗練されるぞ
やったね!
0253デフォルトの名無しさん2018/06/12(火) 05:17:47.61ID:UBgzW1A3
> 副作用、参照透過性、例外安全
最近覚えたので使いたくてしょうがないんだろうな w
頓珍漢過ぎて笑うしかないけど
0254デフォルトの名無しさん2018/06/12(火) 05:37:01.98ID:bL9bvKzR
いつも行と列がわからなくなるんだがいい覚え方ある?
列方向とか言われると頭が混乱する
0258デフォルトの名無しさん2018/06/12(火) 06:37:59.94ID:rsKFgPQp
>>254
今時ほとんど横書きだから「行」と言えば横方向でしょ
一行目って言われて縦読みする奴はあまりいないし w
0260デフォルトの名無しさん2018/06/12(火) 07:06:59.16ID:bL9bvKzR
ありがとうございます
これで行列を判別できそうです
0261デフォルトの名無しさん2018/06/12(火) 08:05:50.28ID:08LecQze
>>259
そのうち君にもわかる時が来る
めげずに勉強しよう
今はわからなくても大丈夫だ
0265デフォルトの名無しさん2018/06/12(火) 19:32:41.56ID:DCDELge2
まあ自分もほとんどがFunctionでSubは数えるほどだな。
Subを使うのは求める値を直接値として返すのはデカすぎるときとか。
0266デフォルトの名無しさん2018/06/13(水) 02:55:36.27ID:63Q03/Wf
値を戻す必要のある手続きならFunction
その必要がない手続きならSub

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

>>252
お前はVBAで、何と何を比較してるの?
0268デフォルトの名無しさん2018/06/13(水) 06:41:50.05ID:AbU9Bfwe
>>254
0270デフォルトの名無しさん2018/06/13(水) 07:47:19.69ID:xCQwBm/v
>>266
> 値を戻す必要のある手続きならFunction
> その必要がない手続きならSub
複数の値を返したい時は?

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

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

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

複数かどうかではなくそのプロシージャにとってどうあるべきかが重要。
0272デフォルトの名無しさん2018/06/13(水) 08:25:56.30
>>271
結局FunctionとSubの使い分けは値を返すかどうかなんかとは関係ないってことだよね
0277デフォルトの名無しさん2018/06/13(水) 10:20:33.97ID:IL7yIAnv
functionにした事で起こる副作用って何?
可読性とか、解析とかに影響が出るだけで、動作自体はfunctionが完全上位互換だと思ってたんだけど。
0279デフォルトの名無しさん2018/06/13(水) 11:59:36.53
SubにしろFunctionにしろ、あんまり分割しすぎるのはBASIC的ではないので、可能な限りGoSubを使いましょう
0280デフォルトの名無しさん2018/06/13(水) 19:45:28.16ID:MfFyOg3y
>>270
>>266
>> 値を戻す必要のある手続きならFunction
>> その必要がない手続きならSub
>複数の値を返したい時は?
関係ないものを複数返したいなら多くの場合は設計ミス
関数の責務が複数あると考えていい
関係のあるものを複数返したい場合はそれらを含む別のクラスが隠れているのかもね
何れにせよ複数返したいと思った時点で冷静に考えを整理すべき


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


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

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


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

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

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

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

>>286
> あれは、変換が可能かどうかと、変換した値という二つの処理をまとめてるから
どうみてもその処理はまとめるべきだろ
別々にやれと言うならちょっと頭おかしい
0288デフォルトの名無しさん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

で色の付いたセルの値をクリアしたいのですが、結合したセルからは値を消せない的なメッセージが出るのですが、結合しているセルに入っている値を消すにはどのようにすればよいかどなたか教えていただけませんでしょうか?
0289デフォルトの名無しさん2018/06/13(水) 22:51:21.44ID:QpS6R6sw
セルが結合されているかどうか調べて、結合していたら解除すれば?
0290デフォルトの名無しさん2018/06/14(木) 03:03:05.09
>>288
C.MergeArea(1).ClearContents
0293デフォルトの名無しさん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ブロックが、、というエラーが代わりにでてきてしまいます。
0295デフォルトの名無しさん2018/06/15(金) 21:03:46.01ID:0/vjvM+E
列番号を取得したいだけならSetはいらない

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

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

と書かないと
0297デフォルトの名無しさん2018/06/15(金) 21:30:16.61ID:Tyymqq5a
関係無いとも思うけど、顧客コードを検索して見つからなかったらエラー出るぞ。
まずFindまでをオブジェクトに代入し、代入されたオブジェクトがNothingかどうかをチェックすべき。
0299デフォルトの名無しさん2018/06/15(金) 21:44:35.90ID:CUf60DnA
どうしたお前ら
いつになくまともやんけ
0301デフォルトの名無しさん2018/06/15(金) 22:09:24.98ID:GmHYQ4ab
あーなんだ
もうSubとFunctionの話は終わっちゃったのか
ちょっと来るのが遅かったな
0302デフォルトの名無しさん2018/06/15(金) 22:23:49.95ID:Z5uPnQ18
>>294
列番号ほしくてColumn付けてたんですよねー
でもSetなくしたらとりあえず実行できました・・・なんでできるようになったのか謎です

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

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



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

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

今はこんなことしないのかな。
0305デフォルトの名無しさん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という数値と同じ)

型は指定した方がいいと思います。
0306デフォルトの名無しさん2018/06/15(金) 22:56:21.89ID:Z5uPnQ18
>>305
単純に変数宣言したかっただけです;;

意味合いとしては、

「処理を続行しますか?」→OKだったら最初のユーザーフォームを起動させて転記する。
                →Cancelだったら転記をしてプログラムを終了。
という感じなのですが。。
0307デフォルトの名無しさん2018/06/15(金) 23:05:16.76ID:ft7Lb6/j
プロパティとメソッドの違いがわかりません
判別する方法とかあるんでしょうか
0312デフォルトの名無しさん2018/06/16(土) 09:50:15.71ID:4sxbGcVv
>>310
本で見て疑問だったので笑
0313デフォルトの名無しさん2018/06/16(土) 11:32:54.10ID:XHohijVT
>>307
シンタックスシュガーというやつだよ
違いはあるともないともどっちともいえる
0314デフォルトの名無しさん2018/06/16(土) 13:33:23.98ID:HgejND06
シンタックス・ショッカーだって!?
0316デフォルトの名無しさん2018/06/16(土) 15:27:03.33ID:xcNKL0YA
>>303
クオーテーションマークでコメントアウトが出来ますので、どこでどのような処理をしたいのか書いておくと良いかもしれません。

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

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

書き慣れるまでは変数宣言は上部にまとめておくのも一つの手かと思います。
0317デフォルトの名無しさん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
0320デフォルトの名無しさん2018/06/16(土) 16:44:06.49ID:IDYLbmOn
この程度でもお金が発生するんだから知識の安売りしちゃダメだよね
0322デフォルトの名無しさん2018/06/16(土) 17:52:11.74ID:65EvhanH
日本企業は外注には何十万、何百万も払うのに自社の社員が書いたものはタダだと考えてる。
0323デフォルトの名無しさん2018/06/16(土) 18:37:23.14ID:XHohijVT
>>317
本題からはそれるけど、セルを塗りつぶすってのはセルの背景色を直接指定するんじゃなくて
条件付き書式にした方がいいと思うよ。
つまり該当セルに「1」とかの値を入力すると勝手に赤い背景色になるようにしとく。
値ならあとで利用しやすいからね。
0324デフォルトの名無しさん2018/06/16(土) 18:43:20.62ID:Hq2zWLFU
>>322
VBAごときに価値はない
0325デフォルトの名無しさん2018/06/16(土) 19:00:05.51ID:65EvhanH
>>324
VBAスレで吠えるトンスルランドの寄生虫WW
0326デフォルトの名無しさん2018/06/16(土) 19:06:20.60ID:gJMjB7oX
>>323
そしてセル数のぶんだけ重くなる。
規模によるけどね。
色付けても検索とか抽出とか面倒なだけだから自分なら記号でも埋めるかな。
色付けるとすれば視認性をあげるためのオマケ。
0327デフォルトの名無しさん2018/06/16(土) 19:11:09.71ID:Bzc+Z3iP
わかったつもりになってUIを根底から否定してしまったプロさんw
0330デフォルトの名無しさん2018/06/16(土) 19:27:58.07ID:+7qeuaiQ
アマチュア事務員VBAerしかいない中小企業なんてこんなもんでしょう
■ このスレッドは過去ログ倉庫に格納されています

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