セル範囲をVariant型変数に入れる事で、配列を作成することができます。また、配列をセル範囲にまとめて出力する事も出来ます。これは、マクロVBAを高速処理したい時の必須テクニックになります、マクロの処理が遅い場合は、このテクニックが使えないか検討してください。 データ型はたくさんありますので、最初から全て覚える必要はないと思います。 通常、セル範囲を配列に取得させると2次元配列になりますこれは1列や1行しか指定しなかったとしても、必ず2次元配列になりますなぜならワークシートが2次元のデータだからです, この画像は、配列にセル範囲をそのまま代入させた場合の配列データです左のウィンドウにあるのが配列データです+の記号を展開してもデータは1つしかありませんが、展開をしないとデータが見れませんこれが2次元配列になっている状態である、ということです, この配列データでは、セル範囲データをリスト化などする際にデータの参照が少し煩雑になるし、この配列データに行データが1次元目なので、Preserveキーワードを使用して行方向にデータを追加することが出来ません, 引数(太字は必須引数)(zzhセル範囲, zzhText取得)戻り値の型 Valiant型, 「zzhセル範囲」は、配列データとするセル範囲の指定ですここに指定したセル範囲が対象となります、セル範囲なので複数列や複数行もどちらも含むような範囲指定でも問題はありません, 「zzhText取得」は、セルデータを値として取得するか、文字列として取得するかの指定になりますというのも、セルは表示形式という設定があり、値ではなく表示された見えている状態のデータを取得したい場合がありますその際に使用する設定です、ここにTrueを指定すると文字列として取得します省略可能で、省略した場合はFalseが指定され値として取得を行います, この関数が配列を返す関数なので、代入先はValiant型の変数を指定します1行目の変数宣言の部分は、その変数を宣言しております, 画像の左側のウィンドウの配列データを上の画像と比べてみてもらうと分かりますが、+記号が無く、全てのデータが確認することが出来ることが分かると思います, なお、日付データの場合VBA上では画像の様に「#」で囲まれた状態になりますこれが日付データであるという表現方法になりますまた、3列目にDate型になっていることからも日付データとして取得できていることが確認できます, なお、この関数はデータをリスト化するなどの目的に使用することを前提としているため、空白のセルは無視します画像では24行目まで選択されていますが、配列データが22番までとなっています配列は0番から始まっているのでデータの総数は23個ということになります, 選択範囲のセル数より少ない要素数になっているのはこのためですこれ以降にデータが存在しなければ、たとえA列全てを選択して100万セルを指定したとしても配列の要素数は23個というのが変わりません, 画像の左側のウィンドウの配列データを確認してください指定セル範囲は、上記のものと全く同じです配列の個数も23個というのは同じです, ですが、取得しているデータには「#」が付いていません代わりに「”」で囲まれています、これにより文字列で取得されていることが確認できます同じように3列目を確認してみると、String型になっていることからも文字列として取得されていることが分かります, この文字列取得は、単純にデータを数値ではなく文字列で取得するということではなく、VBAのRangeオブジェクトのTextプロパティは表示された内容を文字列で取得する動きになります, 例えば、金額の表示形式を設定すると「,」が3桁ごとに入力されます「1500」は「1,500」という表示形式になります、表示形式なのでValueプロパティは「1500」を取得しますが、Textプロパティでは「1,500」という文字列を取得します, 案外この表示形式後のデータで取得したい場合はあるので、その場合は引数2つ目をTrueに指定して関数を実行してください, Functionプロシージャの処理範囲の始まりと終わりのコードですFunctionプロシージャは戻り値を持つプロシージャで、今回は配列データを返しますので、プロシージャの型はValiant型で宣言しています, この関数では、すでに解説したように2つの引数が指定できます引数の内容に関してはすでに解説しましたので、割愛しますキーワードの解説のみ行います, 1つ目の引数はByValキーワードが設定されていますこれは引数の変数自体を値として受け取ることを意味していますなので、このプロシージャ中でこの引数名の変数を変更しても呼び出し元に影響を与えない形になります、今回変更はしていないので省略しても構いませんまた、セル範囲を指定してもらいたいので型はRange型になっています, 2つ目の引数はOptionalキーワードが設定されていますこれは引数が省略可能なことを意味しています省略した場合は、Falseが指定されますTrueとFalseの違いによる処理の分岐は後述します2択の選択肢になるのでBoolean型になっています, 「zz動的配列() As Variant」は、作成する配列データです指定されたセル範囲にあるデータの個数で要素数が変化するので動的配列としていますまたセル自体が何でも代入できるものなので、変数の型はValiant型で宣言します, 「zzセル_Loop As Range」は、指定されたセル範囲をForループで使用するためのRange型の変数です, 「zz配列要素数 As Long」は、動的配列の要素数を再定義する際に使用する整数ですこの数字を1ずつ加算して要素数を増やしていきます, 引数に指定されたセル範囲を1セルずつループして検証を行います全てのセルを参照するので、セルの個数が増えればそれだけ処理時間が伸びるので注意が必要ですが、そんなに大量なリストを作成する前提は考えていなので適宜対応を考えましょう, この関数では空白はセル範囲に指定されていたとしても取得をしないようにしていますそれがここのIf分岐になりますセルのデータが空白でなければデータを取得します, なお、関数などで空白が返されていた場合も取得は行いません当然ですがデータリストに関数を取得させる必要が無いからです関数は引数があって初めてデータとして成立するため、その関数構文を取得することに意味がありません, 動的配列の要素数の再定義です取得するデータは空白を無視する仕様から、実際に全てセルの検証を終了してからしか要素数が分かりません, 「ReDim Preserve」は要素数の再定義を行い、その際取得済みのデータを保持するコードになります要素数には整数値を指定しますが、Long型の変数を使用していますLong型は初期値が0なので、そのまま変数を利用できます, ここが実際のデータの配列への取得箇所です前提として、取得にはセルの値か表示形式の適用された見えているデータかを選択できるようにしていましたなので、ここでその選択によってIf分岐を使用して取得内容を変更しています, zzhText取得が省略されたり、Falseが指定されていれば値の取得を行いますなので、RangeオブジェクトのValueプロパティで取得します, 逆にTrueが指定されていれば、RangeオブジェクトのTextプロパティを取得しますなお、このプロパティによって取得されるものは必ず文字列となります数値であっても文字列になるのですが、その目的のための設定なので特にその動きで問題は無いはずです, また、この設定を混在させたいような複雑な処理は汎用化に向いていませんので、この処理を改造して作成してみてください, ここで要素数の再定義用のLong型変数を更新しています配列データなので普通に1を加算しているだけです, ループが終了したら、要素数再定義用変数は役割を終えているので初期値に戻しておきますこの後使うわけでもないので、無くてもいいです, そしてこの処理はFunctionプロシージャなので最後にプロシージャに作成した配列データを取得させますこれで、この関数の戻り値が確定したことになります, この後に使用した配列も初期化してもいいですね、しなくてもいいですけどなお、Range型の変数はForループ終了時点で初期化されていますこれはForループの仕様です, 途中でも少し触れましたが、この関数はビッグデータを想定していませんせいぜい数千セル程度までを想定しています1列全ての100万セルなら明らかに待ちますさらに言うなら要素数の定義用変数がLong型なので21億程の範囲を超えるセル数ならエラー発生です, ちなみに、セル範囲をこの関数を使用して1次元配列化したら次に重複を除外する関数を使用することで、指定セル範囲の重複しないデータリストを作成することが出来ますと、いうかその目的の為にこの記事の関数は作成しました以下の記事でその続きの関数がありますので、利用ください, コードコピーボタンをクリックするとコピー範囲が選択状態となり、クリップボードにコピーされます後は任意の箇所にペーストしてください, VBAのRangeオブジェクトのTextプロパティは表示された内容を文字列で取得する動きになります. (adsbygoogle = window.adsbygoogle || []).push({}); ExcelVBAとアウトドアとゴルフが趣味の30代のおじさんです。

