大家都知道Excel公式中使用的單元格引用有兩種形式:相對引用(如A1)和絕對引用(如$A$1)兩種形式,在輸入公式按可切換兩種引用形式。對於已有的公式,如果需要變更引用形式,逐個手工修改有些費勁,而且可能會導致人爲錯誤,使用正則表達式功能,可以完成公式的轉換。
工作表中B列已經設置公式,爲了便於查看將公式顯示於C列表,可以看出公式中既有相對引用,也有絕對引用,如下圖所示。
示例代碼如下。
Sub ChangeFormulaRef()
Dim objRegEx As Object
Dim objCell As Range
Dim strFormula As String
Set objRegEx = CreateObject("vbscript.Regexp")
objRegEx.Pattern = "([A-Z]{1,3})(\d{1,7})"
objRegEx.Global = True
For Each objCell In ActiveSheet.UsedRange.Columns(2).Cells
If objCell.HasFormula = True Then
strFormula = objCell.Formula
strFormula = objRegEx.Replace(strFormula, "$$$1$$$2")
objCell.Formula = strFormula
End If
Next
Set objRegEx = Nothing
Set objCell = Nothing
End Sub
運行示例代碼,結果如下圖所示,公式中的相對引用轉換爲絕對引用。
【代碼解析】
第5行代碼創建正則表達式對象。
第6行代碼設置匹配模式。
匹配模式 | 含義 |
---|---|
[A-Z]{1,3} | 1個至3個大小字母,匹配列標A到XFD,這裏不是嚴格的匹配,例如ZZZ也可以被匹配,但是這並不是合法的單元格列標 |
\d{1,6} | 1位至6位數字,匹配行號,同上也不是嚴格的匹配 |
第8~14行循環遍歷處理第2列的單元格。
第9行代碼判斷單元格是否包含公式。
第10行代碼提取單元格公式。
第11行使用正則替換變換公式字符串。
匹配模式 | 含義 |
---|---|
$$ | 是轉義的$ |
$1 | 代表第一個捕獲組的字符內容,即單元格引用中的列標 |
$2 | 代表第二個捕獲組的字符內容,即單元格引用中的行號 |
第14行代碼更新公式。
第15和16行代碼釋放對象變量的系統資源。