从具有绝对单元格引用的模块更新多个工作表?

时间:2011-11-18 18:55:07

标签: excel-vba excel-2007 vba excel

我在模块函数中,我有一个需要在多个工作表中更新的值。我想采用数据驱动的方法,因为它可能会在未来发生一些变化。

本质上,我想创建一个字符串数组,每个条目都是对单元格的绝对引用,如下所示:

Array("'Sheet1'!$A$1","'Sheet2'!$C$5")

我希望能够做到这样的事情

for each item in arr
  Range(item).value = some_value
next item

问题是我在一个模块中,Range属性仅在工作表上可用,如果我尝试通过Range属性从工作表A引用工作表B,它会给我一个错误。

你会怎么做呢?

3 个答案:

答案 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