范围显示2种不同的方式,但不确定原因

时间:2018-02-01 02:43:24

标签: excel vba range

我想知道为什么当我似乎选择第一行作为范围时,以下显示的方式不同。

'writes to first column(expected to write to first row)
Set Rng = Range("A1, B1, C1")

Rng(1) = "blah"
Rng(2) = "blah2"
Rng(3) = "blah3"

'writes to first row
Set Rng = Range("A1:C1")

Rng(1) = "blah"
Rng(2) = "blah2"
Rng(3) = "blah3"

2 个答案:

答案 0 :(得分:1)

对此有一个非常简单的解释。首先让我们看一下Range Object接受的参数......

Range([Cell1], [Cell2])as Range, OR, Range(RowIndex, ColumnIndex)as Range, OR, Range(arg)

如您所见,Range只能接受2个参数; Cell 1和Cell2; RowIndex,ColumnIndex或参数(在引号中指定)。

所以,如果我们这样做......

Set Rng = Range([A1], [B1], [C1]): Rng(1) = "blah": Rng(2) = "blah2": Rng(3) = "blah3"

我们会收到错误:"编译错误:参数数量错误或属性分配无效)

这是因为我们只是试图将3个参数传递给只接受2的对象。

所以说到,你的代码运行而不会抛出错误的原因是,你已经在引用中定义了你的范围(作为参数),并在其间使用逗号。因此,您可能正在输入("A1, B1, C1"),但excel将其视为("A1")

因此,当您指定Rng(1)时,您正在实现Range对象的varient,这意味着您只需指定RowIndex,以便在第1,2,3行中填充值。 / p>

但是,如果我们这样做......

Set Rng = Range("A1")
Rng(1, 1) = "blah"
Rng(1, 2) = "blah2"
Rng(1, 3) = "blah3"

您将获得所需的结果,因为您已经指定了ColumnIndex以及RowIndex。

转到第二个范围("A1:C1") ...

在Range对象中使用引号时,您将其指定为参数。因此,如果你这样做("A1", "B1", "C1"),你会收到一个错误,因为当你只接受2时你试图传递3个参数。所以当你指定("A1:C1")时你会使用一个列表分隔符:告诉excel您指定了一系列单元格,与,相比,告诉Excel您将2个不同的单元格指定为Range([Cell1], [Cell2])

希望这能详细解答你的问题。

答案 1 :(得分:0)

首先,您在Range对象中定义单元格值的方式是不合适的。请尝试以下代码,它将产生具有两个不同范围定义的相同输出:

i = 1
For Each Cell In Rng
    Cell.Value = "blah" & i
    i = i + 1
Next

为什么你定义Range值的方式是这样的,我尝试了两个宏,如下所示。从宏的输出中,假设第一个范围元素的列号(例如A1的数字是1,而A1:D1的数字是4)是n,我们可以查看Rng(1) to Rng(n)的输出将首先填充n列,然后转到下一行。

无论您是否定义范围,都应注意Rng(n)始终存在。您可以随时定义或访问Rng(100)

Sub Test1()
Set my_sheet1 = ThisWorkbook.Worksheets("Sheet1")
'writes to first column(expected to write to first row)
Set Rng = my_sheet1.Range("A1:B2, C1, D1")

i = 1
For Each Cell In Rng
    Cell.Value = "blah" & i
    i = i + 1

Next
Rng(3) = "3rd Rng"
For i = 1 To 20
    Rng(i) = "No." & i & " Rng"
Next

End Sub

Sub Test2()
Set my_sheet2 = ThisWorkbook.Worksheets("Sheet2")
Set Rng = my_sheet2.Range("A1:D1")  'Range with 4 columns

'loop with 4 columns in a row
i = 1
For Each Cell In Rng
    Cell.Value = "blah" & i
    i = i + 1
Next

For i = 7 To 20
    Rng(i) = "No." & i & " Rng"
Next

End Sub