Excel 是否使用绝对单元格引用更新模块中的多个工作表?
我在一个模块函数中,我有一个值需要跨多个工作表更新。我想采用数据驱动的方法来解决这个问题,因为它在未来可能会发生一些变化 本质上,我想创建一个字符串数组,每个条目都是对单元格的绝对引用,如下所示:Excel 是否使用绝对单元格引用更新模块中的多个工作表?,excel,excel-2007,vba,Excel,Excel 2007,Vba,我在一个模块函数中,我有一个值需要跨多个工作表更新。我想采用数据驱动的方法来解决这个问题,因为它在未来可能会发生一些变化 本质上,我想创建一个字符串数组,每个条目都是对单元格的绝对引用,如下所示: Array("'Sheet1'!$A$1","'Sheet2'!$C$5") 我希望能做这样的事情 for each item in arr Range(item).value = some_value next item 问题是我在一个模块中,范围属性仅在工作表上可用,如果我试图通过范围属性
Array("'Sheet1'!$A$1","'Sheet2'!$C$5")
我希望能做这样的事情
for each item in arr
Range(item).value = some_value
next item
问题是我在一个模块中,范围属性仅在工作表上可用,如果我试图通过范围属性从工作表a引用工作表B,它会给我一个错误
如何执行此操作?创建一个范围对象数组,如下所示:
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
给定一个字符串地址数组,您可以像
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
如果您可以切换到
范围的数组(或集合)
,那么justnS的答案更好。但是,如果您需要使用字符串数组,这就可以了。您询问了多个工作表,但表示您的程序稍后可能会扩展。如果可能需要更新多个工作簿,以下内容可能会有所帮助
我已将数组元素设置为工作簿名称、工作表名称、单元格地址和值。我假设目标工作簿是打开的,尽管宏在必要时打开它们并不困难。我测试工作簿和工作表名称,但不测试单元格地址
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