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