エクセルの神髄
VBA技術解説:マクロで良くある問題や使い方を解説

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2019-12-02

VBA技術解説:マクロで良くある問題や使い方を解説


ExcelマクロVBAの、良くある問題や少々難度の高い使い方等に対する技術的解説です。
掲載しているVBAコードは解説用のコードとなっていますので、適宜変更してお使いください。
そのまま使えるサンプル集は、マクロVBAサンプル集をお探しください。

VBAの実用的なサンプル集として、なるべくそのまま使えるようにVBAコードを書いています。VBAコードの細部についての技術的な解説は少なめになっています。技術的な解説は、VBA入門 VBA技術解説VBAの、良くある問題や少々難度の高い使い方等に対する技術的解説です。

なお、掲載しているVBAコードはVBA学習の参考としてのVBAとなっていますので、そのままでは実行できないVBAコードも含まれています。

プログラミング全般:マクロVBA技術解説

プログラミングの基本~ロジックの組み立て
プログラミングの基本というと、プログラミング言語の基本文法についての解説と思われるかもしれませんが、ここでは、プログラミングする上で最も大切な考え方、ロジックの組み立て方について解説します、本来は言語は問わないのですが、VBAのサイトですのでVBAを例に解説します。何かをしようとしたとき、どのような手順になるか… これが重要です。
実は奥が深いIfステートメント
プログラムと言うものは、条件により処理する これにつきます。つまり、この条件が一番問題となります。そして、その記述をするものが、Ifステートメントになります。If条件式Then 条件式が真(True)の場合の処理 Else 条件式が偽(False)の場合の処理 EndIf 条件式は、真(True)か偽(False)を評価する数式または文字列式を指定します。
論理積(And)論理和(Or)と真(True)偽(False)の判定
And演算子、Or演算子は、2つの数式内のビット単位の比較を行います、そして、IfステートメントのThenは、Trueの時と言うより、False以外の時に実行されます。何を言っているのか分かりずらいと思いますので、順に解説します。Trueとは何か、Falseとは何か True、Falseを数値で表すと、
条件式のいろいろな書き方:TrueとFalseの判定とは
If条件式の書き方で、VBAプログラムは大きく様相が変わってきます、VBAを習い始めは、比較演算子で比較した結果が 正しければTrue、間違っていればFalse という事で理解するはずです。しかし、いろいろなサンプルコードを見ていると、「あれっ」比較演算子が無い… というようなIfステートメントやSelectCaseに出くわします。
VBAにおける括弧()の使い方
オブジェクトのメソッドや、プロシージャー(Sub、Function)を呼ぶときに、引数を括弧()で囲うのか、囲わないのか… 初心者が赤い文法エラーが出て悩むことの一つです。VBAでは、どんな時に括弧を付けて、どんな時に括弧を付けないのか… ・括弧が必要な場合 ・括弧が不要な場合 これらについて具体的な例とともに解説します。
VBAにおけるピリオドとカンマとスペースの使い方
VBAの文法の中で、初心者が戸惑うことが多いのが、ピリオド、カンマ、スペース これらの使い方のようです。使い方を間違って、ピリオドを打つべきところにカンマを打ってしまうと、VBAコードが真っ赤になってしまいます。こうなるとビックリしてしまい、冷静に見直すことが出来なくなってしまったりします。
変数とプロシージャーの命名について
VBAを習い始めると、「変数」について学びます、変数に付ける名前を変数名と呼び、若干の規則はあるが、好きな名前を付けて良いと教わります。好きな名前って…ケイコ、ハルカ、アツコ… まあ、それでも良いけど、入れるデータが分かるような名前がよいですね、わかり易い名前を付けましょう。
文字列置換の基本と応用(Replace)
マクロVBAの処理において文字列置換は頻出の処理ですが、これに苦労している初心者の方が多いようです、そこで文字列置換の基本と応用について解説します。・文字列内の空白(半角・全角)を取り除く VBA関数のTrimは前後の空白が削除されるだけです、そこで、Replace関数を使います。
データクレンジングと名寄せ
複数の名簿を突き合わせて一つにする、いわゆる「名寄せ」名寄せを行うためには、その前にデータクレンジングを行う必要があります、データクレンジングとは、データの中から、重複の排除、誤記、表記の揺れの修正などを行い、データの品質を高めることです。データを整形して、扱いやすいデータに変換します。
ForとIfのネストこそがVBAの要点
VBA習得で最も肝心なものは、For文とIf文をしっかりと覚えることです、そして、For文とIf文をネストさせるプログラミング技術の習得です。For~Nextステートメントは、繰り返し処理 If~EndIfステートメントは、条件分岐 つまり、条件により分岐しつつ繰り返し処理を行う。
For Next の使い方いろいろ
VBAの繰り返し処理としては、ForNextまたはDoLoop この二つを最初に学んだのではないでしょうか。プログラムにおける繰り返し処理は、基本中の基本です。特に使用頻度の高いForNextを重点的に学んでいることと思いますが、書き方、使い方は、いくつかのパターンがあります。
複数条件判定を行う時のコツ
多くの条件を判定して処理を決めなければならない場合は多くありますが、複数条件判定を行う時のIfステートメントの使い方はいろいろあります。覚えておきたい基本的なIfステートメントの組み立て方法を紹介します。以下では、条件1から条件5まであり、・全ての条件を満たしている時 ・どれか一つでも条件を満たしている時 ・全ての条件を満たしていない時 これらを行う時の…
VBAの省略可能な記述について
VBAには、省略可能な記述が数多くあります。省略可能な記述とは、書いても書かなくても動作に何の違いもないものになります。VBAのこの記述の自由度は、慣れてしまえば楽なものですが、初心者の方が覚え始める時には、多少混乱することもあると思います。

VBA入門編:マクロVBA技術解説

