和風スパゲティのレシピ

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

Range・Cells

同じコードなのにエラーが変わる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を判定して取得していきます。

セルのロックを設定/解除/判定する - Lockedプロパティ

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

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本で何でもやってくれる万能関数を作ってみましょう。

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

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

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

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

CurrentRegionの最終行を取得する

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

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

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

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

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

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

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

Ctrl+Shift+↓のセル範囲取得をVBAで行う方法

Ctrl + Shift + ↓によるセル範囲の選択はとても便利です。VBAでも使いたいのですが、残念ながら一発で取得するプロパティは無いため、スタートのセルと、Endプロパティで取得したセルを、Rangeプロパティで繋げることで取得します。

結合セル.Offset(1)は結合エリアの1つ下を指す

A1:C3の3×3正方形が結合されているとき、Range("A1").Offset(1)は、結合下端の1つ下であるA4セルを取得します。結合エリア全体Range("A1:C3")からのOffset(1)も、同じくA4になり、Offsetの特長である「元Rangeの大きさを維持」もなくなります。

RangeとCellsの違い

セルを指定するプロパティ、RangeとCellsの違いを解説します。どちらもセルを取得するために使いますが、Rangeの方ができることが多く「セル範囲や複数のエリア」を取得できます。Cellsは指定が数値なのを利用して、変数や定数を活用するために使います。

RangeオブジェクトとRangeプロパティの違い

Rangeオブジェクトと、Rangeプロパティの違いを解説します。「Rangeオブジェクトを取得する、たくさんあるプロパティの中のひとつがRangeプロパティ」です。これだけで分かるのは難しいと思いますので、より詳しく説明していきます。

帳票出力マクロをクラスを使って書く

完成品の全体が見たい!という方のための、完成品マクロのサンプルコードです。今回のテーマは「データシート⇒帳票を出力」です。クラスの基本的な書き方を使って実装しておりますので、クラスを勉強し始めた方は、参考にしてみてください。

最終行を取得する方法7選 (UsedRange/End~)

Excelのデータ処理をマクロで自動化しようと思ったら、必ずついて回るのが「最終行の自動取得」です。データの処理がどんなものであれ、まずはデータがどこまで入っているかを確認して、処理を実行する範囲を決めないといけません。

セルの数式をVBAで入力する - Formulaプロパティの使い方

セルの数式をVBAで入力するための「Formulaプロパティ」の使い方を解説します。Range("D10").Formula = "=SUM(D4:D9)"のように、数式をRangeオブジェクトのFormulaプロパティに代入することで、数式をVBAから入力することができます。

セル範囲(Range)を取得する方法10選

セル範囲の指定は、簡単に書こうと思えば書けるので、普段はあまり考えない部分かもしれません。ですが読みやすさや書きやすさを追求しようと思えば、とても考えがいのある処理ですので、自分の知識の確認の意味でも、ちょっと確認してみましょう。

セル範囲にシート関数をコピーする - 基本構文とサンプルコード

セルに入力されたシート関数を、VBAを使って別のセル範囲へコピーする方法を紹介します。D2=B2*C2と入力し、これをD列全体にコピーするには、そもそもコピーする必要もなく一気に「Range("D2:D7").Formula = "=B2*C2"」でOKです。

セル範囲の値だけをコピーする - 基本構文とサンプルコード

セルの値だけを、範囲から範囲へコピーする方法を紹介します。A1:C3の正方形を、D4:F6にコピーするコードは、実は「Range("D4:F6").Value = Range("A1:C3").Value」で済みます。「値貼り付け」より速くて読みやすいので、こちらを使いましょう。