シートの保護とは、入力されているデータや数式、シートを編集できないように設定します。 変数のデータ型と、型の指定方法についてご説明します。

IF文は「For~Next」などのループと同じくらい、使用頻度が高いと思います。 直... 縦に追加されるような形式で配列に格納すると、縦に要素を追加出来ない事態に陥ります。, Excel VBA 複数のファイルのデータを1つのファイルの1シートにまとめる方法.

配列の基礎については「Excel VBA 配列の使い方(基礎編)」をご覧ください。, 配列にデータを格納したり出力するには、セル範囲を一括で格納/出力する方法と、ループで1行(列)ずつ格納/出力する方法があります。, シート上のデータを配列に一括で格納する方法は、「配列名=データ範囲」で格納出来ます。, 基本的に配列のインデックスは0から始まりますが、セル範囲を一括で格納した場合は1から始まります。, また、宣言時に()が省略されていますが、Variant型で指定して、下記コート部分で配列と判定されています。, 基本的な書き方は同じですが、セルのデータを一括で格納した配列と、そうではないインデックスが0から始まる配列、それぞれのサンプルコードを掲載します。, 配列の範囲と出力する範囲が合っていないとエラー値が出力されたり、一部しか出力されないといった原因になりますので、範囲はしっかり把握しましょう。, インデックス0から始まる配列を作るために、「可変長配列」で宣言して、ReDimステートメントで0から始まるように定義して、ループで表を配列に格納しています。, VBAでは配列の要素数を、直接取得する関数がないため、配列の要素数のLBound(最小値)関数とUBound(最大値)関数を使用します。, UBound関数で要素数取れると思いますが、インデックスが1から始まる場合は良いのですが、0から始まる場合は必ずしもUBound=要素数とは限らないため、以下のように算出します。, 「ReDim Preserveステートメント」を使用する事で、すでに格納されているデータを初期化する事なく、追加する事が出来ます。, 「ReDim Preserveステートメント」で要素を追加出来るのは、最終次元のみとなります。, Sample1~Sample3の様に、縦に追加されるような形式で配列に格納すると、縦に要素を追加出来ない事態に陥ります。, ですので、動的に配列を操作する場合は基本的に行と列を入れ替えて格納する事をおすすめします。, 配列の要素を削除する場合は、配列に要素を削除する関数がないため、単純にループで上詰めしていき、最終的に要素を差し引いた再定義をすることになります。, 特定の要素を削除する場合も、配列の領域を変更する場合は最終次元のみ可能ですので、行列を入れ替えた配列を用意しました。, 配列の要素数が0 to 10から0 to 9に削除されていて、「2019/01/05」が削除されています。, これは上記のループは同じですが、削除する要素の条件が複雑になったり、削除する要素数が多くなった時に、上記のような方法よりも、別の配列に入れ替えた方が楽だと思います。, myArrayの(0 to 4, 0 to 10)の偶数のみをNewArrayに追加しています。, NewArray(0 to 4 , 0 to 5)となり、偶数日のみが格納されました。, 配列の要素はUBound関数とLBound関数を使用して取得出来ましたが、列数(次元数)は取得する関数がありません。, これを利用する事でエラーとなる列数(次元数)を取得する事で、配列の列数を取得できます。, ここまでで説明した通り、可変長配列を操作する上で列数(次元数)を取得する必要が発生する事が多々あります。, 一つの特定の要素を操作する場合は、その要素のインデックスを指定するだけで良いですが、, ループがよくわからない場合は「ExcelVBA 「For~Next」「Do~Loop」 ループの使い方」をご覧ください。, 詳しくは目次の「2.配列の要素数を取得する」と「5.列数(次元数)を取得する」をご覧下さい。, For Each In Nextは配列を操作する場合は、配列全てを操作することになります。, 基本編と応用編と長く説明してきましたが、配列は複雑で慣れるまで扱うのが難しいと思います。.

