传递给范围的字符串形式的单元格引用
Cell Reference in String Form Passed to a Range
我有名为 rngsx1 ... rngy2 的字典,包括单元格范围引用。这些单元格引用被传递到 rangesx1 ... rangesy2。因为 Array 参数只采用 Array("A1:B2") 的形式,所以我需要使用 Chr(34) 来传递它们,它代表引号 (")。
我为字典中的多个数据字符串创建了循环。我想将它们的所有第一个元素相互匹配,将所有第二个元素相互匹配,依此类推。
对于第一次试验,我只使用了字典中的一个元素,我想在定义的范围内打印它们的值。
但是子程序没有按我的意愿工作。你能帮我解决这个问题吗?
Sub CellReferenceToRange()
Dim rngx1, rngx2, rngy1, rngy2 As Range
Dim rangesx1, rangesx2, rangesy1, rangesy2 As Variant
' The Values at C15:C28 are assigned to rangesx1, rangesx2, rangesy1, rangesy2
rangesx1 = Array("C15:C28")
rangesy1 = Array("C15:C28")
rangesx2 = Array("C15:C28")
rangesy2 = Array("C15:C28")
' The Values at assigned ranges are set to rngx1, rngx2, rngy1, rngy2
For Each item in rangesx1, rangesx2, rangesy1, rangesy2
Set rngx1 = Range(Chr(34) & rangesx1 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngy1 = Range(Chr(34) & rangesy1 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngx2 = Range(Chr(34) & rangesx2 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngy2 = Range(Chr(34) & rangesy2 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
' The Set Ranges are printed to the defined cell area.
Range("AD21:AG34") = rngx1 & rngx2 & rngy1 & rngy2
Next
End Sub
当我运行代码时,我收到运行时错误 13“类型不匹配”,该错误在线:
Set rngx1 = Range(Chr(34) & rangesx1 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Frist rangesx1 = Array("C15:C28")
不需要是数组而是字符串。
Dim rangesx1 As String
rangesx1 = "C15:C28"
并且您不需要 Chr(34)
因为 rangesx1
已经是 String
类型
Set rngx1 = Range(rangesx1)
另请注意,Dim rngx1, rngx2, rngy1, rngy2 As Range
仅声明 rngy2 As Range
,但所有其他默认情况下均为 Variant
。您需要为 每个 变量指定一个类型:
Dim rngx1 As Range, rngx2 As Range, rngy1 As Range, rngy2 As Range
最后 For Each item in rangesx1, rangesx2, rangesy1, rangesy2
不是这样的,实际上不需要在这里循环。
也 Range("AD21:AG34") = rngx1 & rngx2 & rngy1 & rngy2
无法工作,因为 rngx1
与 Range("C15:C28").Value
相同,因此范围的值是一个值数组,您不能将值数组与 [=24 连接起来=].很不清楚你想在这里做什么。
我把代码改成这样:
但它正在工作。并在定义的单元格内给出单元格值。
但我想将 rangex1 扩展到更多范围,例如 rangesx1 = "C15:C28", "C15:C28", "C15:C28", "C15:C28", "C15:C28", "D15 :D28", "D15:D28", "F15:C28", "F15:C28"
应用它的形式是否正确?我可以在 for 循环中迭代它们吗?
Sub CellReferenceToRange()
Dim rngx1 As Range, rngx2 As Range, rngy1 As Range, rngy2 As Range
Dim rangesx1 As String, rangesx2 As String, rangesy1 As String, rangesy2 As String
' The Values at C15:C28 are assigned to rangesx1, rangesx2, rangesy1, rangesy2
rangesx1 = "C15:C28"
rangesy1 = "C15:C28"
rangesx2 = "C15:C28"
rangesy2 = "C15:C28"
' The Values at assigned ranges are set to rngx1, rngx2, rngy1, rngy2
'For Each item in rangesx1, rangesy1, rangesx2, rangesy2
Set rngx1 = Range(rangesx1) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngy1 = Range(rangesy1) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngx2 = Range(rangesx2) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngy2 = Range(rangesy2) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
' The Set Ranges are printed to the defined cell area.
Range("AD21:AD34") = rngx1.Value
End Sub
复制列值
- 调整常量部分的值(工作表名称和范围地址)。
Option Explicit
Sub CopyColumnValues()
' Make sure the addresses 'have' the same number of rows (cells),
' in this case 14 ('28 - 15 + 1 = 14', '34 - 21 + 1 = 14'.
Const sAddressesList As String = "C15:C28,D15:D28,F15:F28,J15:J28"
Const sName As String = "Sheet1"
Const dAddress As String = "AD21:AD34"
Const dName As String = "Sheet1" ' change if it is different
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim sws As Worksheet: Set sws = wb.Worksheets(sName)
Dim sAddresses() As String: sAddresses = Split(sAddressesList, ",")
Dim dws As Worksheet: Set dws = wb.Worksheets(dName)
Dim dfrg As Range: Set dfrg = dws.Range(dAddress)
Dim srg As Range
Dim drg As Range
Dim n As Long
For n = 0 To UBound(sAddresses)
Set srg = sws.Range(sAddresses(n))
Set drg = dfrg.Offset(, n)
drg.Value = srg.Value
Debug.Print n + 1 & ".) Wrote values from '" _
& sName & "!" & srg.Address(0, 0) & "' to '" _
& dName & "!" & drg.Address(0, 0) & "'."
Next n
MsgBox "Column values copied.", vbInformation, "Copy Column Values"
End Sub
即时结果Window (Ctrl + G)
1.) Wrote values from 'Sheet1!C15:C28' to 'Sheet1!AD21:AD34'.
2.) Wrote values from 'Sheet1!D15:D28' to 'Sheet1!AE21:AE34'.
3.) Wrote values from 'Sheet1!F15:F28' to 'Sheet1!AF21:AF34'.
4.) Wrote values from 'Sheet1!J15:J28' to 'Sheet1!AG21:AG34'.
我有名为 rngsx1 ... rngy2 的字典,包括单元格范围引用。这些单元格引用被传递到 rangesx1 ... rangesy2。因为 Array 参数只采用 Array("A1:B2") 的形式,所以我需要使用 Chr(34) 来传递它们,它代表引号 (")。 我为字典中的多个数据字符串创建了循环。我想将它们的所有第一个元素相互匹配,将所有第二个元素相互匹配,依此类推。 对于第一次试验,我只使用了字典中的一个元素,我想在定义的范围内打印它们的值。 但是子程序没有按我的意愿工作。你能帮我解决这个问题吗?
Sub CellReferenceToRange()
Dim rngx1, rngx2, rngy1, rngy2 As Range
Dim rangesx1, rangesx2, rangesy1, rangesy2 As Variant
' The Values at C15:C28 are assigned to rangesx1, rangesx2, rangesy1, rangesy2
rangesx1 = Array("C15:C28")
rangesy1 = Array("C15:C28")
rangesx2 = Array("C15:C28")
rangesy2 = Array("C15:C28")
' The Values at assigned ranges are set to rngx1, rngx2, rngy1, rngy2
For Each item in rangesx1, rangesx2, rangesy1, rangesy2
Set rngx1 = Range(Chr(34) & rangesx1 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngy1 = Range(Chr(34) & rangesy1 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngx2 = Range(Chr(34) & rangesx2 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngy2 = Range(Chr(34) & rangesy2 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
' The Set Ranges are printed to the defined cell area.
Range("AD21:AG34") = rngx1 & rngx2 & rngy1 & rngy2
Next
End Sub
当我运行代码时,我收到运行时错误 13“类型不匹配”,该错误在线:
Set rngx1 = Range(Chr(34) & rangesx1 & Chr(34)) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Frist rangesx1 = Array("C15:C28")
不需要是数组而是字符串。
Dim rangesx1 As String
rangesx1 = "C15:C28"
并且您不需要 Chr(34)
因为 rangesx1
已经是 String
Set rngx1 = Range(rangesx1)
另请注意,Dim rngx1, rngx2, rngy1, rngy2 As Range
仅声明 rngy2 As Range
,但所有其他默认情况下均为 Variant
。您需要为 每个 变量指定一个类型:
Dim rngx1 As Range, rngx2 As Range, rngy1 As Range, rngy2 As Range
最后 For Each item in rangesx1, rangesx2, rangesy1, rangesy2
不是这样的,实际上不需要在这里循环。
也 Range("AD21:AG34") = rngx1 & rngx2 & rngy1 & rngy2
无法工作,因为 rngx1
与 Range("C15:C28").Value
相同,因此范围的值是一个值数组,您不能将值数组与 [=24 连接起来=].很不清楚你想在这里做什么。
我把代码改成这样: 但它正在工作。并在定义的单元格内给出单元格值。
但我想将 rangex1 扩展到更多范围,例如 rangesx1 = "C15:C28", "C15:C28", "C15:C28", "C15:C28", "C15:C28", "D15 :D28", "D15:D28", "F15:C28", "F15:C28"
应用它的形式是否正确?我可以在 for 循环中迭代它们吗?
Sub CellReferenceToRange()
Dim rngx1 As Range, rngx2 As Range, rngy1 As Range, rngy2 As Range
Dim rangesx1 As String, rangesx2 As String, rangesy1 As String, rangesy2 As String
' The Values at C15:C28 are assigned to rangesx1, rangesx2, rangesy1, rangesy2
rangesx1 = "C15:C28"
rangesy1 = "C15:C28"
rangesx2 = "C15:C28"
rangesy2 = "C15:C28"
' The Values at assigned ranges are set to rngx1, rngx2, rngy1, rngy2
'For Each item in rangesx1, rangesy1, rangesx2, rangesy2
Set rngx1 = Range(rangesx1) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngy1 = Range(rangesy1) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngx2 = Range(rangesx2) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
Set rngy2 = Range(rangesy2) ' Chr(34) & rangesx1 & Chr(34) ---> "C15:C28"
' The Set Ranges are printed to the defined cell area.
Range("AD21:AD34") = rngx1.Value
End Sub
复制列值
- 调整常量部分的值(工作表名称和范围地址)。
Option Explicit
Sub CopyColumnValues()
' Make sure the addresses 'have' the same number of rows (cells),
' in this case 14 ('28 - 15 + 1 = 14', '34 - 21 + 1 = 14'.
Const sAddressesList As String = "C15:C28,D15:D28,F15:F28,J15:J28"
Const sName As String = "Sheet1"
Const dAddress As String = "AD21:AD34"
Const dName As String = "Sheet1" ' change if it is different
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim sws As Worksheet: Set sws = wb.Worksheets(sName)
Dim sAddresses() As String: sAddresses = Split(sAddressesList, ",")
Dim dws As Worksheet: Set dws = wb.Worksheets(dName)
Dim dfrg As Range: Set dfrg = dws.Range(dAddress)
Dim srg As Range
Dim drg As Range
Dim n As Long
For n = 0 To UBound(sAddresses)
Set srg = sws.Range(sAddresses(n))
Set drg = dfrg.Offset(, n)
drg.Value = srg.Value
Debug.Print n + 1 & ".) Wrote values from '" _
& sName & "!" & srg.Address(0, 0) & "' to '" _
& dName & "!" & drg.Address(0, 0) & "'."
Next n
MsgBox "Column values copied.", vbInformation, "Copy Column Values"
End Sub
即时结果Window (Ctrl + G)
1.) Wrote values from 'Sheet1!C15:C28' to 'Sheet1!AD21:AD34'.
2.) Wrote values from 'Sheet1!D15:D28' to 'Sheet1!AE21:AE34'.
3.) Wrote values from 'Sheet1!F15:F28' to 'Sheet1!AF21:AF34'.
4.) Wrote values from 'Sheet1!J15:J28' to 'Sheet1!AG21:AG34'.