和風スパゲティのレシピ

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

2021-01-01から1年間の記事一覧

指定のセル範囲(Range)の最終行を取得する

あるセル範囲(Rangeオブジェクト)があったとき、その最終行はセル範囲.Rows.Count + セル範囲.Row - 1で取得できます。行数を数えるRangeオブジェクト.Rows.Countと、第1行を取得するRangeオブジェクト.Rowは必ず覚えておきましょう。

クラスモジュールのエラーをクラス内で止める設定

クラスモジュールのメソッドを実行したときにエラーが発生すると、呼び出し箇所まで戻ってデバッグになります。これを発生コード(クラス内)で止めるには「オプション→→エラートラップ」を「クラスモジュールで中断」にすればOKです。

VBE(コードを書く画面)の文字/背景色を変更する

Excelマクロのコードを書く画面のことをVBEと呼びます。このVBEはいろいろと設定を変えることができ、背景色を黒にしたり、文字色をコードの種類ごとに色を変えて表示することができます。この機能をシンタックスハイライトと呼びます。

邪魔な通知「コンパイルエラー:修正候補」を切る

コードを書いている途中で、Cells(R, ここでEnterを押したり、別の行を選択したりすると、「コンパイルエラー: 修正候補: 式」のような表示が出ます。この表示は邪魔なので、ツール→オプション→自動構文チェックをOFFにして消すことができます。

変数の宣言を強制(Option Explicit)は必ず設定すべし

マクロを作るとき、コード画面VBEはいろいろとオプションをいじることができますが、まずは真っ先に「変数の宣言を強制する」にチェックを入れておきましょう。この機能はいわば「自動スペルミス検知器」で、最も重要なオプションです。

マージソートのサンプルコード

「マージソート」のサンプルコードを掲載します。一気に全部を総当たりをするのではなく、2個に割ってから総当たりをして、そのあと合体(マージ)した方が、総当たりをする空間を小さくできて、結果的に早いという原理のソートです。

アクティブシートを新規ブックにコピーするマクロ

アクティブシートを新規ブックにコピーするマクロを紹介します。コードはたったの一行で、ActiveWindow.SelectedSheets.Copyのみです。「個人用マクロブック」などに搭載しツールバーやショートカットキーへ登録して使ってください。

アルファベット(ABC)⇔数字(123)を変換する関数

アルファベット(ABC)を数字(123)に、またはその逆の変換をする関数を紹介します。列見出しと列番号の相互変換という需要がほとんどと思いますので、27番以降はAA~と対応させる関数にして、「Rangeプロパティ」を使用して作ります。

ベタ打ち数値はすべてマジックナンバー?

マジックナンバーという用語をご存知でしょうか?Cells(R, 4) = Cells(R, 2) * Cells(R, 3)の2、3、4など、コード中に直接入力された数値を指す用語です。メンテ・可読性の点で、しっかりとプログラムを組むなら無くすべき数値です。

列見出しをアルファベット⇔数字で切り替える

列の見出し表示「ABC…」を、「123…」に切り替えるマクロを紹介します。Cells(R, ○)←この○に入る数字を、指折り数えなくて済むためのスイッチですね。実行型のマクロですので、個人用マクロブックなどに搭載して使ってください。

文字列内の指定文字の登場回数をカウントする

文字列の中にある文字がいくつ入っているかを調べる方法を解説します。コード量が最少のSplit関数法、同じ手法がワークシートでも使えるReplace関数法、面倒だが最速のInstr関数法の3つがありますので、お好きなものをお使いください。

パスからフォルダ名やファイル名を取得する

パスからファイル名・フォルダ名を取得する方法を解説します。InstrRev関数で一番右の「\」を検索し、Midでその右側を取ってくることで目的の文字列を取得できます。また、Dir関数の性質を使ってDir(パス)から求めることもできます。

カッコ内の文字列を取得する関数-Mid,Instr関数

文字列から "(" と ")" を検索し、カッコの中身を取得する方法を解説します。Instr関数で開きカッコと閉じカッコを検索し、そうして求まった「○文字目から△文字目」という位置情報をMid(元の文字列, ○, △ - ○ + 1)に代入して取得します。

Replace関数とReplaceメソッドの違い

ExcelVBAにおいて文字列を置換する処理に使う、Replace関数とReplaceメソッドの違いを解説します。Replace関数には、「シート関数のREPLACE」と、「VBA関数のReplace」の2つがありますので、ここでは3つのReplaceについて解説します。

変数名に接頭する「my」の意味

変数にmyRngとかmyNumってよく見ますよね。myRng.SpecialCells(xlCellTypeVisible).Value = myNumみたいなやつ。この「my」はどういう意味かというと、そのまま「自分で作った」とか「自分で使う」という意味です。

文字列から文字列までを置換する/消す

テキストから2つの文字列を検索し、その間にある文字列を置換したり、削除する方法を解説します。RangeオブジェクトのReplaceメソッドを使うとワイルドカード「*」が使えるため簡単ですが、できない場合はInstr関数で地道に頑張ります。

ある文字列からある文字列までを取り出す

テキストから2つの文字列を検索し、その間にある文字列を取ってくる方法を解説します。開始位置= InStr(元の文字列, 文字A)+1、終了位置=InStr(元の文字列, 文字B)-1を求め、Mid(元の文字列, 開始位置, 終了位置 - 開始位置 + 1)で取得できます。

Mid関数を位置で指定できるようにカスタマイズ

Mid関数を使う際、第3引数の「取ってくる文字数」を計算するために「終了位置 - 開始位置 + 1」を書くのですが、Instrなど位置を求める式が入っていると、面倒だしミスの元なので、Mid(元の文字列, 開始位置, 終了位置)を自作してみましょう。

指定の文字列より右側(後方)を取り出す

テキストからある文字列を検索し、それより右側を取得するコードを解説します。文字列操作の基本「位置を検索して切り取る」に忠実にRight/Mid/Instr関数を組み合わせたコードと、Split関数を使ったコード短縮技を両方紹介します。

指定の文字列より左側(前方)を取り出す

テキストからある文字列を検索し、それより左側を取得するコードを解説します。「左から文字列が見つかるまで」という日本語そのままに、Instr関数で文字列の位置を調べて、その1文字手前までをLeft関数で取得します。

文字列の左側(先頭)をn文字削除する

文字列の左側をn文字削除するコードを解説します。例えば2文字を消したい場合は、「左から2文字消す」=「左3文字目から右側を取ってくる」ということですので、Mid(元の文字列, 2 + 1)で目的の文字列を作ることができます。

文字列の右側(末尾)をn文字削除する

文字列の右側をn文字削除するコードを解説します。例えば3文字を消したい場合は、「右から3文字消す」=「左から(文字数-3)文字取ってくる」ということですので、Left(元の文字列, Len(元の文字列) - 3)で目的の文字列を作ることができます。

文字列操作の汎用関数集

文字列操作でよく出てくる処理の汎用関数集を紹介します。例えば左から指定の文字まで取り出す処理を「産地 = Left文字列まで("愛媛産みかん", "産")」という関数で済ませて、コードを書きやすく&読みやすくするためにご利用ください。

複数のシートをまとめてコピー/移動する

複数のワークシートを一度にコピー/移動する方法を紹介します。Worksheetsは配列を渡すと複数のシートを返してくれますので、そこからWorksheets(Array("集計表", "データ")).Copyと、単独シートと同じようにCopy/Moveメソッドを使用します。

すべてのシートに同じ処理を行う - For~Nextステートメント

ブック内のすべてのシートをループして、複数のシートに同じ処理を実行するコードを紹介します。たくさんのシートに同じ処理を行うのは、マクロならではの便利な技です。いくつかパターンを用意しましたので、お好きなコードをお持ち帰りください。

2/26(金)20:00~ VBA勉強会「初心者向けオートフィルタの使い方」

本日20:00~VBAの悩みはVBAerに聞け(Zoom配信)に登壇いたします。他者がコーディングする様をリアルタイムに見、その場で解説を聞くためのイベントです。内容は、初級者向けに、オートフィルターの基本コードを解説します。

アクティブシートを変えずにシートを追加・コピーする

アクティブシートを変えずに、シートを追加・コピー・移動する方法を解説します。アクティブシートを全く変えることなくメソッドを実行する方法はありませんので、元のアクティブシートを記憶し、後でそのシートをActivateして地道に達成します。

新規シートを新しいブックに追加する

新しいシートを、新規のブックに追加する方法を紹介します。それには Set 新規シート = Workbooks.Add.Worksheets(1) というコードを実行します。Workbooks.Addでブックを追加すればそこにシートがありますので、そのシートを取得すればOKです。

エラーメッセージを(ググるために)コピーする方法

エラーが発生した際に、そのエラーメッセージをコピーする方法を紹介します。まずはエラー画面で[デバッグ]を押し、イミディエイトウィンドウに移動します。そこに?Err.Descriptionと入力することで、エラーメッセージを取得することができます。

セル範囲を縮小する/見出し行を除外する

セル範囲を縮小する方法(見出し行を除外する方法)を紹介します。Set 下から1行減らしたセル範囲 = セル範囲.Resize(セル範囲.Rows.Count - 1) や、Set 上から1行減らしたセル範囲 = セル範囲.Offset(1).Resize(セル範囲.Rows.Count - 1)で取得できます。