「Excel マクロ」と検索するとマクロ、VBA、VBEと出てくると思います。

まずは、勉強をする前に3つの違いをご説明したいと思います。 IF文とループを組み合わせる事で、大抵の作業には対応可能ではないかなと思います。 コードコピー Function zzzセル範囲1次元配列化(ByVal zzhセル範囲 As Range, Optional zzhText取得 As Boolean = False) As Variant Dim zz動的配列() As Variant, zzセル_Loop As Range, zz配列要素数 As Long For Each zzセル_Loop In zzhセル範囲 If zzセル_Loop . 使用頻度の高いデータ... 今回は「Sort」オブジェクトを使用して、シート上のデータを並び替えする方法をご紹介します。

難しいことを知らないがゆえに内容も難しくないと思います。. ートへ出力, 大量データで処理時間がかかる関数の対処方法. 「For~Next... VBAに限らずプログラミングをするには、変数を扱う事は必須となります。 VBAについて、僕が学んだノウハウを記事にしていきますので、宜しくお願いします。 VBAでは配列の要素数を、直接取得する関数がないため、配列の要素数のLBound(最小値)関数とUBound(最大値)関数を使用します。 UBound関数で要素数取れると思いますが、インデックスが1から始まる場合は良いのですが、0から始まる場合は必ずしもUBound=要素数とは限らないため、以下のように算出します。 配列の要素=UBound(配列名)-LBound(配列名)+1 また、次元を指定した要素数を取得する場合は以下のように次元を指定します。 配列の要素=UBound(配列名,次元)-LBound(配列名,次元)+1 これからExcelのVBAを使いたいと思っている方へ。 シートの保護、解除には「Protectメソッド」と「Unprotectメソッド」を使... 今回はIF文についてご説明致します。

