大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAでセル範囲を値として、セルに代入する際の注意点についてご紹介します。結果として、RangeにはValueをつけましょうということになります。反対に、Valueを付けないでもいいパターンについてもご紹介していきます。

はじめに

この記事では、セル範囲をRangeを使って、別のセルに値を代入する際の注意点について、ご紹介します。

別のセルに値を転記する、という場合には、Rangeを使います。

Rangeはオブジェクトですので、『値』として扱う場合には、『Value』が必要となります。

『Value』をつけ忘れてしまう場合の、パターンについて紹介していきます。

失敗のVBAコードをみて、エラーがでてしまった場合の改善に役立ててもらえばと思います。

この記事で紹介すること

  • Rangeを使って値をセルに代入するときの注意点

目次から見たい項目へ移動すると便利ですよ。

目次

ポイントとなるVBAコード

初めに、ポイントとなるVBAコードを記載しておきます。

VBAコードだけ確認したい場合に、ご活用ください。

'セル範囲を値として別セルに代入
.Range("E1:G3").Value = .Range("A1:C3").Value 'OK
.Range("E1:G3") = .Range("A1:C3") 'ダメなパターン

'オブジェクトとして変数に入れるパターン
Set a = .Range("A1:C3").Value
.Range("E1:G3").Value = a.Value 'OK
.Range("E1:G3") = a 'ダメなパターン

'配列として変数に入れるパターン
a = .Range("A1:C3")
.Range("E1:G3") = a

では、解説していきます。

VBAでセル範囲をセルに代入する

セル範囲の値を、別のセルに代入するときに、ちょっと注意が必要ということを解説します。

うっかり『Value』をつけ忘れると値が代入できない、という話です。

RangeとValueを使う

まず、VBAでセル範囲の値を、別のセルに代入するときは、Rangeを使って次のようにすると思います。

Sub TEST1()
    
    'セル範囲を値として、別セルに代入
    With ActiveSheet
        .Range("E1:G3").Value = .Range("A1:C3").Value
    End With
    
End Sub

実行すると次のようになります。

正解のパターン

Rangeを使ってセル範囲をセルに代入する

セル範囲の値が、別のセルに代入されました。

これがRangeを使う基本ですよね。

次に、間違ってVBAコードを記載してしまって、値が代入できないパターンです。

Valueを省略してみる

Rangeを使って、別のセルに値を代入するときに、RangeにValueをつけ忘れた場合です。

やってみます。

Sub TEST2()
    
    'セル範囲を値として、別セルに代入(ダメなパターン)
    With ActiveSheet
        .Range("E1:G3") = .Range("A1:C3")
    End With
    
End Sub

実行しても値は代入できません。

Valueをつけ忘れて値を代入できない

RangeにValueをつけ忘れて値を代入できない場合

結果は、実行しても値を代入することはできません。

セル範囲からセル範囲に、代入しているので、値は代入できないということになります。

Rangeの意味を、よく分からないで使ったりすると、たまにでるやっちゃいます。

Rangeで取得したセル範囲は、オブジェクトとして扱われるので、それを『値』として扱いたい場合は、『Value』をつける必要があります。

Rangeを使って、セル範囲を別のセルに代入する際には、『Value』です。忘れずに。

VBAでセル範囲のオブジェクトをセルに代入

もう一つ同じように、Rangeを使ってセル範囲を、オブジェクトとして、変数にセットして使った場合にエラーとなるパターンを紹介します。

オブジェクトの値をセルに代入

まず、セル範囲をRangeを使って、オブジェクトとして変数にセットにして、セルに値を代入する、というのをやってみます。

正解の例からご紹介します。

Sub TEST3()
    
    With ActiveSheet
        'セル範囲をオブジェクトとして変数に入れる
        Set a = .Range("A1:C3")
        'セル範囲を値として、別セルに代入
        .Range("E1:G3").Value = a.Value
    End With
        
End Sub

実行してみます。正解のパターンです。

正解のパターン

