和風スパゲティのレシピ

日本語でコーディングするExcelVBA

2023-01-01から1ヶ月間の記事一覧

空のフォルダを削除する - RmDirステートメント

空のフォルダを削除する、RmDirステートメントの使い方を解説します。RmDir 削除フォルダパス で実行でき、フォルダが空でない場合はエラーとなります。中身ごとフォルダを削除したい場合はFileSystemObjectのDeleteFolderメソッドを使用します。

KillとFSO.DeleteFileの違い

ファイルを削除する際に使用する、KillステートメントとFileSystemObject.DeleteFileメソッドの違いを解説します。両者はほとんど同じ仕様で、引数(削除するファイルのパス)、使えるワイルドカード、エラーが発生する条件などの挙動もほぼ同じです。

FileSystemObject.DeleteFileメソッド

FileSystemObjectにてファイルを削除する、DeleteFileメソッドの使い方を解説します。FSO.DeleteFile 削除したいファイルのパス で実行できます。Killステートメントと同様、ワイルドカード*を利用して、該当ファイルの一括削除を行うこともできます。

ファイルを削除する - Killステートメント

ファイルを削除する際に使用するKillステートメントの使い方を解説します。Kill 削除したいファイルのパス で実行でき、Excel以外の全種類のファイルも削除できます。また、ワイルドカード*を使用して、該当ファイルの一括削除も可能です。

FileSystemObject入門-参照設定と変数宣言

ファイル・フォルダ操作の便利ツール「FileSystemObject」を使うための事前準備として行う、「Microsoft Scripting Runtime の参照設定」と、「FileSystemObjectのオブジェクト変数のSet」の2つの設定について、やり方を解説していきます。

FileSystemObjectの呼び出しを短縮する方法

FileSystemObjectはとても便利なのですが、CreateObjectやNewを使った参照・宣言部分が面倒です。これを簡単に行う方法として、Public FSO As New FileSystemObjectとPublic変数でNewまで済まし、全プロシージャで使いまわす方法があります。

セルの文字配置(水平/垂直位置など)を設定する

セルの書式設定の配置タブにある、水平/垂直位置や、文字の折り返し、縮小して全体表示、縦書きなどの文字方向設定をVBAで行う方法を解説します。例えば水平方向を中央寄せにするには、Range.HorizontalAlignment = xlCenterを実行します。

確認メッセージを非表示にする - DisplayAlerts

マクロが中断しないようExcelからの確認メッセージを非表示にする、DisplayAlertsプロパティの使い方を解説します。Application.DisplayAlerts=Falseを実行すると以降確認メッセージが表示されなくなり、Trueにすると再度表示されるようになります。

DisplayAlertsを常時Falseにしてはいけない

Application.DisplayAlertsプロパティはExcelからの確認メッセージを非表示にする機能で、削除や閉じる処理に使います。これを常時OFFにしていると、予期せぬ確認メッセージに自動返答されてしまい、マクロのバグが迷宮入りしてしまいます。

変数宣言(Dim)とNewを1行で済ませてよいか

Collection/Dictionary/FileSystemObject/自作クラスを使用するとき、Dim x As X、Set x = New Xと2行で宣言する方法と、Dim x As New X と1行で宣言する方法があります。この違いはNothing時の動きと、Initializeの実行タイミングに現れます。

Dictionary.Keys(i) .Items(i)と書いてはいけない

DictionaryのKeys/Itemsメソッドは全key/itemを1次元配列にして返すメソッドです。つまりKeys(i)はKeysの「引数i」ではなく、Keysが返す配列の「添字i」ということです。Keys(i)を使用したコードは都度配列を生成するため非常に遅くなります。

マクロの実行時間計測(Timer)をクラス化する

マクロの実行時間はTimer関数で0.00秒単位で測ることができます。開始時刻 = Timer、終了時刻 = Timer、終了時刻-開始時刻で求まるコードですが、これをクラスにすることで管理する変数が2つ減り、さらに簡単に呼び出せるようになります。

文字列を部分一致で比較する - Like演算子

文字列を部分一致で比較するLike演算子の使い方を解説します。任意の文字列を意味するワイルドカード「*」を利用して、If 判定したい文字列 Like "*○○*" Thenの形式で使用します。数字を表す#や、アルファベットを表す[A-Z]など、文字種も指定可能です。

Time関数とTimer関数の違い

現在時刻を取得するTime関数とTimer関数の違いを解説します。単位(型)と精度が異なります。Time関数がDate型で表示形式や各種関数に利用できるのに対し、Timer関数は1/00秒まで計測できるSingle型のため、実行速度計測などに向いています。

Instr関数とLike演算子の速度比較(文字列を含むか判定)

文字列が文字列を含んでいるかどうかを判定する2つの方法「Instr関数/Like演算子」について、どちらが早いかを検証しました。Like演算子が安定して速かったですが、最終結論は「どちらも十分早いので書きやすい/読みやすい方を使えばよい」です。

