为什么我不能将String变量传递给VBA的Range函数?

时间:2011-09-08 17:30:08

标签: vba excel-vba excel

我尝试使用VBA在Excel中的Range上动态转置Recordset。当我给它一个静态范围时,我可以成功地进行换位:

Range("A1:C16").Select
Range("A1:C16").Value = Application.WorksheetFunction.Transpose(scores)

但是,当我尝试使用等效字符串并将其传递给Range函数时,它会失败。打印出来时我的变量trange是" A1:C16" (包括双引号)。我需要传递一个字符串的原因是因为字符串是从长度变量派生的,可以是任何值。

以下代码失败:

Dim trange As String
trange = """A1:C" & slength & """"
MsgBox (trange)
Range(trange).Select
Range(trange).Value = Application.WorksheetFunction.Transpose(scores)

不幸的是,在VBA中转义双引号是丑陋的,这就是为什么我的trange赋值表达式看起来很奇怪但是当我使用MsgBox时,它实际上给了我正确的值。

2 个答案:

答案 0 :(得分:9)

当您使用代码Range("A1:C16").Select时,引号不是字符串的一部分,而只是描述它。因此,您不需要通过转义它们来创建您正在创建的字符串中的引号。以下测试用例适用于我:

Dim trange As String
Dim slength As Integer

slength = 5
trange = "A2:C" & slength
MsgBox (trange)
Range(trange).Select
Range(trange).Value = 5

答案 1 :(得分:6)

使用字符串连接来构造范围地址是个坏主意。这很麻烦且容易出错(正如你的例子所示!)。

而不是Range("A1:C16"),您可以说出以下任何内容:

Range("A1").Resize(16, 3)
Cells(1, 1).Resize(16, 3)
Range(Cells(1, "A"), Cells(16, "C"))
Range(Cells(1, 1), Cells(16, 3))

可能有更多可能性。关键是它们都不涉及字符串连接。

在上述任何示例中,将16替换为slength以制作您的可变大小范围。

此外,最好指定您所指的工作表。而不是普通Range(anything),请使用例如

Sheet1.Range(anything)
Worksheets("Sheet1").Range(anything)

甚至更好,

With Sheet1
    .Range(anything)
    ' other stuff on Sheet1
End With