和風スパゲティのレシピ

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

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

テーブル(ListObject)の最終行を取得する

テーブル(ListObject)の最終行取得を解説します。これはListObject.Rangeの最終行で求めますが、そもそもテーブルはListRowプロパティを利用して、1からListRows.Countまで、のようにレコード数でForループが書けることは留意してください。

最終行/最終列を取得する万能関数を作る

ひと口に最終行と言ってもいろいろなやり方があり、UsedRange、End、Range、CurrentRegion、AutoFilterなどが考えられます。こういう処理は関数化が便利ですが、せっかくなので1本で何でもやってくれる万能関数を作ってみましょう。

最終列を取得する方法5選

ExcelVBAにおいて、最終列を取得する方法を紹介します。シート/指定行/セル範囲(Range)/CurrentRegion/AutoFilterの最終列を取得するコードをします。仕組みは最終行を取得するときと変わりませんので、ソースコードのみ記載しました。

Endによる最終行取得は非表示の行を検知できない

知らずに落ちると抜け出せなくなるVBAの落とし穴です。最終行がなぜか小さい値になるときは、この罠を疑ってください。Endプロパティは非表示セルを検知しない仕様がありますので、表示されている最後のセルしか取得できません。

CurrentRegionの最終行を取得する

CurrentRegionの最終行を取得するコードを解説します。一発で取得するプロパティは残念ながらありませんので、CurrentRegionをストレートにセル範囲に入れて、CurrentRegionの最終行 = セル範囲.Rows.Count + セル範囲.Row - 1で求めます。

オートフィルターの最終行を取得する

オートフィルターの最終行を取得するコードを解説します。これを一発で取得するプロパティは残念ながらありませんので、AutoFilter.Rangeでフィルターのかかっているエリアを取得し、そのエリアの最終行を取得する手法を用います。

指定のセル範囲(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文字列まで("愛媛産みかん", "産")」という関数で済ませて、コードを書きやすく&読みやすくするためにご利用ください。