マクロとは、VBAとは
エクセル作業に忙殺されて、「どうにかならないものか」そう思って調べるてみると、「VBA」「マクロ」何やら操作を自動化できるようだが、、、VBAとは何?マクロとは何? 以下では、順にVBAとマクロがどのようなものかを簡単に説明していきます。マクロとは エクセルの操作を自動化するものです。
コーディングとデバッグ
VBA開発での効率的なコーディングと、プログラム作成では避けて通れないデバッグについて説明します。また、陥りやすい間違い、よくやってしまう間違い等も説明しておきます。効率的なコーディング プロシージャーの移動 コール先のSubプロシージャーやFunctionプロシージャーに移りたい場合があります。
ローカルウィンドウの使い方
VBAのエディター、VBEにはいくつかのウィンドウがあります、その中で、ローカルウィンドウの使い方の説明です、これが使えないと、配列やオブジェクトを扱ったVBAのデバッグに困ることになります。サンプルコードは、以下の表を使っています。まずは、配列でのローカルウィンドウの使い方について。
WorksheetFunctionについて
VBAでシート関数を使う、WorksheetFunctionについての解説です。VBAをやれば、必ず使用することになるでしょう。と言いますか、これを使わないと、エクセルを使う意味が薄れてしまいますので。
RangeとCellsの深遠
RangeとCells特集にします。今さら…と、あなどるなかれ、結構奥が深いのです。すでに説明した内容もありますが、知っておいた方が良い事、知らなくても困らない事(笑) これらを、まとめてみました。まずは基本 A1セルに"エクセル"と入れる場合。
Offset、Resizeを使いこなそう
OffsetとResizeは、エクセルVBAで非常に便利であり、ぜひ使いこなしてもらいたい機能です。Offsetはセル範囲の位置をずらし、Resizeはセル範囲のサイズを変更します。どちらも、RangeとCellsだけで記述することは可能ですが、OffsetとResizeを使う事で、簡潔にVBAを記述することができるようになります。
値渡し、参照渡しについて(ByVal,ByRef)
ByValが値渡し、ByRefが参照渡しです。ここまでは、どこにでも書いてありますし、なんとなく理解していても、実際の活用がなかなか出来ない事が多いようです。使用例を通じて、理解して下さい。上記のsample1を実行すると、2,3の順にメッセージ表示されます。
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
エクセルの表をVBAで扱う時は、データ部分の先頭から最終行までの、開始列から最終列まで処理する事が多いでしょう。開始行や開始列は、ほとんどの場合、見出し行や見出し列の次からになります。単純な話として、1行目に見出しがあれば、2行目から 1列目に見出しがあれば、2列目から では、ここで、最終行や最終列は、
ユーザー定義関数の作り方
マクロを作成して、ボタンで一括処理…それほどではないが、関数だけではちょっと大変、そんな時は、ユーザー定義関数を使ってみましょう。作り方は簡単です。上記は、引数を足し算して返すユーザー定義関数です。FunctionUserFunc Function これは決まり文句です。
セルの値について(Value,Value2,Text)
マクロVBAにおいて、セルの値を操作する事は基本の基本ですが、意外に理解できていない場合が多いようです。Value 指定されたセル範囲の値を表すバリアント型(Variant)の値を設定します。値の取得および設定が可能です。
Excelのバージョンを判断して「名前を付けて保存」
Excel2007以降とExcel2003以前ではExcelのファイルフォーマットが違います、Excel2007以降で2003以前の形式で保存したい場合に問題が発生します。Excel2007以降で普通に97-2003形式で保存するVBAコードを書くと、Excel2003以前ではエラーとなってしまいます。
空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)
空白セルの判定は、VBAにおいては頻繁に発生しますが、正しく空白セルを判定する事は以外と難しいものです。そもそも「空白」とはどのような状態なのか… これが、はっきりしない為に何が正しいのかが判然としないことが問題を複雑にしています。以下、A1セルが空白かどうか判定する方法をいくつか紹介します。
空白セルを正しく判定する方法2
空白セルの判定について、いろいろな方から意見を頂きました、やはり、空白判定は奥が深く結構難しいものとなっています。ここでは、各プロパティや関数が、セルの状態によって返す値を再確認してみます。元記事は、空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula) 上記の記事では、
Rangeオブジェクト.Valueの省略について
エクセルVBAを教えていて、これほど多く聞かれる質問はないでしょう、RangeやCellsの.Valueは省略したほうが良いか、書いた方が良いか、当然、省略出来ない場合もあれば、オブジェクトとして扱うために.Valueは書けない場合もあります。ですので、結論から言えば、書きたければ書けば良いし、書きたくなければ書かなくて良い。
ユーザー操作を制限する(Locked,Protect,ScrollArea)
ユーザーにあちこち触られたくない時や、操作していて迷子にならないように、操作できるセルを徹底的に限定してしまおうというものです、無用なセルはクリックもできない、スクロールすることもできなくします。以下の手順になります。セルのロック→シートの保護→ScrollAreaの設定 順に説明します。
シートに数式を設定する時のセル参照の指定方法
シートに計算結果ではなく、計算式を設定する場合の、セル参照の記述方法について解説します、マクロVBAでは多くの場合、計算結果をセルに入れる事が多いのですが、時に計算式を設定する必要があります、その時の、セル参照の記述が以外に面倒なものです。下の表で説明していきます。
標準モジュールとシートモジュールの違い
エクセルVBAを始めたばかりの人に教えるとき、まずは標準モジュールを挿入して、そこに書きましょう、と教えます。しかし後で見ると、時に間違ってシートモジュールに書いている場合が結構あります。そういう時に、必ず聞かれるのが、「何が違うんですか?」「どこが違うんですか?」そういう時は、「今はその違いについて説明しても混乱するだけですから、
オートフィルタ(AutoFilter)の使い方まとめ
オートフィルタはエクセルの中でもデータ処理において非常に強力なものです、特に大量データの処理には書くことのできない機能となっています。しかし、使い方が難しく、またバージョン違いの影響が大きく、使いずらい物となっていて、問い合わせを受ける事も多いです。
複雑な条件(複数除外等)のオートフィルター(AutoFilter)
オートフィルターはExcelにおいて重要かつ便利な機能ですが、その使い方の理解が不十分な事が多いようです、単純な条件の場合は問題ないのですが、条件が複雑になった途端に書き方で相談を受ける事が多々あります。まず、オートフィルターの一般的な解説としては以下を参考にしたください。
クリップボードを使わないセルのCopy
セルをコピーすることはマクロVBAにおいてもっとも基本的なことですが、セルをコピーすると、クリップボードが使われてしまうので、他の作業との併用時に困ることが多々あります。そこで、クリップボードを使わずに、セルをコピーする方法を考えてみましょう。
Rangeの使い方:最終行まで選択を例に
Rangeの使い方・書き方について、データ最終行まで選択する場合を例に説明します、Rangeの書き方なので、RangeオブジェクトではなくRangeプロパティの解説という事になります。最近続けざまに、以下のようなコードを見かけました。Range("A2",Range("A2").End(xlDown)).Selec…
フルパスをディレクトリ、ファイル名、拡張子に分ける
ファイルのフルパスを、ディレクトリ、ファイル名、拡張子に分けます。FileSystemObjectを使う方法と、VBA関数で分けるVBAのサンプルコードになります。順に、C:\Users\hogehoge\Desktop サンプル.txt サンプル txt と表示されます。
Colorプロパティの設定値一覧
塗りつぶし、文字色、等々の色指定は結構悩ましいものがあります、Excel2003までなら、ColoIndexで56色だけだったので簡単でしたが、Excel2007以降は、フルカラーがつかえるようになった為、色指定が悩ましくなりました。Excelのフルカラーは、24ビットカラー(16,777,216色)、
VBAを定型文で覚えよう
VBAの書籍を読んでも、ネットの解説記事を読んでも、なかなかVBAをマスター出来ないという場合は、学習方法が間違っているかもしれません。その人に合った学習方法、人それぞれ違うのは当然です。本サイトでも、入門者用として多くのページが存在します。
VBAこれだけは覚えておきたい必須基本例文10
VBAを覚える順序としては、・文法から始める方法 ・実践例文から始める方法 どちらが良いとは言い切れませんが、もし文法習得に限界を感じているなら、実践的な基本例文を暗記することから始めてみると良いでしょう。また、VBA習得において、・何を目標にやっていけばよいのか ・どの程度出来たらVBAができると言えるのか こんな疑問もでてくるでしょう。
エクセルVBAでのシート指定方法
ExceのVBAにおいてシート指定は必須になりますが、シートの指定方法は何種類かあり、それぞれの特徴があります。シートの指定方法には、以下の3通りがあります。シートのインデックスで番号 シートの名称で指定 シートのオブジェクト名で指定 シート指定方法ごとに使い方を簡単に説明しながら、それぞれの主な使用場面やメリット、
文字列結合&でコンパイルエラーになる理由
VBAでは、&(アンパサンド)記号で文字列結合を行う事は頻繁に行われますよね。VBEで&を記述するとき、一度くらいは赤字のコンパイルエラーになったことがあるのではないでしょうか。どのように入力した時にエラーになるのか、なぜそれがエラーになるのか、これらを少しく詳しく見てみましょう。
手動計算時の注意点と再計算方法
セルを変更する度に再計算が動いてしまうと処理時間が遅くなってしまいます。そこでマクロVBAの中で、計算方法を手動にすることで対処することになります。このとき処理結果が期待した結果にならないといった事が起こらないように、手動計算時の注意点と再計算方法について解説します。

