Excel VBA セル操作
Excel関数の VLOOKUP をマクロで
Excel で、データ加工するとき、VLOOKUP を使う機会が有るでしょう。
しかし、データ件数が多いときに VLOOKUP 関数を使うと、Excel ファイル・サイズが大きくなり、処理も重たくなります。
ここでは、マクロを使って、データ参照更新できるようにしたものを、紹介します。
コピー元のデータを、前もって配列に読み込んでおいて、メモリ上で照合することで、高速化を図っています。
キーの照合は、「完全一致」だけでなく、「前方一致」と「部分一致」も、ボタンで使い分けられるようにしました。
マクロ処理の中で、キーの並び替えを行っているで、Excelの VLOOKUP関数を使うときのように、「コピー元」の範囲のキーのデータを、事前に昇順に並べておく必要は、有りません。
このマクロは、キーの列は、一つだけでなく、最大、3列の項目の文字列連結(RTrim)まで、対応しています。
私は、業務で、日常的に、数千〜数万件のデータを扱うため、このマクロを重宝して活用しています。
マクロの使い方:
「貼付け先」のブックの、対象シートから、指定された行(貼付先キー開始行)以下の「貼付け先参照キーの列」の最後のセルまでの範囲で、そのセルの値をキーとして、
「コピー元」のブックの、対象シートから、指定された行(コピー元キー開始行)以下の範囲の、「コピー元参照キーの列」で上のキーの値を検索し、「コピー対象列」の同じ行にある値を、
「貼付け先」のブックの、対象シートの、「貼付け先列」の該当行に貼り付けます。
バージョン04で、対象の列は、8列まで同時にコピーできるようにしました。
VLOOKUP 関数の "V" は、縦方向 (vertical) の検索を意味します。
キーの照合では、英字の大文字と小文字は区別されません。
事例のデータ・ブックのダウンロード:
「貼付け先」
WorkBook.xls
月名 | 和名 | 月 |
January |
|
|
February |
|
|
March |
|
|
April |
|
|
May |
|
|
June |
|
|
July |
|
|
August |
|
|
September |
|
|
October |
|
|
November |
|
|
December |
|
|
April |
|
|
August |
|
|
December |
|
|
February |
|
|
January |
|
|
July |
|
|
June |
|
|
March |
|
|
May |
|
|
November |
|
|
October |
|
|
September |
|
|
|
「コピー元」
Dictionary.xls
月 | 和名 | 英名1 | 英名2 |
1 | 睦月 | Ja | Jan |
2 | 如月 | F | Feb |
3 | 弥生 | Mar | Mar |
4 | 卯月 | Ap | Apr |
5 | 皐月 | May | May |
6 | 水無月 | Jun | Jun |
7 | 文月 | Jul | Jul |
8 | 葉月 | Au | Aug |
9 | 長月 | S | Sep |
10 | 神無月 | O | Oct |
11 | 霜月 | N | Nov |
12 | 師走 | D | Dec |
左の WorkBook.xls の「月名」をキーに、
右側の Dictionary.xls の「英名1」を前方一致で参照して、「和名」と「英名2」を見つけます。
この「和名」と「英名2」を、左の WorkBook.xls に貼り付けます。
|
参照関係の読み込み
完全一致
解説:
読み込んだセルの値の前に「'」を付けて、明示的に「文字属性」にしています。
こうしておかないと、数字列で先頭に「0」が有る場合は、「0」が削除されてしまうからです。
Application.StatusBar プロパティ は、ステータス バーの文字列を設定します。値の取得および設定が可能です。文字列型 (String) の値を使用します。
Excel 側でステータス バーを制御しているとき、このプロパティは False を返します。ステータス バーの文字列を既定値に戻すには、プロパティに False を設定します。ステータス バーが非表示の状態でも、この設定によって文字列は既定値に戻ります。
上の例では、コピー元行数と貼付け先行数の組合せ数が大きいと、それなりの時間がかかります。処理の進度状況を、ステータス・バーに表示して、分かりやすくしています。
次の使用例は、Large.xls ブックを開く前に、ステータス バーの文字列を "しばらくお待ちください..." に設定し、その後既定の設定に戻します。
前方一致
解説:
配列「データ」の値を、一気にセル範囲に書き出したり、セル範囲の値を、一気に配列に読み込むことで、処理の高速化を図っています。
Sheets または Worksheets オブジェクトの Add メソッドは、新しいワークシート、グラフ シート、またはマクロ シートを作成します。新しいワークシートがアクティブ シートになります。
expression.Add(Before, After, Count, Type)
expression 必ず指定します。対象となるオブジェクトへの参照を返すオブジェクト式を指定します。
Before 省略可能です。バリアント型 (Variant) の値を使用します。指定したオブジェクトのシートの直前に、新しい シートを追加します。
After 省略可能です。バリアント型 (Variant) の値を使用します。指定したオブジェクトのシートの直後に、新しい シートを追加します。
Count 省略可能です。バリアント型 (Variant) の値を使用します。追加するシートの数を指定します。既定値は 1 です。
Type 省略可能です。バリアント型 (Variant) の値を使用します。ワークシートの種類を指定します。使用できる定数は、XlSheetType クラスの xlWorksheet、xlChart、xlExcel4MacroSheet、xlExcel4IntlMacroSheet のいずれかです。既存のテンプレートに基づいてシートを挿入する場合は、テンプレートのパスを指定してください。既定値は xlWorksheet です。
引数 Before と引数 After をともに省略すると、アクティブ シートの直前に新しいシートが追加されます。
部分一致
Excel関数の VLOOKUP をマクロで(セル置換)
上は、コピー先のキーを使って、空いている列に、データをコピーしています。
ここでは、セルのデータを、直接置換してしまうマクロを、紹介します。
日本語で書かれた、ER図を、専用の英語辞書を使って、英語版のER図に修正するために作りました。
(1).置換対象のセルに、括弧や記号が入っている場合にも、括弧で範囲を分けて、置換できるように、工夫?しました。
(2).セルデータだけでなく、テキスト・ボックスの文字列も、置換できるようにしています。
(3).テキスト・ボックスは、グループ化されていると、テキストの編集ができないため、前もって、グループ解除しています。
(4).テキスト・ボックスの中のテキストに、改行が入っている場合にも、対応しました。
解説:
Shapes コレクションは、指定された文書のすべての Shape オブジェクトのコレクションです。
Shape オブジェクトは、オートシェイプ、フリーフォーム、OLE オブジェクト、またはピクチャなどの描画レイヤのオブジェクトを表します。
複数のオブジェクト
┗Shapes
┗ShapeRange
ShapeRange コレクション
http://msdn.microsoft.com/ja-jp/library/cc360616.aspx
Shape オブジェクト
http://msdn.microsoft.com/ja-jp/library/cc360579.aspx
使い方
Shapes コレクションを取得するには、Shapes プロパティを使用します。
次の使用例は、myDocument のすべての図形を選択します。
SelectAll メソッド
http://msdn.microsoft.com/ja-jp/library/cc359674.aspx
追記:シートのすべての図形に対して同時にプロパティの削除や設定などを実行する場合は、すべての図形を選択し、ShapeRange プロパティでシートのすべての図形を含む ShapeRange コレクションを作成して、そのコレクションに適切なプロパティまたはメソッドを設定します。
単体の Shape オブジェクトを取得するには、Shapes(index) プロパティを使用します。
引数 index には、図形の名前またはインデックス番号を指定します。
次の使用例は、myDocument の図形 1 に既定の塗りつぶしのグラデーションを設定します。
文書のオートシェイプだけを処理したり、選択した図形だけを処理する場合など、文書の図形のサブセットを処理する場合は、処理する図形を含む ShapeRange コレクションを作成する必要があります。
単一の図形または同時に複数の図形を処理する方法については、ヘルプの「図形で作業する (描画オブジェクト)」を参照してください。
Shapes コレクションのサブセットを表す ShapeRange コレクションを取得するには、Shapes.Range(index) プロパティを使用します。
引数 index には、図形の名前またはインデックス番号、あるいは複数の図形名またはインデックス番号の配列を指定します。
次の使用例は、myDocument の図形 1 および図形 3 に塗りつぶしのパターンを設定します。
追記:
ワークシートの ActiveX コントロールは、2 つの名前を持ちます。
シートを表示したときに名前ボックスで確認できる図形の名前、およびプロパティ ウィンドウの Name プロパティでコントロールのコード名を確認できます。
最初にワークシートに追加したコントロールでは、図形の名前とコード名が一致しています。しかし、図形の名前、コード名のどちらかを変更しても、もう片方の名前が一致するように自動的に変更されることはありません。
コントロールのイベント プロシージャの場合は、コントロールのコード名を使います。
Shapes または OLEObjects コレクションからコントロールを取得する場合は、コード名ではなく、図形の名前を使ってコントロールを指定します。
たとえば、コード名および図形の名前が既定の CheckBox1 というチェック ボックスを追加したと仮定します。コントロールの [プロパティ] ウィンドウで Name プロパティを chkFinished と設定してコード名を変更した場合、イベント プロシージャでは必ずコントロールのコード名を使い、Shapes または OLEObject コレクションからコントロールを取得する場合、次のように CheckBox1 を使います。
Shape および ShapeRange オブジェクトの Ungroup メソッドは、指定された図形または図形範囲の図形のグループ化を解除します。指定された図形または図形範囲内の図や OLE オブジェクトを分解します。
グループ解除された図形を 1 つの ShapeRange オブジェクトとして返します。
Ungroup メソッド
http://msdn.microsoft.com/ja-jp/library/cc360055.aspx
次の使用例は、myDocument の図形のグループ化を解除し、図または OLE オブジェクトを分解します。
次の使用例は、文書の図または OLE オブジェクトを分解せずに、myDocument の図形のグループ化を解除します。
TextBoxes プロパティは Excel.TextBox のコレクションです。
シェイプの一種である、テキストボックスの値を、コードで取得・設定することができます。
Excel の TextBox のテキスト・データを取得したり、設定したりするときに使います。
http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.textboxes_properties(VS.80).aspx