2011-11-18 60 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 
相關問題