VBAの用語について:ステートメントとは
プログラミング言語には独特の用語があります。用語の理解があやふやなままで解説を読んでも理解がずれてしまう事もあります。VBAの用語は、プログラミング言語一般で使われている用語と同じ使い方も多いのですが、中にはVBA独自の使い方をしている場合もあります。


オブジェクト変数とは何か
VBAを使い始めてからある程度進むとオブジェクト変数を必ず使い始めることになります。しかし、オブジェクト変数をどうやって使ったらよいのか、オブジェクト変数とはどういうものなのか… ここの理解で苦しんでいることが多々あるようです。VBA入門は現在137回までありますが、オブジェクト変数については第52回.オブジェクト変数とSetステートメントででてきます。

VBA応用編:マクロVBA技術解説

マクロ作成後に、表位置がずれた場合の対処
マクロの最も不便なところは、セル参照が自動で変更されない事ですね。どういう事かと言うと、ワークシート関数なら、セル位置をずらしても、計算式が自動で変更されます。しかし、マクロの記述は、自動で変更されません。
ExecuteExcel4Macroについて(Excel4.0マクロ)
ExecuteExcel4Macroは、Excel4.0のマクロを実行します。つまり、昔のマクロを使うということです。VBAが使える前にあったものですが、最新バージョンのエクセルでも使用できます。とはいえ、積極的に使うようなものでもないですし、MSもVBAへの移行を勧めています。
再帰呼出しについて(再帰プロシージャー)
再帰プロシージャとは、自分自身を呼び出すプロシージャです。プロシージャが、そのプロシージャ内で自分自身を呼び出すような処理を再帰呼び出しと呼びます。自分自身を呼び出し、終了条件を満たすまで、意図的に無限ループさせます。
文字列でのセル参照と文字列の計算式について(Evaluate,INDIRECT)
セルまたはセル範囲を表す文字列からセル参照する場合と、文字列としての計算式から計算する場合です。"Sheet1"の A1に、"Sheet2" B1に、"A1" "Sheet2"の A1に、"(2+3)*2" このように入っている場合に、
リボンを非表示、2003以前ならメニューを非表示
Excel2007以降のリボンは幅を取られて邪魔な場合があります、特に業務アプリの場合は、リボンを消したい事も多いと思います。リボンを消すだけなら、消えているリボンを表示する場合は、Application.ExecuteExcel4Macro"SHOW.TOOLBAR(""Ribbon"",
印刷ページ設定の余白をセンチで指定する(CentimetersToPoints)
印刷のページ設定の余白サイズは、自動記録ではApplication.InchesToPointsで記録されます、しかし、ページ設定のダイアログ画面ではセンチで指定しているので、どうもしっくりしません。できれば、余白サイズはセンチで指定したいものです。
文字列としてのプロシージャー名を起動する方法(Run,OnTime)
文字列変数の中にプロシージャー名が入っていて、そのプロシージャーを起動したい場合になります、実際には、そのような構造が良いとは思えませんが、知っていればプログラミングの幅が広がります。使うのは、OnTimeメソッドorRunメソッドになります。
ドキュメントの作成者を取得(GetObject,BuiltinDocumentProperties)
エクスプローラーで表示される作成者を取得したいとの問い合わせを受けたので改めて確認をしました、所有者と混同されがちですが全く別のものになります、DOSのDIRで表示できるものは所有者になります。従ってVBAでShell.Applicationで作成者を取得すると書かれているものは全て勘違いをしています。
画像サイズ(横x縦)の取得について
マクロVBAで、画像サイズ(横x縦)ピクセル数を取得する方法についての解説です、画像は種類が多いので、全ての画像に対応しようとすると、かなり面倒になります。このような処理は、私もたびたび使いますので、自身の覚書としての意味もあり掲載します。
文字種(ひらがな、全半角カタカナ、半角英大文字等々)の判定
マクロVBAで、文字の種類を判定する具体的なコードになります、書き方はいろいろありますし、なにより、文字を何の種類に入れるかは決まりがありません。カタカナって、どこからどこまで、カナ記号は含むの このような細部については、使用する時々に合わせて微調整が必要になります。
オブジェクトとプロパティの真実
オブジェクトとプロパティについて、解説をします。対象は、VBA中級以上になると思いますが、初級の方でも、VBAって奥が深いんだなーと感動位は出来ると思います。(笑) ただし、あまり役には立たないかもしれませんので、あしからず。
オブジェクト式について
オブジェクトは、objectであり、物・物体のことです、VBAで何か操作をしようとする対象となるものがオブシェクトです、オブジェクト式とは、オブジェクトを操作しようとしたときに、オブジェクトを特定するための書き方です。ただし「オブジェクト式」という言い方を特別なものとして覚える必要はありません。
オブジェクトの探索方法
VBAを書き進めて行くと、どうしてもオブジェクトの扱い時に分からないことがでてきます、何が分からないかというと、オブジェクトの中の目的の要素をどのように指定したら良いのかということです、オブジェクトの中を探索して、目的の要素にたどり着く方法を説明します。ローカルウィンドウを主体に説明します。
条件付きコンパイル(32ビット64ビットの互換性)
条件付きコンパイルは、VBAの特定のコードブロックを選択してコンパイルします、VBAの他の部分は無視されます、条件付きコンパイルステートメントは、実行時ではなくコンパイル時に実行されます。条件に基づいてコンパイルするコードのブロックを指定するには #If...Then...#Elseディレクティブを使用します。
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
ブックのドキュメントプロパティには、組み込みドキュメントプロパティとユーザー設定のドキュメントプロパティがあります。VBAで扱うときは、それぞれ以下のコレクション・オブジェクトを使います、BuiltinDocumentProperties, CustomDocumentProperties これらは、
VBAでファイルを規定のアプリで開く方法
Excelマクロで、エクセル以外のファイルを規定のアプリケーションで開く場合の方法について何通りか解説します、VBAでファイルを単純に開くだけの場合についてになります。ファイルを開いた後に、そのファイルに対して何らかの操作をしたい場合は、対応するアプリケーション毎に個別の対応が必要になりますが、Windowsで開けるファイルであり、
Excelアドインの作成と登録について
Excelアドインの作成方法と登録方法についての手順と注意点、そして対応するマクロVBAコードについて紹介します。具体的にどんなアドインを作成するかではなく、一般的なアドインの作成と登録についての概要の解説とVBAコードのサンプルになります。
VBAでのタイマー処理(SetTimer,OnTime)
VBAでタイマー処理(一定時間間隔で処理)を行う方法についての解説です。最も一般的な方法は、Application.OnTimeを使う方法になりますが、今回の主題としては、WindowsAPIのSetTimerを紹介します。まずはApplication.OnTimeの確認してから、次にWindowsAPIのSetTimerを紹介します。
マクロでShift_JIS文字コードか判定する
環境依存文字・機種依存文字をチェックしたいという話は時々聞くことなのですが、何をもってして判別するかという事が実はとても難しい問題になります、①②もIMEでは[環境依存]と表示されますが、通常これが問題になる事はないでしょう。そもそもコンピューターの中は2進数だけで表現されているもので、コンピューターの文字とは、

