Excel VBAのコード記入を効率化する方法

このQ&Aのポイント
  • VBA初心者がコード記入を効率化するために、Sheetの選択とcheckboxの処理を短くする方法を教えてください。
  • Sheetの選択に関して、複数のsheetを移動させる際に、範囲指定で処理を行う方法があるかどうか教えてください。
  • checkboxの真偽に応じて処理を分岐させる際に、CheckBoxの番号を変数宣言して処理を行う方法があるかどうか教えてください。
回答を見る
  • ベストアンサー

コード記入の効率化のために

VBA初心者です。今まで自動マクロ以上のことをしていなかったのですが、最近コード記入を始めたところ、その便利さに驚いております。 今作成しているマクロにて処理記入がとても長くなるのでどうしたらよいか試しているのですがうまくいきません。 excel VBA に関して2件ご質問いたしますのでご教授お願いします。 (1)Sheetの選択に関して、1つの新規bookの複数のsheetを移動させたいので下記のようにコードを書きましたが、sheet数の条件毎に処理を書くと下記の様に長くなってしまいます。 Select Case Worksheets.Count Case Is = 22 Worksheets(21).Move Case Is = 23 Worksheets(Array(21, 22)).Move Case Is = 24 Worksheets(Array(21, 22, 23)).Move Case Is = 25 Worksheets(Array(21, 22, 23, 24)).Move そこで、変数宣言して WorkSheets(a) ~ WorkSheets(b) と出来るのでしょうか? 個別指定でなく、範囲指定する方法があるのならお教えください。 (2) checkbox1 checkbox2 それぞれの真偽ごとに処理を分岐するのに If UserForm_001open.CheckBox1.Value = True Then Worksheets("sheet1").Copy before:= _ Worksheets("back") 上記のようにcheckbox毎に処理を記入するのでなく、CheckBoxの番号を変数宣言して、上記のコードの挿入する方法があればお教えください。 質問が長くなりましたが、いかにコードを短く、整理されたものにするかに注意して勉強しております。ぜひご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • taseki
  • ベストアンサー率66% (155/233)
回答No.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 と書くだけで良いです。

snobman3
質問者

お礼

 まず最初に返事が送れたことをお詫び申し上げます。function Control宣言や変数の有効期限(範囲)等調べてからお礼をかねて質問するつもりでしたが、手間を取り遅れてしまいました。(言い訳ですね) 丁寧な回答に対し礼を欠き申し訳ありませんでした。 ArreySeqは非常に助かりました。おかげでコードがとても短くなり、例外対応も可能となりました。 Redim を"再設定"と勝手に思い込んでしまい理解が遅れてしまいました。「動的配列のサイズ」を変数にして、それを基準に範囲を指定するのですね。(2)の chktest(0)~(2)の意味が解ったのと併せてやっと理解が出来ました。 (2)に関しては CheckBox 等を変数にするには Controlで変数宣言するということなのですね CheckBox" & a & "と書ければ便利だなと思ったのです。ちなみに他の人の質問に対する回答に If Controls("OptionButton" & a).Value = True とあったので 試したがうまくいかなかったので、どうすればよいのか質問させていただきました。  1つの質問で、何倍もの事を知ることが出来ました。コツコツと順序立てて学ぶ時間と環境がなく、つまみ食いのようなことばかりしてますのでこのお礼自体、内容理解が間違っているかもしれませんが、また機会がありましたらご指導願います。

