我在模块函数中,我有一个需要在多个工作表中更新的值。我想采用数据驱动的方法,因为它可能会在未来发生一些变化。
本质上,我想创建一个字符串数组,每个条目都是对单元格的绝对引用,如下所示:
Array("'Sheet1'!$A$1","'Sheet2'!$C$5")
我希望能够做到这样的事情
for each item in arr
Range(item).value = some_value
next item
问题是我在一个模块中,Range属性仅在工作表上可用,如果我尝试通过Range属性从工作表A引用工作表B,它会给我一个错误。
你会怎么做呢?
答案 0 :(得分:1)
创建一个范围对象数组,如下所示:
arr = Array(WorkSheets("Sheet1").Range("A1"), WorkSheets("Sheet2").Range("C5"))
Dim rng as Range
For i = LBound(arr) To UBound(arr)
arr(i).Value = some_value
Next i
您也可以使用Collection类
Dim coll As New Collection
Dim rng As Range
coll.Add WorkSheets("Sheet1").Range("A1")
coll.Add WorkSheets("Sheet2").Range("C5")
For Each rng In coll
rng.Value = some_value
Next rng
答案 1 :(得分:1)
给定一个字符串地址数组,您可以像
一样处理它Sub Demo()
Dim arr As Variant
Dim sh As String, addr As String
Dim item As Variant
arr = Array("'Sheet 1'!$A$1", "'Sheet2'!$C$5")
For Each item In arr
sh = Replace(Left(item, InStr(item, "!") - 1), "'", "")
addr = Mid(item, InStr(item, "!") + 1)
Worksheets(sh).Range(addr) = some_value
Next
End Sub
如果你可以切换到Range
的数组(或集合),那么justnS'答案会更好。但是如果你需要坚持使用一串字符串,那就可以了。
答案 2 :(得分:0)
您询问了多个工作表,但是说您的程序可能会在以后扩展。如果您可能需要更新多个工作簿,以下内容可能会有所帮助。
我已将数组元素设置为工作簿名称,工作表名称,单元格地址和值。我假设目标工作簿是开放的,尽管如果必要的话宏也不难打开它们。我测试工作簿和工作表名称,但不测试单元格地址。
Sub Test1()
'
Dim Dest() As Variant
Dim DestPart() As String
Dim Found As Boolean
Dim InxBook As Integer
Dim InxDest As Integer
Dim InxSheet As Integer
Dest = Array("Test1.xls|Sheet3|B1|abc", "Test2.xls|Sheet2|F5|def", _
"Test3.xls|Sheet1|D3|ghi")
' Each element of Dest contains: workbook name, sheet name, cell address,
' and value separated by pipes.
' This code assumes the destination workbooks are already open.
For InxDest = LBound(Dest) To UBound(Dest)
DestPart = Split(Dest(InxDest), "|")
Found = False
For InxBook = 1 To Workbooks.Count
If DestPart(0) = Workbooks(InxBook).Name Then
Found = True
Exit For
End If
Next
If Found Then
With Workbooks(InxBook)
Found = False
For InxSheet = 1 To .Sheets.Count
If DestPart(1) = .Sheets(InxSheet).Name Then
Found = True
Exit For
End If
Next
If Found Then
.Sheets(InxSheet).Range(DestPart(2)).Value = DestPart(3)
End If
End With
End If
Next
End Sub