VBA

【VBA】指定したセルを取得する方法。セルから値を取り出し、クリアする方法(複数範囲、ループ処理)

記事内に商品プロモーションを含む場合があります

まずは特定のセルを取得する

具体的な方法

セルから値や色、書式などの情報を取得するためには
「セルを取得」する必要があります。

例えば、A2セルを取得する方法です

セルを取得する方法は下記のいずれか

  • 【ブック名.シート名.】Range (“A2”)
  • 【ブック名.シート名.】Cells(2, 1)
  • 【ブック名.シート名.】Cells(2, “A”)

【ブック名】【シート名】は省略可
ただし、推奨はしません

実際にコーディングしてみましょう。
A2セルの値を取り出しています。

Sub test()

Debug.Print ThisWorkbook.Worksheets(1).Cells(2, 1).Value
'>>リンゴ

End Sub

説明

Debug.Printについて
イミディエイトウインドウという
プログラムの途中経過を確認するための場所があるのですが、
そのウインドウに表示させるためのプログラムです。

Thisworkbook
このプログラムを書いているブックのことを指します。

WorkSheets(1)
指定したブックのうちのシートの一番目のことです。

Cells(2, 1).Value
A2のセルを指定し、 「.Value」でA2の値を取得しています。

注意

ブック⇒シート⇒セルという順番で指定していきます。
ブックとシートは省略できます。
省略すると直前まで操作をしていたブックやシートを自動で指定してくれます。

基本的にはブックとシートの指定省略は推奨しません。
エラーの起きにくいプログラムを作るなら
しっかりブックとシートは指定しておきましょう。

意外にこれを言っているブログや書籍は少ないのですが(個人的にはかなり不思議)、
かなり大事です。

体験談

私も最初はブック、シートを指定せずにコードを書いていました。

しかし、大きなシステム、
例えばシート間やブック間で処理のやり取りをしだすと
予期せぬエラーが多発するようになり、収集が効かなくなりました。

狙っていたシートのセルではなく、
別のシートのセルを取得していたのです。

それからは必ずブックとシートは指定するようにしています

書くのが面倒だと思いますので
ブックやシートは変数に入れる
With文をうまく使う

などで効率的にコーディングすることをお勧めします。

複数のセルを取得するには

例えば、A1~D6まで
表の範囲全部を取得
したい場合

  • Range (“A1:D6”)
  • Range(Cells(1, 1), Cells(6, 1))
  • Range(Cells(1, “A”), Cells(6, “D”))

【ブック名.シート名.】は省略可

A1~D6までの値を全て
“変更”に変えてみます。

※ブック名、シート名は省略しないことを推奨しています。
ただし、そうすると非常に長くなるので
With文を使ってすっきりさせて書いてみます。

Sub test2()

'Rangeを使う場合
With ThisWorkbook.Worksheets(1)
    .Range("A1:D6").Value = "変更"
End With

'Cellを使う場合はこんな感じ
With ThisWorkbook.Worksheets(1)
    .Range(.Cells(1, 1), .Cells(6, 4)).Value = "変更"
End With

End Sub

特にcellsを入れて使う場合は冗長になりますね。

指定されたセルの値

セルの値の取得

指定したセル.Value

例えばA2(リンゴと入力されている)の値を取得するためには

Sub test()

Debug.Print ThisWorkbook.Worksheets(1).Cells(2, 1).Value
'>>リンゴ

End Sub

注意:複数一気に取得はできない

基本的にはセルの値は単一のセルからしか取得できません。

複数のセルを取得するためには
最低限For文の知識が必要になります。

最後に応用編として
複数のセルの値を取得する方法をご紹介しますので、
見てみてください。

セルに値を代入(単一のセル、複数範囲のセル)

指定したセル.Value = 「値」

Sub test3()

'単一のセルに値を入れる場合は、単一のセルを指定
ThisWorkbook.Worksheets(1).Cells(10, 1).Value = "ここはA1"

'複数のセルに入れるには複数のセルを指定するだけ
With ThisWorkbook.Worksheets(1)
    .Range(.Cells(12, 1), .Cells(15, 3)).Value = "A12~C15"
End With

End Sub

セルの値を削除・クリア(単一、複数範囲)

セルの値だけをクリア

色や背景色、枠線は消えさず、セルの値だけをクリアしたい場合です。

指定したセル.ClearContents

どうでもいいですが、A2セルの文字が「A1」になっていますね。
Sub test4()

'単一の場合
ThisWorkbook.Worksheets(1).Cells(2, "A").ClearContents

'複数の場合
With ThisWorkbook.Worksheets(1)
    .Range(.Cells(5, "A"), .Cells(8, "B")).ClearContents
End With

End Sub

文字だけ消せました

セルの文字色、背景色、枠線、値をクリア

セルの値だけでなく、文字の色や背景色をクリアしたい場合

指定したセル.Clear

Sub test5()