Byte配列と文字コード関数について
マクロVBAのデータ型にByte型がありますが、使う機会はかなり限られています。バイト型は、8ビット(1バイト)の変数で、0~255の範囲の単精度の正の数値が格納されます。1バイトで使う事もなくはありませんが、Byte型配列として使われることがしばしばあります。
Applicationを省略できるApplicationのメソッド・プロパティ一覧
Applicationには多数のメソッド・プロパティがありますが、この中には、Applicationを記述しなければならないものと、Applicationを省略できるものとが存在します。これらの違いはどこから来るのでしょうか… Applicationの全てのプロパティ・メソッドについては、Applicationのプロパティ、
PowerQueryの強力な機能をVBAから利用する方法
Excel2016より標準搭載されたPowerQueryはとても強力な機能ですが、使える環境が限られるので、頻繁に使われだすのはこれからになると思います。PowerQueryが広く使われだすと、色々な使い方が出てくると思います。ここでは、PowerQueryの優れた機能をVBAから利用する場合の手順を説明したものです。
ShapesとDrawingObjectsの相違点と使い方
VBAで図(オートシェイプ等)を扱う時にいろいろ調べていくと、図(オブジェクト)のコレクションが二つあることに気づきます。Shapesコレクション DrawingObjectsコレクション WEBのサンプルや書籍では多くはShapesが使われているはずですが、時々DrawingObjectsを見かけることもあります。
新規挿入可能なシート名の判定
VBAで、シートの存在確認およびシートとして使える文字列かどうかの判定は、厳密に行おうとするとかなり大変になってきます。この件についてTwitterでやり取りがあり、それらを踏まえた上でのVBAコードを参考として公開しておきます。その時のツイートでのやり取りは、こちら シート名として使える文字列か判定 シート名の制限として、
VBAにおける配列やコレクションの起点について
VBAの配列を扱っていると、0から開始されていたり1から開始されていたりします。さすがに、混乱したり、間違ってしまう事もあると思います。0から開始される場合を、「0オリジン」英語では「zero-based」1から開始される場合を、「1オリジン」英語では「one-based」このような呼び方をします。
VBAのマルチステートメント(複数のステートメントを同じ行に)
VBAでは、基本的な決まりとして1ステートメントは1行で書くことになっています。しかし、あまりに長くなってしまうと見づらくなります。逆に、短いステートメントが多数行になっていても見づらい場合もあります。