Rangeをオブジェクトにして、セル範囲の値を別のセルに代入した結果

Rangeをオブジェクトとして、別のセルに値を代入することができました。

ここでも、たまに『Value』をつけ忘れてしまうことがあります。

次で、ちょっとやってみます。

Valueを省略してみる

Rangeをオブジェクトとして変数にセットして、別のセルに値を代入するときに、『Value』をつけ忘れたパターンです。

Sub TEST4()
    
    
    With ActiveSheet
        'セル範囲をオブジェクトとして変数に入れる
        Set a = .Range("A1:C3")
        'セル範囲を値として、別セルに代入(ダメなパターン)
        .Range("E1:G3") = a
    End With
        
End Sub

実行してみます。これは『Value』がないので、値を代入できません。

Valueのつけ忘れで値を代入できない

Valueをつけ忘れて、別セルに値を代入する際に値を代入できない場合

実行しても、値は代入されません。

VBAコードを書く上で、変数に、オブジェクトや値もしくは配列などを、入力することがあります。

その際に、その変数が、オブジェクトなのか、もしくは値や配列なのかを、把握しておくことが重要です。

Valueとかめんどくさいなら変数を使う

ちなみに、セル範囲を一度、変数に入力してしまえば、別セルに代入する際に、『Value』を付けなくても済みます。

いちいち、Valueを付けるのがめんどくさかったり、VBAコードが長くなってしまって、いやだという場合に使うという手もあります。

一旦、変数に入力してセルに代入

Rangeでセル範囲を、一旦、変数に代入して、別のセルに値を代入してみます。

『Value』を付けないで済む方法です。

Sub TEST5()
    
    With ActiveSheet
        'セル範囲を値として、変数に入れる
        a = .Range("A1:C3")
        '値を、別セルに代入
        .Range("E1:G3") = a
    End With
        
End Sub

変数に代入すると、『これは値だ』とエクセルが勝手に認識してくれますので、『Value』を付ける必要がありません。

実行してみます。

Valueをつけないで大丈夫のパターン

Rangeでセル範囲を、変数に代入して、別のセルに値を代入する

別のセルに、Rangeを使って値を代入することができました。

『Value』を入力するのがめんどくさいとか、VBAコードを短くしたいといった場合に使えます。

Resizeを使うと便利

便利なVBA関数で、Resizeというものがあります。

別セルに値を代入したいという場合に、使えるVBA関数です。

なにかというと、セルに値を代入する際に、入力先のセル範囲を自動で調整してくれます。

ちょっとやってみます。

Sub TEST6()
    
    With ActiveSheet
        'セル範囲を値として、変数に代入
        a = .Range("A1:C3")
        '値を、セルに代入(Resizeを使う)
        .Range("E1").Resize(UBound(a, 1), UBound(a, 2)) = a
    End With
        
End Sub

入力先のセル範囲は、行や列の大きさは、定数で指定していないですよね。

これが、Resizeの楽なところです。

実行するともちろん、セル範囲の値を、別のセルに代入することができます。

セルに代入のとき、Resizeを使うと便利

Resizeを使ってセル範囲を別のセルに代入した結果

別のセルに値を代入することができています。

セルに値を代入する際に、『Resize』はおすすめです。

最後に少し、『Value』の話から脱線しました。

おわりに

この記事では、Rangeを使ってセル範囲の値を、別のセルに代入する際の注意点について、解説しました。

Rangeを使ってセルに値を代入する際に、値が代入できない原因になるのが、『Value』のつけ忘れです。

Rangeでセル範囲を取得すると、それは、オブジェクトなので、『値』として扱うには、『Value』を付ける必要があります。

セル範囲をオブジェクトとして、変数にセットした場合も、もちろん同じで、値として扱うには、『Value』が必要です。

『Value』とか、めんどくさいという場合は、一旦、セル範囲を、変数に入力して使う方法があります。

変数に入力してしまえば、それはオブジェクトではありませんので、別のセルに値を代入する際に『Value』を付ける必要がなくなります。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す