0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【初心者向け】VBAで列範囲を指定するときにハマった!Columns指定の落とし穴

0
Posted at

目次

  1. はじめに
  2. エラーが発生する書き方
  3. 正しい書き方のパターン
  4. 使い分けのポイント
  5. 注意点
  6. よくある間違い
  7. まとめ

はじめに

VBAで複数の列を指定する際に、Columns("1:5")のように数値範囲で指定するとエラーが発生します。この記事では、なぜエラーになるのかと、正しい列の指定方法について解説します。

エラーが発生する書き方

以下のようなコードを実行すると、「アプリケーション定義またはオブジェクト定義のエラーです」というエラーが発生します。

Columns("1:5").Select  ' エラーになる

このエラーが発生する理由は、Columnsプロパティが列を識別する際に文字(A、B、Cなど)を期待しているためです。数値範囲の指定("1:5"のような書き方)は、Rowsプロパティでは使えますが、Columnsプロパティでは使用できません。

Excelの列は本来A、B、Cという文字で識別されているため、VBAでも文字ベースの指定が基本になっています。

正しい書き方のパターン

複数の列を指定するには、いくつかの方法があります。

【方法1】列番号をアルファベットに変換して指定

Columns("A:E").Select  ' 1列目から5列目を選択

この方法が最もシンプルで分かりやすいです。列番号をアルファベット(A=1列目、B=2列目...)に変換して指定します。

【方法2】Rangeプロパティを使用

Range("A:E").Select  ' 1列目から5列目を選択

Rangeプロパティでも同様に列全体を指定できます。Columnsとの違いは後述します。

【方法3】複数のColumnsを組み合わせる

Range(Columns(1), Columns(5)).Select  ' 1列目から5列目を選択

この書き方では、Columns(1)のように括弧内に数値だけを指定する(ダブルクォーテーションで囲まない)ことで列番号を直接指定できます。Rangeで開始列と終了列を組み合わせることで、範囲を表現できます。

【方法4】変数を使った動的な指定

列番号が変数で与えられる場合は、以下のように書けます。

Dim startCol As Long
Dim endCol As Long

startCol = 1
endCol = 5

Range(Columns(startCol), Columns(endCol)).Select

使い分けのポイント

どの方法を使うかは、状況によって使い分けると便利です。

固定の列を指定する場合は、Columns("A:E")Range("A:E")の書き方がシンプルで分かりやすいです。コードを読んだときに、どの列を操作しているのかが一目で分かります。

列番号が変数や計算結果で決まる場合は、Range(Columns(startCol), Columns(endCol))の書き方が適しています。例えば、「データの入っている最終列まで処理したい」といった場合に便利です。

Dim lastCol As Long
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column

Range(Columns(1), Columns(lastCol)).Select

ColumnsRangeの違いですが、基本的にはどちらでも同じ結果が得られます。ただし、Columnsプロパティは「列全体を扱うためのもの」という意図が明確になるため、列全体を操作する場合はColumnsを使うと可読性(読みやすさ)が高まります。

注意点

【注意1】ダブルクォーテーションの有無に注意

Columns(1)Columns("1")は異なります。

Columns(1).Select       ' 正しい(1列目を選択)
Columns("1").Select     ' エラーになる
Columns("A").Select     ' 正しい(A列を選択)

数値で指定する場合はダブルクォーテーションで囲まず、文字で指定する場合は囲むというルールがあります。

【注意2】列番号とアルファベットの対応

列番号が26を超える場合、アルファベットは2文字以上になります。

  • 26列目: Z列
  • 27列目: AA列
  • 28列目: AB列

列番号を確認するのに、R1C1形式(列番号を数値で表示する形式)に切り替える必要があります。
手動で変換するのが面倒な場合は、下記のマクロを実行すると便利です。

' 現在の参照形式(A1形式またはR1C1形式)を反対の形式に切り替える
Application.ReferenceStyle = _
    IIf(Application.ReferenceStyle = xlA1, xlR1C1, xlA1)

このマクロを実行すると、列ヘッダーの表示が「A, B, C...」から「1, 2, 3...」に切り替わるため、列番号を一目で確認できます。作業が終わったら、もう一度実行すると元のA列、B列...の表示に戻ります。

R1C1形式の詳しい活用方法や、クイックアクセスツールバーへの登録方法については、以下の記事で詳しく解説しています。

よくある間違い

【間違い1】数値を文字列として指定

' 間違い
Columns("1:5").Select

' 正しい
Columns("A:E").Select
' または
Range(Columns(1), Columns(5)).Select

最初に説明したように、Columnsプロパティに文字列で数値範囲を渡すことはできません。

【間違い2】Rangeとの組み合わせ方を間違える

' 間違い
Range(Columns(1) & Columns(5)).Select

' 正しい
Range(Columns(1), Columns(5)).Select

RangeColumnsを組み合わせる場合、&で文字列として結合するのではなく、カンマ,で区切って2つの引数(開始位置と終了位置)として渡す必要があります。Rangeプロパティは、2つの引数を受け取ることで範囲を指定できる仕組みになっています。

まとめ

Columnsプロパティでは数値範囲の文字列指定("1:5")は使えません。列をアルファベットで指定するか、数値の場合はRange(Columns(1), Columns(5))のような書き方を使うことで、正しく複数列を指定できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?