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它,它实际上是在给我正确的值.
当您使用代码时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)
使用字符串连接来构造范围地址是一个坏主意.这很麻烦且容易出错(正如你的例子所示!).
而不是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)
可能有更多的可能性.关键是它们都不涉及字符串连接.
更换16用slength在任何的上面的例子,让您的可变大小的范围.
此外,最好指定您所指的工作表.而不是简单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)