2017-05-20 121 views
0

當Excel爲我的宏執行某些VBA代碼時,我遇到了一些正確結果的問題。顯示IF公式而不是結果

不是將公式放在所需的單元格中,而是給出了該公式的結果,在這種情況下爲TRUE或FALSE。

此代碼工作正常,它把公式中的細胞,結果顯示:

Range("AL12").Select 
ActiveCell.Formula = "=SUM" & ActiveCell.Formula 

這個代碼不工作,我得到一個錯誤:

Range("AL12").Select 
ActiveCell.Formula = "=IF" & ActiveCell.Formula 

這代碼工作,但它沒有給出公式,只有結果:

Range("AL12").Select 
ActiveCell.Formula = "" = "IF" & ActiveCell.Formula 

Range("AL12").Select 
ActiveCell.Value= "" = "IF" & ActiveCell.Value 

如何獲取宏以將公式放入單元格中,以便公式可以計算結果應爲0或1而非TRUE或FALSE。完全像它在第一行代碼中那樣?

+0

從未知部分構建公式的可能性不大。對於你的第一個例子,你的ActiveCell似乎含有類似「(A3:A12)」的東西。因此你的第一個例子工作。但是你的第二個例子在ActiveCell中必須有相當不同的值,因爲你可能不會期望'= IF(A3:12)'給出任何結果。因此,請爲您的每個示例披露「ActiveCell.Formula」的格式。 – Variatus

+0

'ActiveCell.FormulaR1C1 = _ 「= CONCATENATE(」「= ALS('D:\ Google Drive \ Pat Bud \ Begrotingen \'Begroting」「,RC3,」「」「,RC2,」「 - 」「, RC7,「」。xlsx] Totaal'!$ L $ 66 = 0「」,「」;「」,1,「」「,」「,0,」「)」「)」' – Vigilante

+0

所有單元格都有'通用'格式'。我正在做的是減少這種連接:'ActiveCell.FormulaR1C1 = _ 「= CONCATENATE(」「= IF('D:\ Google Drive \ Pat Bud \ Begrotingen \ [Begroting」「,RC3,」「。」「」 ,RC2,「」 - 「」,RC7,「」。xlsx] Totaal'!$ L $ 66 = 0「」,「」;「」,1,「」;「」,0,「」)「」)「 (例如):'= IF('D:\ Google Drive \ Pat Bud \ Begrotingen \ [Begroting 207.17-1.xlsx] Totaal'!$ L $ 66 ='使用'Copy.Value' 0; 1; 0)'這正是我想要的,但它需要一個手動的'ENTER'才能開始工作。 – Vigilante

回答

0
ActiveCell.Formula = "" = "IF" & ActiveCell.Formula 

ActiveCell.Formula = "" = "IF" & ActiveCell.Value 

號這些都不是「工作,但把結果而不是公式的」。他們只是將FALSE寫入單元格。例如因爲第一個語句含義:

ActiveCell.Formula = ( "" = ("IF" & ActiveCell.Formula) ) 

在RHS是一個比較這顯然導致False

至於其他形式的OP,即

ActiveCell.Formula = "=SUM" & ActiveCell.Formula 

你只是前面加上"=SUM"到現有的公式,或者不了了之的情況下,舊電池是空的;在任何情況下,結果公式都有錯誤的語法。

+0

我明白了,是的,我只是將「= SUM」預先添加到現有的公式中。我這樣做的原因是因爲源公式是一個連接,當我只複製這個連接公式的值到另一個單元格時,它給了我正確的結果(另一個公式),但我需要手動輸入單元格並按「ENTER」爲公式工作。通過預先設定「= SUM」,我設法讓它工作,但我不能用「IF」來做到這一點。感謝您的輸入。 – Vigilante

+0

*「通過預先設定」= SUM「我設法讓它工作」* Doh,您必須使用別的東西,而不是Excel。可能是標籤錯誤。 –

+0

這絕對是Excel,無論如何,謝謝。我會找到一種方法讓它工作一天。 – Vigilante

0

如果activecell中已經有一個公式,並要修改或增強配方VBA,你一定要注意龍頭=

假設我們有一個包含電池:

=SUM(A1:A123) 

,我們運行:

Sub Vig() 
    Dim s As String 
    s = ActiveCell.Formula 
    MsgBox s 
End Sub 

我們得到:

enter image description here

如果我們想在IF聲明嵌入這一點,我們可以使用類似:

Sub Vig_2() 
    Dim s As String 
    s = Mid(ActiveCell.Formula, 2) 
    ActiveCell.Formula = "=IF(" & s & "=0,9999," & s & ")" 
End Sub 

​​

MID( )刪除原來的=

+0

謝謝Gary,我根據你的代碼嘗試了幾個變體,但是我仍然只得到沒有公式的結果。我會繼續擺弄,謝謝你的意見。 – Vigilante

0

這永遠不會順利進行。它在你設計的系統中內置了太多的不穩定性。正確的方法是獲取每個數據並將其寫入某處,並且在您將所有數據安全寫下之前不要開始進行任何計算。

您可以寫入工作簿單元格。這些可以位於您希望顯示結果的相同工作表中,可見列或隱藏列中,也可以位於另一張可見或隱藏或非常隱藏的表單上(即,如果沒有VBA的幫助,用戶無法將其顯示出來)。你也可以「寫入」內存,意思是賦值給變量。

同樣的方法也應該應用於參數。例如,網址不應該在公式中。它應該位於單元格中或代碼中聲明的常量中。事實上,你應該學會觀察的第一條規則就是不要在任何公式中寫入任何常數。公式操作數據。他們不包含他們。

雖然您正在修改您的結構,我還建議您檢查VBA和工作表函數之間的關係。應該使用VBA編寫函數的情況相當罕見。通常情況下,VBA不是作爲功能的補充,而是作爲替代。工作表函數並不意味着要做非常複雜的工作,就像你試圖讓他們做的那樣。由此產生的代碼是錯綜複雜的,並最終成爲無法解決問題(因爲它是你目前的經驗)。把所有這些都加入到VBA中,並且花費你數星期和數週的時間才能達成妥協,只需幾個小時即可達到完美。

+0

感謝Variatus,對於如何構建適當的宏,這是一個非常清晰的見解。看起來我需要做很多工作來改造結構,但是我感覺有動力:) – Vigilante

相關問題