クリップボードに2次元配列を作成してシートに貼り付ける
タイトルはいささかとっぴな感じですが、目的はクリップボードのデータ取得とクリップボードへデータを送る方法と、そもそもクリップボードの中に、セル範囲(つまり2次元)のデータがどのように入っているかを確認してみようという事です。そして、それが解ればクリップボードに2次元配列としてデータを用意してシートに貼り付けられるだろうという事です。

ユーザー定義型の制限とクラスとの使い分け
VBAにはユーザー定義型(Type)があり、複数の要素(複数のデータ型)を含むデータ型を定義できます。複数の値をひとまとめで扱う方法として配列がありますが、配列は同じ型の値しか扱うことができませんが、ユーザー定義型の変数には、文字列型、数値型等々の複数のデータ型をひとまとめにして入れることができます。

シングルクォートの削除とコピー(PrefixCharacter)
セルに入力した先頭の'シングルクォーテーションは特殊なものとなっています。通常は、数値を文字としてセルに入れるときに使っているものです。マクロVBAでセル値を取得すると、この'シングルクォーテーションはValueでは取得できません。

空文字列の扱い方と処理速度について(""とvbNullString)
空文字列と書きましたが、空文字列という表現がかなり曖昧な表現になっています。ここでいう空文字列とは、文字列が入るべき場所に、何も入っていない(ように見える)状態を指しています。VBAにおいては、空文字列の状態が2つあります。

VBAにおける変数のメモリアドレスについて
VBA開発においてメモリアドレスを気にすることはほとんど無いと思います。気になる場合があるとしたら、・String変数の処理が遅い ・Variant変数の処理が遅い ・ByRef,ByValの違い ・WindowsAPI使用時 このような場合に多少は気になる事があるくらいではないでしょうか。

VBAの制限とエラー対応:マクロVBA技術解説

入力規則のドロップダウンが消えてしまうマクロ(Shapes内のDrop Down)
シートのShapeを全削除すると、入力規則のリストのドロップダウンが消えてしまいます。入力規則のリストのドロップダウンの設定については、エクセル入門.入力規則.リスト こちらを参照して下さい。入力規則のリストのドロップダウンが消えてしまう具体的なマクロは、以下のようなVBAコードになります。
実行時にトラップ可能なエラー番号一覧と対処
マクロVBA実行時に発生するエラーのエラー番号とエラーメッセージおよび簡単な理由と対策の一覧です。以下の表にあるエラーはトラップ(捕捉)できるエラー一覧になります。OnErrorステートメントおよびErrオブジェクトのNumberロパティを使用して、エラーへの対処を行うことができます。
フォルダー・ファイル(ブック)・シートの文字制限
フォルダーの作成、ファイルの作成、ブックの作成、シートの作成、この時に指定できない文字があります、使用可能な文字に制限があります、シートの文字制限について間違った解説が結構見受けられます。フォルダ・ファイル・ブックの文字制限 使用不可文字は以下になります。
Excel2013におけるScreenUpdatingの問題点
今現在、Excelの最新バージョンであるExcel2013ですが、Application.ScreenUpdating の動作が、それまでとは違ったものになっています。Microsoftサポートにも掲載されています。Excel2013で複数のブックを開きAppliction.ScreenUpdatingプロパティ使用中にアクティブブックが切り替わるとウィ…
Dir関数の制限について
VBAでフォルダ・ファイルの存在確認や、一覧取得において使われる関数ですが、いくつかの使用上の注意点、制限事項があります。・3桁拡張子の指定時の問題 このように指定した場合、xlsxやxlsmも対象となります。3桁の拡張子を指定した場合は、4桁の拡張子も対象となります。
よくあるVBA実行時エラーの解説と対応
VBAを書き終えて、いざ実行したら意味不明なメッセージが… ここでは初心者向けに、代表的な実行時エラーの解説とその対応について説明します。中級者以上の方は、実行時にトラップ可能なエラー番号一覧と対処 こちらを参考に、エラー対応(OnError等)を実装してください。
Application.Goto使用時の注意
Applicationのメソッドに、Gotoメソッドがあります、Application.Gotoメソッドは、指定ブックの、指定シートの、指定セル範囲を選択します、そのブック・シートがアクティブでなければアクティブにします。最初に、Application.Gotoの一般的な文法説明をします。
ScreenUpdating=False時にエラー停止後にシートが固まったら
VBAでは、処理の高速化や画面チラつきを防ぐために、Application.ScreenUpdating=False これを入れていることが多いと思います。これが入っていると、VBAがエラーで停止して、そこで「リセット」した場合に、Excelシートをクリック出来なくなったり、シートタブの切り替えができなくなってしまう場合があります。
標準スタイル違いの問題点:標準フォント複写、列幅をピクセルで合わせる
VBAでスタイルの標準フォントが違うブック間のコピー等の処理では、列幅や行高の違いが問題となる場合があります。列幅や行高は、標準スタイルの1文字分を基本としているためです。上の画像は、標準フォントが違うブックにおいて、同じ列幅20の時の、列幅の表示です。
VBAでエラー行位置(行番号)を取得できるErl関数
VBAのデバッグでエラーが発生した行位置を特定する方法はいくつかあります。エラーが発生したVBAソースの行ラベルを取得することができる関数がErl関数です。Erl関数は、VB6に存在しVBAにも引き継がれ実装されているものです。

