和風スパゲティのレシピ

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

Range・Cells

セル内の特定文字列だけを着色する - Characters

セル内の特定の文字列を着色する方法を解説します。Instr関数で文字列の位置を特定し、Charactersプロパティを用いて特定文字列だけを書式設定します。サイズ/太字/フォント/背景色なども同じように設定可能です。

特定の文字列を含むセルを検索する - Instr関数

ある文字列を含むセルを検索する方法を解説します。For文またはFor Each文でセルをループし、Instr関数で特定の文字列を含んでいるか判定します。より複雑な判定を行う場合はLike演算子を使用してください。

シート名変更中はRangeのメソッドが失敗する

シート名変更中でもマクロは実行できてしまい、「Rangeクラスの○○メソッドが失敗しました」エラーが発生してしまいます。マクロを作った直後だけ発生するエラーなどに困った場合はこれを疑ってください。

オートフィルで連続データを作成する - AutoFill

Excelのオートフィル機能をVBAから実行し、コピーや連続データの作成を行う方法を解説します。RangeオブジェクトのAutoFillメソッドを使用します。Resizeとの併用や日付の年月単位加算、連番の高速生成などに活用します。

Setとは - 代入にSetが必要なオブジェクト変数

セルをRange変数に代入する時などに使う「Setステートメント」について解説します。実はSetはVBAさん向けのただの目印なので、単にRange.やWorksheet.など「"."が使える変数」にSetを使うと覚えておけばOKです。

Dictionaryの要素(Key/Item)をセルに出力する

Dictionaryの要素をシートに出力する方法を解説します。For Each文で1要素ずつセルへ出力していく方法と、要素を配列を介して一括でセル範囲に出力する方法の2つがあります。状況に応じて使い分けてください。

Cells(○, ○). の入力候補を出す小技

Cells(R, C).の入力候補が出てくれない対策として「Cells.」から入力を始める技があります。さらにこの技は「Worksheets("○○"). Cells」とドットとCellsを離すことで、Worksheets.の問題にも対応できます。

0,1始まりでない配列(Array)をセルに出力する

例えば「インデックスが2~5の配列」を全然違う番地のセル範囲に吐き出してみても、特にはありません。両者の大きささえ一致していれば、配列インデックスとセル番地は一致している必要はありません。

配列をセル範囲(Range)に一括出力する

配列をセル範囲に一括で出力する方法を紹介します。横方向に出力する場合はRange.Value=配列、縦方向に出力する場合はRange.Value=Transpose(配列)、二次元配列の場合はRange.Value=二次元配列で実行できます。

Range("A1") Is Range("A1") = False

Rangeオブジェクトには「取得ごとに違うオブジェクトを用意する」という性質があり、全く同じセルを指していたとしてもIsによる比較がFalseを返します。同一セル判定を行うには、Addressプロパティを使用してください。

Dictionaryに渡すセル「.Value」は省略できない

Dicitonaryのkey/ItemはVariant型のため、値でもオブジェクトでも入れることができます。このためセル⇒セル.Valueの自動読替はできませんので、値をkeyにするには.Valueを明示する必要があります。

Range、Cellsの「.Value」は省略してよいか

VBAにおいてセル(Rangeオブジェクト)を扱う際、「.Value」を省略しても同じ動きになることが多いです。.Valueはどんな時に書く必要があるのか、書く必要がなかったとして省略しても良いのかを解説します。

IsArray(Range)は.Valueを省略してもTrue

IsArray関数は変数などが配列かを調べる関数ですが、Rangeオブジェクトに対してもTrueを返すという性質があります。IsArrayがTrueなのにUbound/Lboundがエラーになるなどにお悩みの方はこの仕様を疑ってください。

セルの文字配置(水平/垂直位置など)を設定する

セルの書式設定の配置タブにある、水平/垂直位置や、文字の折り返し、縮小して全体表示、縦書きなどの文字方向設定をVBAで行う方法を解説します。例えば水平方向を中央寄せにするには、Range.HorizontalAlignment = xlCenterを実行します。

同じコードなのにエラーが変わるRangeの不思議

