シート上に記載したフォルダ構成表を元に各フォルダを一括で作成していくマクロを紹介します。ツールとしても便利ですが、「プロシージャ分割」「汎用関数」のとてもいい題材ですので、コードの参考としてもご活用ください。
Range(Cells,Cells)のシート指定ミスは、「Rangeメソッドは失敗しました:Worksheetオブジェクト」「Rangeメソッドは失敗しました:Globalオブジェクト」「アプリケーション定義またはオブジェクト定義のエラーです。」と3種もエラーがあります。
Range(Cells,Cells)で取得するセル範囲の親シートを指定する方法を解説します。Cells2つにシートの指定を付けるか、RangeとCells2つの計3つすべてにシートの指定を付けるかで指定してください。ws.Range(Cells,Cells)ではエラーになります。
VBAでセル/セル範囲を指定するRange,Cellsの基本的な使い方を解説します。A1など固定されたセルである場合はRange、変数を使ったループ処理を書きたい場合はCells、変数でセル範囲を指定したい場合はRange(Cells,Cells)と使い分けましょう。
明けましておめでとうございます!今年は昨年できなかった「プロシージャ分割の体系記事完成」「VBA入門記事の公開」を引き続き目標に掲げ、ブログ執筆に力を入れたいと思います。みなさま今年もどうぞ、よろしくお願いいたします!
2022年2月1日よりスキルマーケットCoconalaにて、約1年間ExcelVBA開発での副業をやってみました。勉強になることが多かったので、しっかり記録に残しておきたいと思います。VBA開発での副業に興味がある方は、よろしければご参考ください。
今月よりソースコード専用の姉妹サイトを開設しておりましたが、ユーザビリティがあまりよくなく、重複コンテンツによるGoogleからの指摘も懸念されたため、閉鎖することといたします。経緯と考察については記事内をご覧ください。
表意文字とは、文字自体が意味を持っている文字、要するに漢字のことです。表意文字の便利さは「はじめてみる単語でも何となく意味が分かる」ことで、これは別業種の業務を扱うプログラミングにおいて、素晴らしい力を発揮します。
すべてのシートを一発で再表示するマクロを紹介します。For EachですべてのWorksheetを走査し、ワークシート.Visible = True によって再表示していくコードです。ブックの保護が有効だとエラーになるため、ProtectStructureを判定して回避します。
条件付き書式を、背景/文字色をセル書式として残して削除する方法を解説します。条件付き書式を通常書式に変換するとも言えます。表示色DisplayFormatが元のFormatと異なる場合に、FormatにDisplayFormatを代入することで実現できます。
動的配列において、要素数を設定/変更するときには、ReDimステートメントを使用しますが、実はこのときDimステートメントは省略できます。しかし「変数の宣言を強制」問題と同じデメリットがあるため、動的配列のDimはしっかり書きましょう。
セル範囲などRangeオブジェクトを格納した1次元配列を生成する方法を解説します。すべてのセルをForEach文でArrayに格納していくコードです。空セルを除外するなど条件を付ける場合は、ReDimPreserveを利用して要素数を動的に処理します。
複数のセルの値を文字列に結合する方法を解説します。対象セルがn×1や1×nのセル範囲であればExcelのTEXTJOIN/CONCAT関数、VBAのJoin関数が使えます。対象セルが複数エリアにまたがる場合は、ForEach文で1つずつ結合していきます。
文字列を区切り文字付きで結合するJoin関数の使い方を解説します。Join(1次元配列, 区切り文字)で配列の各要素をつなげた1つの文字列を作ってくれます。この関数は1次元配列限定のため、セル範囲を渡したい場合はTranspose関数をかませます。
フォルダを作成する場合は、MkDirステートメントを使用します。引数が「作るパス」しかない単純なステートメントですが、すでにあるフォルダを作ろうとするとエラーになる点と、すでにあるフォルダ内にしか作れない点にご注意ください。
値や数式が一つもない空行を一括で削除するマクロを紹介します。アクティブシートに実行するタイプの便利マクロですので、Excel起動時に裏で開かれる「個人用マクロブック」などに搭載し、ツールバーやリボンに配置して使ってください。
セルの値を元に、フォルダを一括で作成するコードを紹介します。対象のセルをFor文やFor Each文ですべて取得、「親フォルダパス & "\" & セル値」で目的のフォルダパスを生成し、MkDirステートメントで実際のフォルダを作成します。
必ず新しいフォルダが必要なマクロにおいて、もし同名のフォルダが存在した場合は連番を付けて新規フォルダを作成するコードを解説します。処理の流れは単純で、フォルダ名 & iが存在しないフォルダ名になるまでiを増やしていくコードです。
フォルダを作成する「MkDirステートメント」は、フォルダを1つずつしか作成できないため、親フォルダがないフォルダ作成を指示するとエラーになります。このエラーを考慮し、上の階層から順にフォルダを作成していくコードを解説します。
2022年から赤帯になったマクロブックへの警告とロックは、プロパティ設定、信頼済みサイト設定ほかに、Workbooks.Openで開くことでも解除できます。これを利用してActiveWorkbookを開き直すことで、一時的のこのロックを解除できます。
テキストからある文字列を検索し、それより左側を削除するコードを解説します。Instr関数で検索文字列の位置を知らべてRight/Mid関数で取り出すコードが基本になりますが、Split関数を使って検索文字で区切るコード短縮技も紹介します。
テキストからある文字列を検索し、それより右側を削除するコードを解説します。Instr関数で文字列の位置を調べて、その1文字手前までをLeft関数で取得します。対象文字列が複数登場する場合は、InstrRev関数と使い分けることになります。
フォルダが存在するか調べる方法を解説します。Dir関数の引数にフォルダパスとvbDirectoryを渡して判定します。ただしこれは他のDir関数使用中は実行できないため、その場合はFileSystemObjectのFolderExistsメソッドを使用します。
読取専用ブックにSaveメソッドを実行した場合、無警告でカレントディレクトリに保存されてしまいます。上書き保存したのにブックが更新されていないかったり、ファイル置き換えダイアログがでた場合は、この仕様を疑ってください。
ブックを上書き保存する場合は、 WorkbookオブジェクトのSaveメソッドを使います。読取専用か調べるReadOnlyプロパティ、保存ブックをシートから取得するParentプロパティ、保存して閉じるCloseメソッドも一緒に覚えるとよいでしょう。
ブックを非表示にして保存して閉じるマクロを紹介します。非表示ブック内のモジュールを選択した上で、イミディエイトウィンドウでThisworkbook.Close Trueを実行します。よく使う方は、非表示もセットで汎用マクロにしておきましょう。
ブックを上書き保存して閉じる方法を解説します。ブックを上書き保存して閉じる処理は、Closeメソッドの第1引数SaveChangeにTrueを指定することで、1行のコードで簡単に実行することができます。
ブックを閉じるときは、Workbook.Closeメソッドを使用します。引数SaveChangesがTrueの場合は上書き保存をして閉じ、Flaseの場合は保存をせずに閉じます。この引数を省略した場合は、保存するかをユーザーに確認してから閉じます。
保護されたシートに再度Protectメソッドを実行した際、引数DrawingObjectsまたはScenariosを指定したときだけ保護が外れる不具合が存在します。Protectメソッドの引数「Contents」にTrueを渡すか、必ずUnprotectを挟むことで解消できます。
シートの保護でユーザーの操作を制限したシートにおいて、マクロのみ編集ができるように設定する方法を解説します。ProtectメソッドのUserInterfaceOnlyを使うことで実装できますが、この設定は保存することができないため注意する必要があります。