2016-10-03 77 views
0

的Excel 2013的Excel 2013:與不同片材計算細胞當在特定片復位計算細胞

我在此工作簿3名的工作表,其高度格式化和我使用了自定義式I VBA編碼利用的應用。易失性,因此每次輸入新數據時都會自動刷新計算結果。

我的團隊已將此工作簿上下格式化,並創建了一個包含公司財務報表的巨大跟蹤器。問題是,現在當我們打開工作簿並按f9 /加載計算工作表函數時,只有選定的工作表將根據該工作表內的參考單元進行更新和計算。

它應該做到這一點,但問題是在其他兩個選項卡內(請注意,總共有3個選項卡),具有公式的單元格將恢復爲當前不適用的所有零或舊數據。當您選擇最初未選中的另外兩個選項卡中的一個並按f9/load calculate sheet函數時,其中曾經有零/舊數據的函數的單元格基於單元格引用的新值進行更新,工作正常。

它繼續這樣做,因爲我們切換標籤並重新初始化f9/calculate sheet函數,另外兩個當前未選中的選項卡重置並顯示全零或舊數據。我一直在Google上搜索,並尋找解決方案,沒有任何工作。

Function RedFinder(MyCellColumn As Integer, MyOffset As Integer, MonthCheck As Integer, YearCheck As Integer) 
    Application.Volatile 
' Dim MyCellRow As Integer  'row I want to select 
    Dim MyMoneyValue As Variant 'Single holds a decimal variable 
    Dim MyAnswerString As String 
' Sheets("Sheet1").Activate 'activate sheet1 at cell script runs on 
' MyCellRow = 115    'set variable MyCellRow to row 1 
    MyMoneyValue = CDec("0.0") 


' ActiveSheet.Cells(MyCellRow, MyCellColumn).Select 'select active cell based on input vars 
    For MyCellRow = 2 To ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row 'for loop used to go through all cells 
     If IsDate(ActiveSheet.Cells(MyCellRow, MyCellColumn)) Then 'checks if cell is a date 
      If Month(ActiveSheet.Cells(MyCellRow, MyCellColumn)) = MonthCheck And Year(ActiveSheet.Cells(MyCellRow, MyCellColumn)) = YearCheck Then 'checks if month and date match 
       If IsNumeric(ActiveSheet.Cells(MyCellRow, MyCellColumn).Offset(0, MyOffset)) Then 'checks if corresponding column is a number 
        If ActiveSheet.Cells(MyCellRow, MyCellColumn).Offset(0, MyOffset).Font.Color = 255 Then 'checks if cell text color is red, 255 is the number Font.Color returns for RGB Red (255,0,0) 
         MyMoneyValue = MyMoneyValue + ActiveSheet.Cells(MyCellRow, MyCellColumn).Offset(0, MyOffset) 'adds cell value to MyMoneyValue 
'      MyAnswerString = MyMoneyValue 
'      MyCellRow = MyCellRow + 1 
'     Else 
'      MyCellRow = MyCellRow + 1 
        End If 
       End If 
'    Else 
'    MyAnswerString = "False" 
'    MyCellRow = MyCellRow + 1 
      End If 
     End If 
    Next MyCellRow 
'MsgBox MyCellColumnA 
'RedFinder = Year(ActiveSheet.Cells(MyCellRow, MyCellColumn)) 
RedFinder = MyMoneyValue 'sets function to report total of MyMoneyValue 
End Function 
+2

可能的原因是你的VBA功能相關的問題(這是這裏沒有包括),所以將它添加到你的問題中會很有用。您可能依賴於默認的工作表引用,而不是使用工作表來限定所有範圍/單元格引用。或者,如果您使用的是Application.Evaluate(或者僅僅是Evaluate),那麼它總是默認爲Activesheet,即使它是從其他工作表調用的。 –

+0

您正在使用Application.Volatile的事實告訴我,您的UDF可能存在問題。嘗試重寫UDF,以便VBA引用的所有單元都包含在傳遞給UDF的UDF參數中 - 那麼您將不再需要Application.volatile。 –

+0

這裏是我的VBA代碼: https://gist.github.com/anonymous/b409de8088f7f8c14b6b1856aa64b50e – Rob

回答

1

您需要刪除所有的ActiveSheet引用,並與該表的引用包含它調用你的UDF的公式代替他們

Function RedFinder(MyCellColumn As Integer, MyOffset As Integer, MonthCheck As Integer, YearCheck As Integer) 
    Application.Volatile 

    Dim MyMoneyValue As Variant 'Single holds a decimal variable 
    Dim MyAnswerString As String 
    Dim sht As Worksheet, c As Range, MyCellRow As Long 

    Set sht = Application.Caller.Parent '<<<< or use Application.ThisCell.Parent 

    MyMoneyValue = CDec("0.0") 

    For MyCellRow = 2 To sht.Cells(Rows.Count, 1).End(xlUp).Row 
     Set c = sht.Cells(MyCellRow, MyCellColumn) 
     If IsDate(c.Value) Then 
      If Month(c.Value) = MonthCheck And Year(c.Value) = YearCheck Then 'checks if month and date match 
       If IsNumeric(c.Offset(0, MyOffset)) Then 
        If c.Offset(0, MyOffset).Font.Color = 255 Then 
         MyMoneyValue = MyMoneyValue + c.Offset(0, MyOffset) 
        End If 
       End If 
      End If 
     End If 
    Next MyCellRow 

    RedFinder = MyMoneyValue 
End Function 
+0

你是最棒的蒂姆。非常感謝你。所以從我的理解activesheet是壞的事情與多個工作表。正如你所說,它更好地參考包含調用UDF的公式的表單。那麼這個sht = Application.Caller.Parent讓我可以調用其中的單元格表單而不是我選擇的活動表單? – Rob

+0

是的 - 這是正確的。 「ActiveSheet」,「Select」,「Activate」,「ActiveCell」等都是關鍵字,只有在絕對必要時才能在代碼中理想地顯示出來。 –