並び替えは見た目の順番を変えるだけではなく、本領を発揮するのは膨大なデータの前処理など、処理時間が長くなってしまう処理なども並び替えを組み... 今回はタスクスケジューラで、設定した日時にExcelを開いてVBAを自動実行する方法をご説明します。

ExcelVBAをタスクスケジューラで実行するには、VBAだけではなく「Bat」と「VBscript」が必要になります。

1行のデータの場合、Variant型変数は、1次元の要素が1つで、2次元の要素が複数、という配列となる; 以下、サンプルコード。 Public Sub sample1() Dim i As Integer Dim r As Range Dim v As Variant Set r = Range("B2:B21") v = r For i = 1 To 20 Cells(i + 1, 4) = v(i, 1) Next i End Sub .

特にマクロ=VBAと混同... 今回はシートの保護、解除を設定する方法をご説明します。

TRANSPOSE関数を使えば、一次元配列を二次元配列に一発で変換して、縦方向のセル範囲に代入できます。 Sub Sample4() Dim tmp(2) As String tmp(0) = "Excel" tmp(1) = "Word" tmp(2) = "Access" Range("A1:A3") = WorksheetFunction.Transpose(tmp) End Sub

VBAでは、セル範囲と配列の相互変換ができるが、たとえ1列分しか変換しなくても二次元配列となってしまう。参考 infoment.hatenablog.comVBAのJoin関数でひとつの文字列に加工しようと思ったら色々と工夫が必要なのだが、実はワークシート関数のTRANSPOSEを使うと簡単にできるという裏技がある。

1次元配列のデータを縦方向に入力-WorksheetFunction.Transpose (2018.04.17) 配列の要素を逆順に処理する (2018.01.03) 複数シートを配列変数で選択する (2017.09.14) Rangeと2次元配列のFor Each~Nextループの順番 (2017.06.29) Byte配列で文字コードを取得する (2017.01.18)