Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2019)
【エラー】レンジを配列に代入
投稿日時: 23/07/11 09:53:23
投稿者: moyarism

一つのセルしかないレンジを配列に代入しようとすると「型が一致しません」というエラーになってしまい原因がわかりません。
「a1 = r1」この部分がエラーになってしまいます。
「a2 = r2」が通り「a1 = r1」が通らない理由は何なのでしょうか?
 
Function test()
 
    With Worksheets("Sheet1")
         
        Dim r1 As Range
        Set r1 = .Range(.Cells(1, 1), .Cells(1, 1))
 
        Dim r2 As Range
        Set r2 = .Range(.Cells(1, 1), .Cells(2, 1))
     
    End With
     
    Dim a1() As Variant
    a1 = r1
    Dim a2() As Variant
    a2 = r2
     
End Function

回答
投稿日時: 23/07/11 10:30:34
投稿者: sk

引用:
一つのセルしかないレンジを配列に代入しようとすると
「型が一致しません」というエラーになってしまい原因がわかりません。

引用:
Set r1 = .Range(.Cells(1, 1), .Cells(1, 1))

・単一のセルを参照する Range オブジェクトの Value プロパティは
 単一の Variant 型の値を返す(配列ではない)。
 
引用:
Dim r2 As Range
Set r2 = .Range(.Cells(1, 1), .Cells(2, 1))

・2 つ以上のセルが含まれるセル範囲を参照する Range オブジェクトの
 Value プロパティはそれらの値が格納された 2 次元配列を返す。
 
引用:
Dim a1() As Variant
a1 = r1

・単一の値を動的配列変数に直接代入することはできない。
 
引用:
Dim a2() As Variant
a2 = r2

・2 次元配列を動的配列変数に代入することはできる。

回答
投稿日時: 23/07/11 10:43:00
投稿者: Suzu

配列に、Range のValue を代入する場合
・単一セルの場合は、Variant(非配列)
・複数セルの場合は、動的配列
 
となります。
 
宣言の段階で、動的配列 を宣言しているので 型が違う と怒られます。
 
 
Dim a As Variant
a = r1
 
の様に、宣言の段階で、単に、Variant として宣言し Valueプロパティを渡す様にすれば
単一セルの場合はVariant
複数セルの場合はVariantの配列
 
となってくれます。
 
ただし、使っている変数が 配列かどうかを判断する必要が出てくる場合があります。
その場合は、IsArray関数を使い判定し分岐する(後判定)
 
 
判定をするのが面倒であれば、初めから RiDim を使い配列次元を変えて代入する事になるでしょう。

回答
投稿日時: 23/07/11 11:25:29
投稿者: WinArrow

対応策
 
Dim a1
Dim r1 As Range
    Range("A1").Value = "AA"
    Set r1 = Range("A1")
     
    If r1.Cells.Count = 1 Then
        ReDim a1(1 To 1, 1 To 1)
        a1(1, 1) = r1.Value
    Else
        a1 = r1.Value
    End If

投稿日時: 23/07/14 00:01:45
投稿者: moyarism

皆さん回答ありがとうございました。
動的に変化するレンジを使い動かし、何故1の時だけエラーが出てしまうのかでつまづいていました。
全て二次元配列で動かしてくれれば良いのにと思いますが仕様なので仕方ないですね..。
丁寧な回答感謝致します。