我尝试使用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时,它实际上给了我正确的值。
答案 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