和風スパゲティのレシピ

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

サンプルコード

指定のフォルダをエクスプローラーで開く

指定のフォルダをエクスプローラーで開く方法を紹介します。この処理は、Shell "C:\windows\explorer.exe " & フォルダパス & "\", vbNormalFocusで実装できます。局所的な使い方のコードですので、おまじないだと思って使って構いません。

特定のセル範囲内にある図形を処理/選択する

Shapeの位置がセル範囲内にあるかどうかを判定して、その範囲内のShapeを処理する方法を解説します。TopLeftCell/BottomRightCellでShapeを含む最小のセル範囲を取得し、それとセル範囲のIntersectが一致するかを判定して処理を行います。

すべての図形(オブジェクト)を削除する

すべての図形オブジェクトを一括で削除するコードを紹介します。すべて削除したい場合はActiveSheet.DrawingObjects.Deleteで簡単に実行できます。グラフだけを残すような場合は、ForEachでひとつずつShape.Typeを判定して削除します。

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

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

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

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

最終列を取得する - 基本構文とサンプルコード

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

CurrentRegionの最終行を取得する

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

テキストから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メソッドを使用します。

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

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

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

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

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

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

セル範囲を元の大きさを基準に拡大縮小する

セル範囲を、元の大きさを基準に拡大縮小する方法を紹介します。セル範囲を変更するには、RangeオブジェクトのResizeプロパティを使用し、「セル範囲.Resize(セル範囲.Rows.Count + 1 , セル範囲.Columns.Count)」というコードを実行します。

重複しないよう連番付きでシート名を設定する

シートの名称設定は、すでに使われているシート名を指定するとエラーになってしまいます。これを回避するために、シート名が重複した場合は(2)、(3)、(4)…と連番を付与してからシート名を設定するコードを紹介します。

ブック内の最終(右端)シートを取得する

あるブックの最後のシートを取得する方法を解説します。これを一発で取得するWorkbooks("○○").LastSheetみたいなプロパティはありませんので、Set 最終シート = 指定ブック.Worksheets(指定ブック.Worksheets.Count)と地道に取得することになります。

文字列からシート名に使えない文字を消去する

ワークシート名には文字数と使用文字に条件があり、この条件に違反するとエラーが発生します。文字数の方は簡単で、Left関数で31文字以降をカットしてしまえばOKなのですが、禁則文字の方はReplace関数で該当の文字を1個ずつ消してあげる必要があります。