大体でIT
大体でIT
2022/11/26
Excel VBAでセル範囲を値として、セルに代入する際の注意点についてご紹介します。結果として、RangeにはValueをつけましょうということになります。反対に、Valueを付けないでもいいパターンについてもご紹介していきます。
この記事では、セル範囲をRangeを使って、別のセルに値を代入する際の注意点について、ご紹介します。
別のセルに値を転記する、という場合には、Rangeを使います。
Rangeはオブジェクトですので、『値』として扱う場合には、『Value』が必要となります。
『Value』をつけ忘れてしまう場合の、パターンについて紹介していきます。
失敗のVBAコードをみて、エラーがでてしまった場合の改善に役立ててもらえばと思います。
初めに、ポイントとなるVBAコードを記載しておきます。
VBAコードだけ確認したい場合に、ご活用ください。
'セル範囲を値として別セルに代入
Range("E1:G3").Value = Range("A1:C3").Value 'OK
Range("E1:G3") = Range("A1:C3") 'ダメなパターン
Dim A
'オブジェクトとして変数に入れるパターン
Set A = Range("A1:C3")
Range("E1:G3").Value = A.Value 'OK
Range("E1:G3") = A 'ダメなパターン
'配列として変数に入れるパターン
A = Range("A1:C3")
Range("E1:G3") = A
セル範囲の値を、別のセルに代入するときに、ちょっと注意が必要ということを解説します。
うっかり『Value』をつけ忘れると値が代入できない、という話です。
まず、VBAでセル範囲の値を、別のセルに代入するときは、Rangeを使って次のようにすると思います。
Sub TEST1()
'セル範囲を値として、別セルに代入
Range("E1:G3").Value = Range("A1:C3").Value
End Sub
正解のパターン
次に、間違ってVBAコードを記載してしまって、値が代入できないパターンです。
Rangeを使って、別のセルに値を代入するときに、RangeにValueをつけ忘れた場合です。
Sub TEST2()
'セル範囲を値として、別セルに代入(ダメなパターン)
Range("E1:G3") = Range("A1:C3")
End Sub
Valueをつけ忘れて値を代入できない
セル範囲からセル範囲に、代入しているので、値は代入できないということになります。
Rangeの意味を、よく分からないで使ったりすると、たまにでるやっちゃいます。
Rangeで取得したセル範囲は、オブジェクトとして扱われるので、それを『値』として扱いたい場合は、『Value』をつける必要があります。
Rangeを使って、セル範囲を別のセルに代入する際には、『Value』です。忘れずに。
もう一つ同じように、Rangeを使ってセル範囲を、オブジェクトとして、変数にセットして使った場合にエラーとなるパターンを紹介します。
まず、セル範囲をRangeを使って、オブジェクトとして変数にセットにして、セルに値を代入する、というのをやってみます。
Sub TEST3()
Dim A
'セル範囲をオブジェクトとして変数に入れる
Set A = Range("A1:C3")
'セル範囲を値として、別セルに代入
Range("E1:G3").Value = A .Value
End Sub
正解のパターン
Rangeをオブジェクトとして、別のセルに値を代入することができました。
ここでも、たまに『Value』をつけ忘れてしまうことがあります。
Rangeをオブジェクトとして変数にセットして、別のセルに値を代入するときに、『Value』をつけ忘れたパターンです。
Sub TEST4()
Dim A
'セル範囲をオブジェクトとして変数に入れる
Set A = Range("A1:C3")
'セル範囲を値として、別セルに代入(ダメなパターン)
Range("E1:G3") = A
End Sub
実行してみます。これは『Value』がないので、値を代入できません。
Valueのつけ忘れで値を代入できない
VBAコードを書く上で、変数に、オブジェクトや値もしくは配列などを、入力することがあります。
その際に、その変数が、オブジェクトなのか、もしくは値や配列なのかを、把握しておくことが重要です。
ちなみに、セル範囲を一度、変数に入力してしまえば、別セルに代入する際に、『Value』を付けなくても済みます。
いちいち、Valueを付けるのがめんどくさかったり、VBAコードが長くなってしまって、いやだという場合に使うという手もあります。
Rangeでセル範囲を、一旦、変数に代入して、別のセルに値を代入してみます。
Sub TEST5()
Dim A
'セル範囲を値として、変数に入れる
A = Range("A1:C3")
'値を、別セルに代入
Range("E1:G3") = A
End Sub
変数に代入すると、『これは値だ』とエクセルが勝手に認識してくれますので、『Value』を付ける必要がありません。
Valueをつけないで大丈夫のパターン
別のセルに、Rangeを使って値を代入することができました。
『Value』を入力するのがめんどくさいとか、VBAコードを短くしたいといった場合に使えます。
便利なVBA関数で、Resizeというものがあります。
別セルに値を代入したいという場合に、使えるVBA関数です。
なにかというと、セルに値を代入する際に、入力先のセル範囲を自動で調整してくれます。
Sub TEST6()
Dim A
'セル範囲を値として、変数に代入
A = Range("A1:C3")
'値を、セルに代入(Resizeを使う)
Range("E1").Resize(UBound(A, 1), UBound(A, 2)) = A
End Sub
入力先のセル範囲は、行や列の大きさは、定数で指定していないですよね。
実行するともちろん、セル範囲の値を、別のセルに代入することができます。
セルに代入のとき、Resizeを使うと便利
セルに値を代入する際に、『Resize』はおすすめです。
この記事では、Rangeを使ってセル範囲の値を、別のセルに代入する際の注意点について、解説しました。
Rangeを使ってセルに値を代入する際に、値が代入できない原因になるのが、『Value』のつけ忘れです。
Rangeでセル範囲を取得すると、それは、オブジェクトなので、『値』として扱うには、『Value』を付ける必要があります。
セル範囲をオブジェクトとして、変数にセットした場合も、もちろん同じで、値として扱うには、『Value』が必要です。
『Value』とか、めんどくさいという場合は、一旦、セル範囲を、変数に入力して使う方法があります。
変数に入力してしまえば、それはオブジェクトではありませんので、別のセルに値を代入する際に『Value』を付ける必要がなくなります。
参考になればと思います。最後までご覧くださいまして、ありがとうございました。