これが理由です。あなたがこれを言うとき:
Dim startCell, iCell As Range
あなたはこれをしたと思います:
Dim startCell As Range, iCell As Range
しかし、あなたが実際に行ったことはこれです:
Dim startCell 'As Variant, by default
Dim iCell As Range
これは典型的なVBAの間違いです。Dim
ほとんどのVBAプログラマーはそれを実現しました。そのため、ほとんどのVBAプログラマーは、ステートメントごとに1つの変数(つまり、1行に1つ)のみを宣言することに頼っています。そうでなければ、その間違いを犯すのは簡単すぎて、後でそれを見つけるのは難しいです。
したがってDim startCell
、変数をVariant型(と同等Dim startCell As Variant
)として暗黙的に宣言しました。
あなたがこれを言うとき:
Set startCell = Cells(iCell.Row + 1, iCell.Column)
Variantは、参照割り当ての右側にあるもののタイプ(範囲)を取得します。しかし、あなたがこれを言うとき:
startCell = Cells(iCell.Row + 1, iCell.Column)
キーワードがないSet
と、参照を割り当てるのではなく、変数に値を割り当てます。変数startCell
は、右側の値のタイプを取得します。そのタイプは何ですか?RangeオブジェクトのデフォルトのプロパティはValue
です。したがって、のタイプを取得しますCells(iCell.Row + 1, iCell.Column).Value
。そのセルに文字列が含まれている場合は、文字列を取得します。