2011-11-18 56 views
0

我在模块功能,我有一个值需要更新跨多个工作表。我想采取一种数据驱动的方式来解决这个问题,因为它在将来可能会有所改变。使用绝对单元格引用更新模块中的多个工作表?

从本质上说,我想创建一个字符串数组,每个条目是一个绝对引用的单元格,像这样:

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

我希望能够做一些事情,像这样

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

的问题是,我是一个模块中,Range属性只在工作表可供选择,如果我尝试通过Range属性从工作表中的参考表B,它给了我一个错误。

你会怎么做呢?

回答

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

给定的字符串地址的数组,你可以处理它像

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'回答我更好。但是,如果你需要坚持一串字符串,这将做到这一点。

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 
相关问题