Range(Cells,Cells)のシート指定ミスは、「Rangeメソッドは失敗しました:Worksheetオブジェクト」「Rangeメソッドは失敗しました:Globalオブジェクト」「アプリケーション定義またはオブジェクト定義のエラーです。」と3種もエラーがあります。

Range(Cells,Cells)の親シートを指定する方法

Range(Cells,Cells)で取得するセル範囲の親シートを指定する方法を解説します。Cells2つにシートの指定を付けるか、RangeとCells2つの計3つすべてにシートの指定を付けるかで指定してください。ws.Range(Cells,Cells)ではエラーになります。

RangeとCellsの使い方 - セルの指定と使い分け

VBAでセル/セル範囲を指定するRange,Cellsの基本的な使い方を解説します。A1など固定されたセルである場合はRange、変数を使ったループ処理を書きたい場合はCells、変数でセル範囲を指定したい場合はRange(Cells,Cells)と使い分けましょう。

セル範囲や複数セルから1次元配列を生成する

セル範囲などRangeオブジェクトを格納した1次元配列を生成する方法を解説します。すべてのセルをForEach文でArrayに格納していくコードです。空セルを除外するなど条件を付ける場合は、ReDimPreserveを利用して要素数を動的に処理します。

複数のセル値を区切り付き文字列に結合する

複数のセルの値を文字列に結合する方法を解説します。対象セルがn×1や1×nのセル範囲であればExcelのTEXTJOIN/CONCAT関数、VBAのJoin関数が使えます。対象セルが複数エリアにまたがる場合は、ForEach文で1つずつ結合していきます。

文字列を区切り文字付きで結合する - Join関数

文字列を区切り文字付きで結合するJoin関数の使い方を解説します。Join(1次元配列, 区切り文字)で配列の各要素をつなげた1つの文字列を作ってくれます。この関数は1次元配列限定のため、セル範囲を渡したい場合はTranspose関数をかませます。

空の行を一括で削除するマクロ

値や数式が一つもない空行を一括で削除するマクロを紹介します。アクティブシートに実行するタイプの便利マクロですので、Excel起動時に裏で開かれる「個人用マクロブック」などに搭載し、ツールバーやリボンに配置して使ってください。

ロックされていないセルをすべて選択/クリアする

ロックされていないセルをすべて選択/クリアする方法を解説します。この手の操作に便利なSpecialCellsメソッドには残念ながら該当の機能がありませんので、For Eachステートメントで地道にLockedを判定して取得していきます。

セルのロックを設定/判定する-Range.Locked

セルのロックの設定/解除の方法と、セルがロックされているかを判定する方法を解説します。どちらもRangeオブジェクトのLockedプロパティで行うことができ、設定/解除はTrue/Falseの代入で、判定はTrue/Falseとの比較で実行します。

選択セルの値をGoogleで検索するマクロ

選択セルの値をググるマクロを紹介します。かなり便利なマクロで、社名⇒企業サイト、住所⇒GoogleMAPを開くことができ、データ内に出てくる専門用語を調べることもできます。ショートカットキーにセットしてぜひ使ってください。

Findは遅くて非表示に弱くてユーザー操作の影響を受ける

検索によく用いられるFindメソッドさんですが、実は危なくて遅い地雷メソッドです。非表示セルを見つけられない、ユーザーと設定を共有する、MATCH関数より十数倍レベルで遅い、の三重苦なので、なるべく使わないようにしましょう。

すべてのシートをA1セル選択状態にするマクロ

すべてのシートをA1セル選択状態にするマクロを紹介します。For Eachで全シートをActivateし、Range("A1").Selectをして回るだけの簡単なコードですが、ウィンドウ枠の固定に対応する必要があるため、ActiveWindow.ScrollRow = 1も実行します。

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

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

Cells(R, ○)←○を入力するスピードを極めろ!

Cells(R, ○)←VBAをやっている限り入力し続けることになるこのコードですが、この○を普段どうやって入力していますか?個数→P列→16という対応をいかに素早く考えるかがカギになるこの処理ですが、実はそれ以上に大事なことがあります。

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

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

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

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