処理速度対策と配列:マクロVBA技術解説

配列の使い方について
配列に関する記事は多数掲載していますが、今回は配列についての基礎知識をまとめました。配列に関する基本的事項のみを解説しています。配列とは まずシートのセルを考えて下さい。縦1列だけを取り出した場合は、1次元の配列です。
VBAの配列まとめ(静的配列、動的配列)
VBAで配列を必要とするのは、処理速度を上げる為だと言えます、そもそも、エクセルにはセルの2次元配列であるシートがあります。にもかかわらず、VBAの学習を進めると必ず配列が出てきます、ではなぜVBAで配列必須になるかと言うと、セルを使うと処理速度が非常に遅く、これを高速に処理するために配列が必要となるからです。
最終行の判定、Rangeオブジェクトと配列、高速化の為に
最終行の判定 エクセル顧客管理の記事からのスピンオフ記事になります。以前に、モジュール「顧客一覧へ登録」において、.Cells.SpecialCells(xlLastCell).End(xlUp).Row と Cells(Rows.Count,1).End(xlUp).).Row を紹介しましたが、
記述による処理速度の違い
記述の違いで、どの程度処理速度に変化があるかを検証します。どのような記述が処理速度に影響するかという点を分かり易くするために、あえて極端なマクロVBAで検証をしています。※本記事は2013年に書いたものを2019/2に再計測しつつ一部書き直したものです。
速度比較決定版【Range,Cells,Do,For,For Each】
何度も言っているのですが、RangeとCellsでどっちが早いか、とか、DoとForとFor Eachでどれが早いか とか、そもそも、その議論がナンセンスなんです。以下のコードと結果を見て、各自で判断して下さい。巷の議論が、いかに無意味で、実は良く解っていないのだと言う事を、理解してもらいたい。
エクセルVBAのパフォーマンス・処理速度に関するレポート
ExcelのVBAは遅い・重いと良く言われることが多いようですが、VBAが遅い・重いのではなく、その書かれたVBAコードが遅いのです。正しい高速化・速度対策をしたコードなら、それほど遅くはありません。むしろ、巨大なスプレッドシートを扱っている事を考えれば、驚異的なパフォーマンスとも言えるのです。
VBAのFindメソッドの使い方には注意が必要です
vbafindでの検索が極めて多く、Findメソッドは検索からの流入ではトップクラスです、アクセス解析で分かった事ですが正直少し戸惑っています。なぜなら私はFindメソッドをほとんど使いません、Match関数や配列を使って処理したほうが高速かつ確実に動作するからです。
WorksheetFunction.Matchで配列を指定した場合の制限について
WorksheetFunctionでMatchを使いデータ検索する事は良くあります。この時、他の部分の記述との関係で、配列を指定してMatchを行う事があります。以下のようなVBAコードになります。これは正しく動作します。
マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
動的配列を使い様々な処理をした後にシートへ出力しようとしたとき、縦横が違っている為そのまま出力できません、そもそも、動的配列の要素数をRedimで変更できるのは、最下位の次元のみになります。2次元配列の場合、ReDimmyArray(2,10) ReDimmyArray(2,11) これはOKですが、
大量データで処理時間がかかる関数の対処方法(WorksheetFunction)
大量データ処理において、一般的な速度対策をやってさえ、時に何時間もかかってしまう事があります、そういう場合でも、多くの場合は何らかの対策があるものです、個別のロジックの記述でこれに対応する一つの有効なマクロVBAコ-ドについて解説します。以下の例で解説します。
大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう… そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。
遅い文字列結合を最速処理する方法について
VBAは遅い… よく聞くことですが、確かに普通にコード記述しているととても遅いことがあります、その代表の一つに、文字列結合があります、文字列結合を最速処理する方法について解説します。そもそも文字列結合は、なぜ遅いのか、String型(可変長文字列)についての基礎知識が必要です。
大量VlookupをVBAで高速に処理する方法について
大量データ同士のVlookup処理は、非常に時間のかかる処理となります、マクロVBAで、これを高速に処理する方法について、VBAコードを示し解説します。ワークシート上の関数の場合 シートに関数を入れる場合は、以下を参照してください。【奥義】大量データでの高速VLOOKUP 以下の表で検証します。
Withステートメントのマクロ実行速度と注意点
マクロVBAにおいてWithステートメントはとても重要です、可読性(読みやすさ、理解しやすさ)、実行速度においては、その役割はとても大きいものになります。本記事では、Withステートメントを使うか使わないかでのマクロ実行速度の差に焦点を絞って検証します。
IfステートメントとIIF関数とMax関数の速度比較
VBAの実行速度比較はとても良く読まれている人気記事となっていますが、そのほとんどは配列やDictionaryを使った少し高度なVBAでの比較が多くなっています。今回は極めて基本的な、大小比較して大きい方を返すという処理において、Ifステートメント、VBA関数のIIF関数、シート関数のMax関数 これらの処理速度を比較検証してみます。

