2012-11-12 41 views
6

我已經編寫了一些VBA代碼,它使用單個單元格並在工作簿中標識所有依賴項(通過NavigateArrow分析)並將其範圍位置添加到數組中。從這裏我希望能夠更新每個依賴項並將對原始單個單元格的引用更改爲另一個指定的單元格。用VBA中的另一個單元格引用替換依賴項

我在這裏遇到的特殊困難是,雖然我知道每個依賴項的位置,但對原始單元格的引用可能位於公式的開始,中間或結尾,並且可能是未錨定的,行/列/既可以錨定,也可以放在不同的工作表上,因此在它之前有一個工作表引用等等。因此,我不能在每個依賴單元格中輕鬆找到並替換,因爲這些潛在的差異,另外我想保留原始錨定在每個單元格中引用。

有沒有一個優雅的甚至是不雅的VBA解決方案來解決這個問題?

+1

好像只有四個需要替換的參考/地址的變體(相對/固定行/固定列/固定行+列),所以你可以循環遍歷所有這些,如果發現則更換(調整相應的替換地址) –

+0

是的,我看不到任何其他方式,這是一個恥辱,因爲它似乎有點笨重。謝謝你的幫助! –

+0

我認爲這些不是唯一的變體 - 它是否不包括命名範圍?還是他們算作單獨的參考? –

回答

1

正則表達式或正則表達式,正是你在尋找我認爲。

以下模式

([A-Z0-9]*)!(\${0,1})([A-Z]{1,3})(\${0,1})([0-9]*) 

會匹配 「工作表Sheet1!A1」 的東西, 「工作表Sheet1!$ A $ 1」, 「工作表Sheet1!$ A1」, 「工作表Sheet1!A $ 1」

說明:

([A-Z0-9]*)! = Find anything that is before "!" 
(\${0,1}) = $ or nothing 
([A-Z]{1,3}) = between one and three letters 
([0-9]*) = Any number 

您應該很容易就能夠修改該模式以僅匹配您想要的。特別是,([A-Z0-9] *)!(\ $ {0,1})B(\ $ {0,1})1,只會與B($)1匹配 使用字符串操作構造正則表達式模式,應該很好。

你需要引用(工具>參考)在「Microsoft VBScript的正則表達式5.5」

嘗試下面的代碼,這應該給你所有的工具來實現自己的目標

Sub ReplaceReference() 
' Reference: Microsoft VBScript Regular Expressions 5.5 

Dim RegEx As Object 
Set RegEx = New RegExp 

Dim s As String 

' Here I have hardcoded the reference to the original cell for demonstration purposes 
s = "Sheet1!$AB$2" 


' Replacement: New sheetname, New Column, new row number 
Dim NewCol As String, NewRow As String 
NewCol = "C" 
NewRow = "10" 

Dim NewSheet As String 
NewSheet = "Sheet2" 


With RegEx 
    .Pattern = "([A-Z0-9]*)!(\${0,1})([A-Z]{1,3})(\${0,1})([1-9]*)" 
    .IgnoreCase = True 
    .Global = True 
End With 


Debug.Print RegEx.Replace(s, NewSheet & "!" & "$2" & NewCol & "$4" & NewRow) 


End Sub 

歡呼聲, Julien

0

爲什麼不用VBA剪切和粘貼源單元?然後,Excel將調整所有光榮變化的單元格引用。

我創建了幾個帶引用的單元格,然後使用宏記錄器來查看選擇單元格,剪切和複製內容時生成的VBA中可能發生的情況。該行爲是按預期,具體如下:

Range("A1").Select 
Selection.Cut 
Range("B1").Select 
ActiveSheet.Paste 

這將適用於以下工作:

A1 1 
A2 =A1 
A3 =$A$1 
A4 =1+A1 
A5 =1+A1+1 

運行宏後,所有引用指向B1目標單元格。

相關問題