関連するQ&A

  • 他のExcelファイルのVBAコードを検索したい

    他のExcelファイルに書かれたVBAコードに、ある特定のキーワード(パス名など)が使われているかを自動的に調べるためのVBAを書きたいと思っています。 仕事で使っているマクロが書かれたExcelファイルからある特定の処理をしているマクロを含むものを検索したいのですが、検索するExcelファイルが膨大なため、順番にExcelファイルを開いてVBAコードをチェックしていく工程をマクロ化したいのです。ファイルを順に開いていく処理はマクロ化できるのですが、書かれたVBAコードのチェックをどうしたらよいか悩んでいます。 「VBAコードに対して検索する」または「VBAコードを1行ずつ変数に代入する」、「モジュールシートをテキストファイルに出力する」などの処理が自動化できれば対応できそうなのですが、そのような処理をExcelVBAで作成できるでしょうか。 なお環境はWindowsXPのExcel2003です。 よろしくお願いいたします。

  • VBAでのエラーです・・。

    最近VBAマクロを本を片手に勉強しています。シートを選択するVBAを作っていて次のような記述ができないのか考えています。 dim A as String A = "sheet2,sheet3" Sheets(Array(A)).select とやると、Arrayの行で「インデックスが・・・」というエラーで落ちます。Arrayを変数で指定することができないのですが・・。なにか記述に問題があるのでしょうか?(変数Aに"sheet2", "sheet3"と値が入るようにしても結果はNGでした・・。) 宜しくお願いします。

  • エクセル:VBA:マクロコード

    エクセルVBAで、 (質問1) マクロでsheet1のデータを処理して、sheet2に結果を表示するマクロで最初にsheet2をクリアーするというのはどうコードしますか。 (質問2) マクロでsheet1のセル/データを使ったりsheet2のセル/データを使ったりしますが、データはどう切り替えるのですか。 常に今どちらのシートのことを問題にしているか宣言するのですか。 その場合、 例えば今sheet1を扱ってるとした場合にsheet2のデータCells(10, "D")をsheet1のセルCells(10, "D")に入れる場合、 Cells(10, "D")=Sheets("sheet2").Cells(10, "D")こうなりますか。

  • VBA 表示してあるシートのみ作業グループにしてC3に文字を記入。

    VBA 表示してあるシートのみ作業グループにしてC3に文字を記入。 お世話になっております。 VBAにて表示してあるシートのみ作業グループにしてC3に文字を入れるマクロをくみたいのですが 作業グループのところが上手くいきません。 下記のコードに何を加えれば作業グループになるのでしょうか? *注意点* 1)作業グループにするシートはブックによって枚数が違います。 2)シートを非表示にしているものもあります。 宜しくお願い致します。 Worksheets.Select ActivateCells(1, 3).FormulaR1C1 = Format(Date, "m""月分")

  • excel-vba

    エクセルVBAで Case Cells(50,"A") Case Cells(51,"A") Case Cells(52,"A") などを更にsheet1のCells(50,"A")とかするにはどう記述すればいいのでしょうか。 ただしこのマクロ(コード)はsheet2を処理対象としているsheet2に含まれているものとします。 (素人なのですがこういう言い方はおかしいですか。マクロってシートごとにも使うマクロを変えることできるんですよね?  Sheet1用のMACROsheet1、Sheet2用のMACROsheet2で互いのシートの上のデータを処理する。)

  • 一時的にファイル名、シート名を変えて処理することは出来ますか?

    VBAを勉強中で、分からないので教えてください。 2つのWorkbook間でCopy、Pasteを繰り返し、必要なデータ を一覧に書込みするマクロを作成する時 Excelデータ(同じフォーマットでセルに入っているデータが少し ずつ違う)で、異なるファイル名、異なるシート名になってしまって いるものをマクロで処理をしたいのですが、VBAで書き込む時 にはWorkbooks("○○").Worksheets("○○")と指定しなくて は動作してくれないので、どのように指定したらいいか困っています。 「直前にアクティブだったWorkbook指定する」「先頭に位置する sheetを指定する」なんてコードがあれば、一番いいのですが、 そういうコードはあるのかもわかりません。 最終的には"あるセル"に入っているファイル名で保存してしまう ので、一時的に仮ファイル名、仮シート名に変えて、後に削除 して処理をすればいいかなとが思うのですが、どうやって処理 したらいいのかわかりません。 やりたい事をうまく説明出来ているかわかりませんが、ファイル名、 シート名が違う元のデータから、一覧表へ書き込むマクロを組み たいのです。その際の元データの指定方法を知りたい or 一時的 に名前を変えて処理する方法を知りたいです。 一覧表へ書込みをした後にメールで添付してその元データ (”あるセル”にファイル名変更したもの)を送り返したいのですが、 メールへ添付する事までマクロで出来ると助かります。マクロで そこまで出来ますか?これも合わせて教えていただけたらと思います。 つたない説明ですみませんが、よろしくお願いします。

  • エクセルのマクロ(Arrayの使い方)について困っています

    複数のシートを印刷する場合、現状は以下でおこなっているが  For S = 1 To Range("N5") SheetName$ = Range("N5").Offset(S, 0) Worksheets(SheetName$).PrintOut Next これを印刷コマンドを1回で複数枚のシートを指定して実行したい:その理由はプリンターの機能で1枚のシートに2枚分を縮小印刷するなど である。  Sheets(Array("Sheet1", "Sheet2", "")).Select SelectedSheets.PrintOut みたいにしたいが、シート名を変数として指定、枚数も変数扱いで実行させるための方法がわからない。 Arrayの()内を変数にして""(ダブルクォーテーションマーク)で括った文字列をカンマ区切りして1つの変数とするにはどのようにすればマクロが成立するのか誰か教えてください

  • 下記エクセルVBAコード:改良 表

    下記エクセルVBAコードの中で Case "a" Case "b" Case "c" などの情報を処理していますが、その”a”、"b"、"c"の代わりに、$A$50~$A$52の表の中(ここにaとか入っている)のデータを用いて処理できるようにするには、どのようにコードを変更すべきでしょうか。よろしくお願いします。 Sub test01() d = Range("A65536").End(xlUp).Row j = 1 For i = 1 To d Select Case Cells(i, "a") Case "a" Case "b" Case "c" '---XXX Case Else Worksheets("Sheet2").Cells(j, "A") = Cells(i, "A") Worksheets("Sheet2").Cells(j, "B") = Cells(i, "b") 列や行やシートが変わっても、類推で変えられるでしょう。 '---YYY j = j + 1 End Select Next i End Sub

  • 複数シートの選択

    エクセルVBAで複数シートの選択をしたいのです。 シート名やシートの位置が変更される可能性があるので オブジェクトで指定したいのですが 記述方法が分かりません。 ##シートの位置 Sub mac1() Worksheets(Array(2,5)).Select End Sub ##シート名 Sub mac2() Worksheets(Array("aaa","あああ")).Select End Sub

  • ExcelVBAで行の非表示、表示をコード化

    現在、Excel2003をつかっており、VBAを用いて sheet1シートの2行目、4行目、10行目を非表示にするマクロ(HIDDEN)と すべての行を表示にするマクロ(APPEAR)を使っています。 Sub HIDDEN() ThisWorkbook.Worksheets("sheet1").Rows("2").HIDDEN = True ThisWorkbook.Worksheets("sheet1").Rows("4").HIDDEN = True ThisWorkbook.Worksheets("sheet1").Rows("10").HIDDEN = True End Sub Sub APPEAR() ThisWorkbook.Worksheets("sheet1").Rows.HIDDEN = False End Sub いま、2つのマクロを併合し 「Sheet1の2行目、4行目、10行目のいずれかが非表示であれば、すべての行を表示 そうでなければ、2行目、4行目、10行目のすべてを非表示にしたい」 と考えています。 ここで私が困っているのは、2行目、4行目、10行目のいずれかが非表示であれば というのをどうVBAで記述するのかです。

専門家に質問してみよう