イベント:マクロVBA技術解説

イベント処理について
ワークブックのイベント VBEの画面です。上図の、「プロジェクト」で、「ThisWorkbook」を選択し、「表示」→「コード」、または、F7 ワークブックのイベントは、ここに記述します。「(General)」と表示されているコンボボックスで、「Workbook」を選択すると、自動で、PrivateSubWorkbook_Open() EndSub が作…
ブックが開いた時に自動実行(Workbook_OpenとAuto_Open)
Excelブックを開いた時にVBAを自動実行させる方法として、Workbook_OpenとAuto_Open この2通りの方法があります。それぞれの簡単な説明と、動作の違いを解説します。Workbook_Open Workbook_Openは、ブックが開かれたときに起動されるブックのイベントプロシージャーになります。
ブックが閉じる時に自動実行(Workbook_BeforeCloseとAuo_Close)
Excelブックを閉じる時にVBAを自動実行させる方法として、Workbook_BeforeCloseとAuo_Close この2通りの方法があります。それぞれの簡単な説明と、動作の違いを解説します。Workbook_BeforeClose Workbook_Closeは、ブックが閉じられたときに起動されるブックのイベントプロシージャーになります。

VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)
VBAクラスを使う事で、ユーザー定義イベントを作成したり、動的にイベントを割り当てる事が出来ます。ユーザー独自のイベントを作成したり、フォームに動的に追加したコントロールにイベントを設定することができます。EventステートメントとRaiseEventステートメントを使う事で、ユーザー定義イベントつまりユーザー独自のイベントを作成できます。


クラス入門:マクロVBA技術解説

VBAクラス入門:クラスとは?オブジェクト指向とは?
VBAを覚えて、いろいろ作りながらネットで調べたりしていると、クラスとかオブジェクト指向といった言葉に出くわします。VBEの「挿入」の一番下にある「クラスモジュール」は気になっていたかもしれません。このクラスモジュールを使ってクラスを作ります。
VBAクラスの作り方:列名の入力支援と列移動対応
クラスを使う良さとして、入力支援が使えてコーディングが楽になるという利点があります、列番号をクラスに持てば、列名が候補表示されて非常に便利です。しかし、これを実装するには、かなりの手間がかかります。つまり、クラス作成に手間をかけて、その後を楽にするということになります。
VBAクラスの作り方:列名のプロパティを自動作成する
クラスに列名のプロパティを作成することで、入力支援が使えてコーディングが楽になりますが、列数が多くなればVBAの記述量が増え、コーディングが大変になります。入力支援が使えるのは良いが、その事前準備があまりに大変ではやる気が失せてクラス作るのが面倒になってしまいます。
VBAクラスの作り方:独自Rangeっぽいものを作ってみた
クラスの作成は、標準モジュールで作成していた時とは様相が違い戸惑う部分も多いと思います、それは、初めてVBAに取り組んだ時の戸惑いと同じかもしれません。最初はとにかく慣れることが一番です、細かい文法や機能は、少し慣れてから改めて学んでも遅くはありません。
クラスを使って他ブックのイベントを補足する
VBAでイベントを使う場合は、通常はイベントが発生するオブジェクト(ブックやシート等)のモジュールに記載します、つまり、各ブックの中にマクロを入れなければなりません。他ブックのイベントを処理するには、WithEventsキーワードを付けた変数宣言を使います、クラスを使って他ブックのイベントを補足する方法について具体的なVBAコードで紹介します。
クラスとイベントとマルチプロセス並列処理
エクセルVBAではマルチスレッドによる並列処理はサポートされていません、つまり通常は順序良く直列に処理していくしかありません。しかし処理時間が多大にかかるような処理も現実には存在しているため、エクセルVBAで並列処理したいという要望も出てきます。
クラスとCallByNameとポリモーフィズム(多態性)
VBAの使い方が進んでいくとクラスを使うようになっていきます。クラスを使うようになるとオブジェクト指向という言葉に出会い、オブジェクト指向を学んでいくとポリモーフィズム(多態性)という言葉に出会います。オブジェクト指向における多態性の説明としては、メソッドの呼び出し時に、メソッドが属するオブジェクト(クラス)の種類によって呼び出し先の実装コードが選択され、
オートフィルタを退避回復するVBAクラス
シートにオートフィルタが適用されていて、かつ絞り込みされている場合は、VBAでは、何かと注意が必要になります。このような場合、オートフィルタを解除するか、フィルタ絞り込みをクリアして対応している事が多くなります。しかし、オートフィルタを解除したり、フィルタをクリアしてしまうと、それまでの絞り込み条件が消えてしまい、
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス
シートにオートフィルタが適用されていて、かつ絞り込みされている場合は、VBAは何かと面倒になります。そこで、これに対応するために作成したものが、オートフィルタを退避回復するVBAクラス ただし、これはシートが一つしか扱えません。複数シートで使う場合は、シートごとにクラスのインスタンスを作成する必要があります。
コレクション(Collection)の並べ替え(Sort)に対応するクラス
オブジェクトを扱う事が多くなってくるとコレクション(Collectionオブジェクト)を使う機会も増えてくると思います。配列やディクショナリー(Dictionary)を使ったほうが良い場合も多くはありますが、単純にオブジェクトを保管し、順序通り(FIFO)に処理するだけなら、とても扱いやすい場合もあります。
VBAクラスのAttributeについて(既定メンバーとFor…Each)
VBAクラスをエクスポートすると各種のAttributeが設定されているのが確認できます。それぞれのAttributeの意味と、さらに追加で指定できるAttributeについて説明します。Attributeの変更はVBA標準でサポートされておらず、その使用については慎重であるべきですが、どのようなものがあるかを知るのは、

Excel Application外のオブジェクト:マクロVBA技術解説

