- ベストアンサー
Excel VBAのコード記入を効率化する方法
- VBA初心者がコード記入を効率化するために、Sheetの選択とcheckboxの処理を短くする方法を教えてください。
- Sheetの選択に関して、複数のsheetを移動させる際に、範囲指定で処理を行う方法があるかどうか教えてください。
- checkboxの真偽に応じて処理を分岐させる際に、CheckBoxの番号を変数宣言して処理を行う方法があるかどうか教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
(1)ようするに、Array関数は要素を一つ一つ指定しなければいけないので、範囲で指定できないか、ということですよね? 無い関数は作ってしまえば良いので、 「範囲(最小値と最大値)を与えると、連続した配列を返す」関数を作ってはどうでしょうか。 たとえば以下サンプルです。 ----------------------- Private Function ArraySeq(Min As Integer, Max As Integer) As Variant Dim intValue() As Integer Dim intCnt As Integer ReDim intValue(Max - Min) For intCnt = Min To Max intValue(intCnt - Min) = intCnt Next intCnt ArraySeq = intValue End Function ----------------------- 上記を適当な場所(末尾など)に貼り付けておくと、 Worksheets(Array(21, 22, 23, 24)) と書く代わりに Worksheets(ArraySeq(21, 24)) と書けばよくなります。 ※ MaxよりMinが大きい場合のチェックなど、必要に応じて追加してください。 ちなみに蛇足かもしれませんが、書かれたコードは「シートが21枚を超えたら、超えた分のシートを移動」という処理でしょうか。 もしそうなら、Select文の部分は以下のようにも書けます。 ----------------------- If Worksheets.Count > 21 Then Worksheets(ArraySeq(21, Worksheets.Count - 1)).Move End If ----------------------- これでシートが100枚あっても対応可能です。 (2)VBなら便利な「コントロール配列」というのがあるのですが…。 Controls コレクションを使うという手もありますが、解りやすく手っ取り早い方法として、チェックボックスを配列変数に割り当て(代入)してしまうのが簡単だと思います。 ----------------------- Dim chkTest(2) As Control Set chkTest(0) = CheckBox1 Set chkTest(1) = CheckBox2 Set chkTest(2) = CheckBox3 For intCnt = 0 To 2 If chkTest(intCnt).Value Then MsgBox (chkTest(intCnt).Name & " はオンです。") Else MsgBox (chkTest(intCnt).Name & " はオフです。") End If Next intCnt ----------------------- はじめにSet文がチェックボックスの数だけ必要なのが難点ですが、これははじめに1回だけ行えばいいので、場合によってはFormLoadイベントでフォームを開いた直後にやってしまうのも手です。 ちなみにまた蛇足ですが、 If UserForm_001open.CheckBox1.Value = True Then ↑上記について、True = True は True なので、 If UserForm_001open.CheckBox1.Value Then と書くだけで良いです。
お礼
まず最初に返事が送れたことをお詫び申し上げます。function Control宣言や変数の有効期限(範囲)等調べてからお礼をかねて質問するつもりでしたが、手間を取り遅れてしまいました。(言い訳ですね) 丁寧な回答に対し礼を欠き申し訳ありませんでした。 ArreySeqは非常に助かりました。おかげでコードがとても短くなり、例外対応も可能となりました。 Redim を"再設定"と勝手に思い込んでしまい理解が遅れてしまいました。「動的配列のサイズ」を変数にして、それを基準に範囲を指定するのですね。(2)の chktest(0)~(2)の意味が解ったのと併せてやっと理解が出来ました。 (2)に関しては CheckBox 等を変数にするには Controlで変数宣言するということなのですね CheckBox" & a & "と書ければ便利だなと思ったのです。ちなみに他の人の質問に対する回答に If Controls("OptionButton" & a).Value = True とあったので 試したがうまくいかなかったので、どうすればよいのか質問させていただきました。 1つの質問で、何倍もの事を知ることが出来ました。コツコツと順序立てて学ぶ時間と環境がなく、つまみ食いのようなことばかりしてますのでこのお礼自体、内容理解が間違っているかもしれませんが、また機会がありましたらご指導願います。