2022-12-01から1ヶ月間の記事一覧
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を使うことで実装できますが、この設定は保存することができないため注意する必要があります。
ロックされていないセルをすべて選択/クリアする方法を解説します。この手の操作に便利なSpecialCellsメソッドには残念ながら該当の機能がありませんので、For Eachステートメントで地道にLockedを判定して取得していきます。
セルのロックの設定/解除の方法と、セルがロックされているかを判定する方法を解説します。どちらもRangeオブジェクトのLockedプロパティで行うことができ、設定/解除はTrue/Falseの代入で、判定はTrue/Falseとの比較で実行します。
ブックの保護を設定/解除する方法を解説します。WorkbookオブジェクトのProtectメソッドを使います。ブックの保護という名称ですが、実際に禁止される操作は、ワークシートの追加、表示/非表示、削除、移動、名前変更になります。
ワークシートの保護設定の内容を調べる方法と、それを利用して同じ設定でシートを保護する方法を解説します。シート保護の各設定がONになっているかどうかを調べるには、WorksheetオブジェクトのProtectionプロパティを使用します。
ワークシートの保護を設定/解除する方法を解説します。シートを保護するにはWorksheetのProtectメソッドを使用します。簡単ですが非常に引数が多いメソッドですので、よく扱う方は全引数を設定するコードを保存しておきましょう。