事前バインディングと遅延バインディング(実行時バインディング)
オブジェクトがオブジェクト変数に代入されるとき、事前バインディングと遅延バインディング(実行時バインディング)の2通りがあります。バインディングとは バインディングはbindingで、縛るとか束ねると言う意味の英単語です。オブジェクトがオブジェクト変数に代入されるときにバインディングと呼ばれる処理を実行します。

Dictionary(ディクショナリー)連想配列の使い方について
エクセル掲示板で、Dictionaryオブジェクトについて簡単な使用例を上げて解説して欲しいです。検討お願いしますm(_ _)m と頂いたので、分かる範囲内で解説します。実際は、私はあまり使う事はありません。

Dictionary(ディクショナリー)のパフォーマンスについて
Dictionary(ディクショナリー)は辞書機能です、この辞書は、重複は許されず、キーとデータの2つが存在します、今回はこのDictionaryのパフォーマンス(処理速度を)を検証します。Dictionaryの基本的な使い方については、Dictionary(ディクショナリー)連想配列の使い方について こちらを参照してください。

VBAでのInternetExplorer自動操作
VBAでInternetExplorerを操作したくなることがあります。Webのデータを取得したり、リンクをクリックしたりと、これらを自動で行う事が出来ます。使うのは、InternetExplorer というオブジェクトです。

VBAでのSQLの基礎(SQL:Structured Query Language)
SQL(StructuredQueryLanguage:構造化問い合わせ言語)は、データベースの定義や表の操作を行う言語です。データ定義言語であるDDL(datadescriptionlanguage)と データ操作言語であるDML(datamanipulationlanguage)に分けられます。

VBAで正規表現を利用する(RegExp)
正規表現は複雑なパターンマッチングとテキストの検索置換するためのツールです、マクロVBAで正規表現を使う場合はRegExpオブジェクトを使用します、RegExpは、VBScriptに正規表現として用意されているオブジェクトです。メタ文字 メタ文字の一覧です。

VBAでメール送信する(CDO:Microsoft Collaboration Data Objects)
VBAでメール送信する方法はいろいろありますが、ここでは、CDO(MicrosoftCollaborationDataObjects)を使っての送信方法を解説します。メール送信は、メーラーを使う方法や、フリーのDLLを使う方法等もありますが、まずは、Windowsに標準であるCDOを使ってみましょう。

VBAでのOutlook自動操作
エクセルでメールの送受信する方法はいくつかありますが、なかなか面倒ですし、サポートされない機能(CDOは送信のみ)があったりと、不便な事が多いです。そこで、Excelを使っていると言う事は、大抵はOutlookもインストールされているはずですので、これを使って、メールの送受信を行うという選択をすることは自然な流れです。

ADO(ActiveX Data Objects)の使い方の要点
ADOはMicrosoftが提供するデータベースアクセスのためのソフトウェア部品です。OLEDBをActiveXコントロールの形で使えるようにしたプログラミングインターフェースになります。ここでは、ADOを使用したデータベースへの接続方法を解説します。

特殊フォルダの取得(WScript.Shell,SpecialFolders)
デスクトップのフォルダ、スタートメニューのフォルダ、個人用ドキュメントのフォルダなど、Windowsの特殊フォルダを取得するには、ネイティブのWindowsシェルへのアクセスを提供するWScript.ShellのSpecialFoldersプロパティを使用します。CreateObject関数で作成したWscript.ShellのSpecialFolder…

参照設定、CreateObject、オブジェクト式の一覧
VBAでエクセル外のオブジェクトを使うときには、事前バインディングと遅延バインディング(実行時バインディング)の2通りがあります、この時それぞれ何を指定したらよいのか、指定する文字列が長いので結構探してしまうことが度々あります。そこで、自身の覚え書きとしての意味も含めて、参照設定、CreateObjectのclass、

VBAのスクレイピングを簡単楽にしてくれるSelenium
VBAでWebスクレイピングする方法としてIE自動操作がありますが、VBA記述が結構面倒になります、もっと簡単にスマートにVBAを書きたいと思ったら…SeleniumBasicを使ってみましょう。SeleniumBasicは、エクセルVBAでのWeb閲覧を自動化することを強力かつ簡単に実現してくれます。

VBA+SeleniumBasicで検索順位チェッカー作成
VBAでSeleniumBasicを使って検索順位チェッカーを作ってみます。SEO対策として各キーワードでの検索順位チェックは欠かせませんが、簡単に使えてキーワードを大量に指定できる良いツールがなかなかありません。Google検索をスクレイピングすることは、Google利用規約に反する可能性があります。

VBA+SeleniumBasicで検索順位チェッカー(改)
VBAでSeleniumBasicを使って検索順位チェッカーを作り、Google検索順位の履歴を管理します、既に作成解説した、VBA+SeleniumBasicで検索順位チェッカー作成こちらの改訂版になります。Google検索をスクレイピングすることは、Google利用規約に反する可能性があります。




新着記事NEW ・・・新着記事一覧を見る

他のテーブルを基にデータを追加/更新/削除|SQL入門(12月8日)
データの削除(DELETE)|SQL入門(12月7日)
データの更新(UPDATE)|SQL入門(12月6日)
複数のSELECT結果を統合(UNION,UNION ALL)|SQL入門(12月5日)
テーブルを結合して取得(INNER JOIN,OUTER JOIN)|SQL入門(12月4日)
データベースの正規化とマスタの作成|SQL入門(12月3日)
データベースにおけるNULLの扱い方|SQL入門(12月2日)
オブジェクト変数とは何か|VBA技術解説(12月2日)
SQL関数と演算子|SQL入門(12月1日)
データの取得:集約集計、並べ替え(DISTINKT,GROUP,HAVING,ORDER)|SQL入門(11月30日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.マクロって何?VBAって何?|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.ひらがな⇔カタカナの変換|エクセル基本操作



  • >
  • >
  • VBA技術解説:マクロで良くある問題や使い方を解説

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
    掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
    本文下部へ