2016-01-28 102 views
0

我有一個包含許多工作表的大型工作簿。每個工作表都包含用戶輸入和計算的組合,並且大多數鏈接指向其他工作表上的輸入或輸出。該工作簿還包含一個包含許多自定義VBA函數的模塊。單元格值更改時自動運行VBA宏

我試圖自動goalseek位於未選中/非活動工作表上的單元格,如果用戶更改活動工作表上鍊接到另一個工作表上的計算輸入的值,我想到goalseek。示例:

「Sheet7」上的單元格A1包含一個數字,該數字是基於同一工作表的單元格A2,A3和A4中的值計算結果的「猜測」(例如,A1是名義結果A2 + A3 + A4)。單元格A2,A3和A4是三個其他工作表的計算結果的鏈接。 「Sheet7」上的單元格A5是A2 + A3 + A4的實際結果,它可能與A1中的值不匹配。單元格A6是A6中的計算結果與A1中的值之間的差異,我將A6的目標搜索值確保爲A5中的計算值始終與A1中的「硬編碼」值匹配。

我希望這個goalseek可以隨時在「Sheet7」上改變A2,A3或A4的值,即使在改變發生時沒有選擇「Sheet7」。 A2可以鏈接到「Sheet2」,A3可以鏈接到「Sheet14」,A4可以鏈接到「Sheet9」。如果用戶選擇了「Sheet2」並更改了某些改變與「Sheet7」上單元格A2鏈接的值的內容,我希望這個宏能夠運行(原因是「Sheet7」A1的值會鏈接回其他許多工作表重要的是它保持更新或整個工作簿中的整個計算鏈都會失敗)。

如果我選擇了「Sheet7」並更改了A2,A3或A4,但所有宏示例/帖子都找到了工作,但是如果我選擇了其他任何工作表並進行更改以更改鏈接值無論我嘗試過的所有代碼變體都不會運行。

我沒有很好的整體「VBA架構」的句柄,所以有人可以用可理解的術語和我需要做的或者代碼添加到模塊或工作表的某些方向提供答案, (或兩者)。

+0

你不能去改變它只是一個公式的計算。在A2中具有'= A1',如果它改變,它將永遠不會觸發A2 ...只有用戶輸入觸發更改(或VBA本身)...因此,您需要跟蹤活動工作表並更改單元格以瞭解要對尋找... –

+0

也...你可以在工作表中寫入'worksheetchange'(只計算該表)或在'ThisWorkbook'-模塊中爲所有工作表執行...但如前所述,只是一個不同公式的結果不會觸發它。即使在這裏有很多文本,我仍然沒有得到你真正的問題:/ –

+0

最根本的問題是,我試圖解決循環引用問題。我提供的例子是嘗試(也許沒有成功)提供一個我想要做的事情的簡單例子。實際上它要複雜得多(也就是說,我沒有從計算中使用的其他紙張鏈接單元格A2,A3和A4,但有幾十個)。 – doubleoerik

回答

1

您可以使用「手動計算」-trick。

工作簿只需設置手動計算,那麼在「的ThisWorkbook」做代碼:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    Application.EnableEvents = False 
    Dim a As String 
    a = Sheets("Sheet7").Range("A5").Value 
    Calculate 
    If a <> Sheets("Sheet7").Range("A5").Value Then 
    'call your seek here 
    End If 
    Application.EnableEvents = True 
End Sub 

你需要改變它來滿足您的需求,但它仍然應該把你在正確的方向;)

0

我注意到在你的評論中你提到過你希望你的宏能夠在Sheet7中任何特定的單元格發生變化時運行。如果你只是在你的VBA編輯器中將下面的代碼粘貼到Sheet7中,它應該做到這一點(在這裏,我假設你希望單元格H5改變,一旦它改變了,你應該得到消息「WORKS」。如果出現,那麼y ou做了一切正確的,可以用你需要的那個代替msgbox代碼):

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Not Intersect(Target, Me.Range("H5")) Is Nothing Then 
     MsgBox "WORKS" 
    End If 
End Sub 
+0

感謝您的所有幫助!作爲對最後一篇文章的迴應,如果我這樣做,只要「Sheet7」是活動工作表,並且用戶在物理輸入單元格「H5」(引用您的示例代碼)中物理輸入一個新值,那麼一切都可以正常工作。但是,單元格「H5」中的等式類似於「= Sheet2!A1」,其中Sheet2上的單元格A1是實際的用戶輸入單元格。如果導航到Sheet2並更改單元格A1中的值,則鏈接的單元格將在Sheet7上更改,但該宏不會運行。讓它運行的唯一方法是選擇Sheet7並在單元格A1中鍵入一個值。那有意義嗎? – doubleoerik

+0

不幸的是,它不會起作用,因爲Target會定義您當前選擇和修改的單元格。正是由於這個原因,只有選擇並修改了工作表7上的「H5」,該宏才起作用。鏈接的單元格不能使其工作。你爲什麼不考慮在一張工作表中傳輸所有的輸入單元?它可以讓你整理你的數據,讓你更容易跟隨輸入部分,更重要的是,讓這個宏成爲可能! –

相關問題