
假設在 A1 中我有「=ROW()」。該儲存格顯示“1”,因為它是工作表中的第一行。
現在在 A2 中,我輸入“=A1”。不幸的是,這引用了 A1 的 VALUE,而不是公式。如果它引用公式,那麼 A2 將給出值“2”(這就是我想要的)。
如果我之後繼續更改 A1 中的公式,那麼 A2 的值也會更改,因為它依賴 A1 中的公式。
我該怎麼辦?
答案1
無法使用 Excel 工作表函數本機執行此操作。如果您需要此功能,則必須使用 VBA。
您可以使用 Worksheet_Change() 事件。當儲存格內容發生變更時,它將觸發,但不會在簡單的重新計算時觸發。它有一個參數指示已更改的單元格;您可以使用它來查看是否需要執行任何操作。此程式碼需要放入您正在使用的工作表的程式碼區域中。 (使用 Alt+F11 開啟 VBA;在左側面板中,雙擊工作表。您應該會看到類似「Microsoft Visual Basic -檔案名稱- [工作表名稱(代碼)]”在標題列中。)
顯然,請根據以下程式碼的要求更新工作表名稱和範圍。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim test As Range, src As Range, dest As Range
Set src = Worksheets("Sheet1").Range("A1")
Set dest = Worksheets("Sheet1").Range("A2")
Set test = Intersect(Target, src)
If Not (test Is Nothing) Then
dest.Formula = src.Formula
End If
End Sub
上面的程式碼將準確複製公式 - 如果您引用儲存格 A1 中的儲存格 F3,您也會引用儲存格 A2 中的儲存格 F3。如果您不希望發生這種情況,請將 If 語句內的行變更為dest.FormulaR1C1 = src.FormulaR1C1
。這將適當地改變公式中的任何相對引用。
dest
如果您想根據儲存格 A1 中的公式一次設定一堆儲存格,您可以變更為更大的範圍。
需要注意的是,如果您更改這些單元格,這不會自動恢復單元格中的公式- 即,如果您更改A2 中的公式,這不會自動將其恢復,因為我們僅在單元格A1 時進行更新變化。如果您想防止這種情況,請更改線路
Set test = Intersect(Target, src)
到
Set test = Intersect(Target, Union(src, dest))