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

win*_*cki 2 excel vba excel-vba

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

Range("A1:C16").Select
Range("A1:C16").Value = Application.WorksheetFunction.Transpose(scores)
Run Code Online (Sandbox Code Playgroud)

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

以下代码失败:

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

不幸的是,在VBA转义双引号是丑陋的,这就是为什么我TRANGE赋值表达式看起来很奇怪,但是当我MSGBOX它,它实际上是在给我正确的值.

Dus*_*sty 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
Run Code Online (Sandbox Code Playgroud)


Jea*_*ett 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))
Run Code Online (Sandbox Code Playgroud)

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

更换16slength在任何的上面的例子,让您的可变大小的范围.

此外,最好指定您所指的工作表.而不是简单Range(anything),使用例如

Sheet1.Range(anything)
Worksheets("Sheet1").Range(anything)
Run Code Online (Sandbox Code Playgroud)

甚至更好,

With Sheet1
    .Range(anything)
    ' other stuff on Sheet1
End With
Run Code Online (Sandbox Code Playgroud)