'単一の場合
ThisWorkbook.Worksheets(1).Cells(2, "A").Clear

'複数の場合
With ThisWorkbook.Worksheets(1)
    .Range(.Cells(5, "A"), .Cells(8, "B")).Clear
End With

End Sub

文字も色も、枠線も消えました。

応用

指定した複数のセルの値をFor文を使って取得する

複数のセルの値を一発で取得する方法はありません

取得するためにはFor文を使ってセル一つずつ値を取得していきます。

Sub test7()

'プログラムが複雑になったら積極的に変数を使いましょう
'圧倒的にコードが分かりやすくなります。
Dim r As Range
Dim Rng As Range

Set Rng = ThisWorkbook.Worksheets(2).Range("A2:A6")

'For文を使いセル一つずつ値を取り出す
'これが基本
For Each r In Rng
    Debug.Print r.Value
Next

End Sub

プログラミングの基本的な考えで
一つの処理ができるようになったら、
同じ処理をちょっとずつ条件を変えて処理をする

というものがあります。

今回もセルの値を取得することはできたので
セルを一つずつ代えて同じ処理をしていけば
目的のセルの値全てを取得することができます。

配列に格納してみる

ちなみにですが、上記のコードだと
ただ、イミディエイトウインドウに表示させただけです。

本来取得した値は何か別の目的(例えば別シートに転記とか)
に使うと思います。

そこで配列に格納して使いやすい形にしてみましょう。

Sub test7()

'プログラムが複雑になったら積極的に変数を使いましょう
'圧倒的にコードが分かりやすくなります。
Dim r As Range
Dim Rng As Range

Set Rng = ThisWorkbook.Worksheets(2).Range("A2:A6")


'まとめて何かに使用する場合は配列に格納させる
'配列は少し不親切なので当サイトで作ったオリジナル関数を使って分かりやすくしてます。
Dim arrs As Variant

For Each r In Rng
    Call add_Elm(arrs, r.Value)
Next

End Sub

上記のコードを動かすためには
当サイトで紹介しているオリジナル関数の
add_Elm関数Is_correct_array関数が必要です。

なぜ関数を作っているかというと
VBAの配列はかなり不親切なつくりになっているからです。

デフォルトのままでは配列に格納するという
基本的な操作でさえかなり冗長
かつエラーの起こりやすい作りになります。

長年のVBAプログラミングの経験から使いやすい関数を作成しました。

コードはこんな感じです。

Function add_Elm(ByRef arrs As Variant, ByVal elm As Variant)
    Dim num As Long
    
    'Is_correct_array関数で配列がエラーを起こす空の状態かどうか判定
    
    'エラーを起こす空の状態
    If Not Is_correct_array(arrs) Then
    
        '要素数が一つ=「0」で宣言
        ReDim arrs(0)
        arrs(0) = elm
    
    'エラーを起こす空の状態ではない
    Else
        num = UBound(arrs)
        ReDim Preserve arrs(num + 1)
        arrs(num + 1) = elm
    End If
End Function



Function Is_correct_array(ByVal arrs As Variant)
    Dim a As Long
    
    'なんでもいいが、エラーを生じさせる
    On Error GoTo err
    a = UBound(arrs)

    'エラーが生じたときエラー番号で9か13の場合はFalse
err:
    If err.number = 9 Or err.number = 13 Then
        Is_correct_array = False
    Else
        Is_correct_array = True
    End If
    
End Function

add_Elm関数の使い方はこちら
Is_Correct_array関数の使い方はこちらです。

他にも配列を便利に使いやすくする関数を作っています。

まとめ

いかがでしょうか。

まとめ
  • セルを指定する方法
    【ブック名.シート名.】Range (“A2”)
    【ブック名.シート名.】Cells(2, 1)
    【ブック名.シート名.】Cells(2, “A”)
  • セルを指定する際はブックとシートは極力省略しない
  • セルの値を取得
    指定したセル.Value
  • セルに値を代入
    指定したセル.Value = 「値」
  • セルの値だけをクリア
    指定したセル.ClearContents
  • セルの文字色、背景色、枠線、値をクリア
    指定したセル.Clear

VBAの学習方法をまとめました。

VBA(マクロ)のおすすめの学習方法 こんにちはhokkyokunです。 VBAを学ぶことで確実に業務は効率化し、余裕をもって仕事をすることができるようになります。 ...

VBAを高コスパで、短期間で学ぶにはUdemyがおすすめです。
Udemyは良質の学習プラットフォームですが、
動画数が多すぎてどれを見ればよいか迷います。

おすすめの講師をまとめました。

【Udemyは講師で選べ!】UdemyがVBA学習に最適な理由とおすすめのVBA講師 こんにちはhokkyokunです。 巨大学習プラットホームUdemyの中からVBAに関する動画について講師に焦点を当ててまとめま...

ブログ村ランキング参加中です。よかったらフォローお願いします!!

PVアクセスランキング にほんブログ村