マクロの処理時間を計測する-Timer関数の使い方

マクロの処理時間を計測する方法を解説します。現在時刻を約ミリ秒単位で取得するTimer関数を使うと簡単に取得することができます。開始時刻 = Timerと、終了時刻 = Timerをマクロに設置し、終了時刻 - 開始時刻を計算することで取得できます。

フォルダを部分一致(ワイルドカード)で検索する

フォルダを部分一致で検索する方法を解説します。フォルダの検索にはFileSystemObjectを使うのがおすすめです。Dir関数はワイルドカードが使えますが、引数にvbDirectoryを指定してもファイルまで一緒に検索するためコードが煩雑になります。

ファイルを部分一致(ワイルドカード)で検索する

ファイル名を部分一致検索する方法を解説します。単純な部分一致であればDir関数にワイルドカード(*?)を指定することで実行できます。文字数や文字種を絞った部分一致まで行いたい場合は、候補のファイルすべてをLike演算子で比較します。

DirとFSO.FolderExistsの違い

フォルダが存在するか判定する、Dir関数(vbDirectory)と、FileSystemObject.FolderExistsメソッドの違いを解説します。一番の違いは返り値で、True/Falseを返すFolderExistsに対し、フォルダ名を返すDir関数は="",<>""で判定する必要があります。

DirとFSO.FileExistsの違い

ファイルが存在するか判定する、Dir関数とFileSystemObject.FileExistsメソッドの違いを解説します。まずは返り値が異なり、Dir関数は=""<>""での判定が必要になります。また、Dir関数はワイルドカード*を使用した部分一致検索が可能です。

FileSystemObject.FileExistsメソッド

FileSystemObjectにてファイルの存在を判定する、FileExistsメソッドについて解説します。If FSO.FileExists(判定したいファイルのパス) Thenが基本形です。返り値もBooleanとわかりやすい仕様ですが、Dir関数と違ってワイルドカードは使えません。

FileSystemObject入門-FSOって何が便利なの?

ファイル・フォルダを扱うFileSystemObjectについて、何が便利で、何のために使うオブジェクトなのかを解説します。FSOとはファイル管理の便利ツール集であり、「フォルダやファイルをオブジェクトとして扱うことができる」ことが特長です。

FileSystemObject.FolderExistsメソッド

FileSystemObjectにてフォルダの存在を判定する、FolderExistsメソッドについて解説します。If FSO.FolderExists(判定したいフォルダのパス) Thenが基本形です。引数もフォルダパスひとつで、返り値もBooleanと、仕様がわかりやすいメソッドです。

深い階層のフォルダ作成を再帰関数で行う

MkDirステートメントやFileSystemObjectのCreateFolderメソッドは、作りたいフォルダの親フォルダがないとエラーになります。この対策は[\]でSplitしてからのForEach文がストレートですが、再帰関数を使用した方法もあるため紹介します。

FileSystemObject.CreateFolderメソッド

FileSystemObjectにてフォルダを作成する、CreateFolderメソッドについて解説します。作りたいフォルダのパスを渡すとそのフォルダを作成してるメソッドで、通常実行する分には、MkDirステートメントとエラー含めてほとんど同じ動きをします。

MkDirとFSO.CreateFolderの違い

フォルダを作成するときに使用する、MkDirステートメントとFileSystemObject.CreateFolderメソッドの違いを解説します。両者はほとんど同じものと思ってOKで、引数、省略時のカレントフォルダ指定、エラーの発生条件も全く同じ仕様です。

フォルダ構成表からフォルダを一括生成するマクロ

シート上に記載したフォルダ構成表を元に各フォルダを一括で作成していくマクロを紹介します。ツールとしても便利ですが、「プロシージャ分割」「汎用関数」のとてもいい題材ですので、コードの参考としてもご活用ください。

同じコードなのにエラーが変わるRangeの不思議

Range(Cells,Cells)のシート指定ミスは、「Rangeメソッドは失敗しました:Worksheetオブジェクト」「Rangeメソッドは失敗しました:Globalオブジェクト」「アプリケーション定義またはオブジェクト定義のエラーです。」と3種もエラーがあります。

Range(Cells,Cells)の親シートを指定する方法

Range(Cells,Cells)で取得するセル範囲の親シートを指定する方法を解説します。Cells2つにシートの指定を付けるか、RangeとCells2つの計3つすべてにシートの指定を付けるかで指定してください。ws.Range(Cells,Cells)ではエラーになります。

RangeとCellsの使い方 - セルの指定と使い分け

VBAでセル/セル範囲を指定するRange,Cellsの基本的な使い方を解説します。A1など固定されたセルである場合はRange、変数を使ったループ処理を書きたい場合はCells、変数でセル範囲を指定したい場合はRange(Cells,Cells)と使い分けましょう。