2015-10-16 32 views
0

我有一個需要輸出到單元格的公式,該公式是附加的。輸出返回的數字應該爲負數爲零。我知道這很簡單,但無法使輸出正常工作。等式的負數輸出

private sub grade() 
Dim i As Long 
Dim j As Long 
Dim ncolum As Long 
Dim nRows As Long 
Dim grade As Long 
Dim price As Long 


ncolum = Worksheets("Data").Cells(1, Columns.Count).End(xlToLeft).Column 
nRows = Worksheets("Data").Cells(rows.Count, "A").End(xlUp).Row 
    production = InputBox("Prduction cost per block($)") 
    refinery = InputBox("Refinery cost per block($)") 
    ' grade = InputBox("Grade Value (g/t)") 
    price = InputBox("Price of comodity ($/t)") 
    recovery = InputBox("Recovery (%)") 
    quantity = InputBox("Ore Qty (tonnes)") 
     'revenue = Grade * price * (recovery/100) * quantity 
     costs = production + refinery 
     'Worksheets("data").Cells(i, j) = costs - revenue 

For j = 1 To ncolum 
For i = 1 To nRows 

'input data 
    grade = Worksheets("grade").Cells(i, j).Value1 
    revenue = grade/(1000000) * price * (recovery/100) * quantity 
    price = revenue - cost 
    Worksheets("data").Cells(i, j) = price 
Next i 
Next j 
end sub 

回答

0

也許你會得到一個算術值下溢和截斷,這就是爲什麼它通常是最好的時候,你的算法採用師帶Double s到工作。這裏的問題在於您的計算機存儲分部結果的方法。

隨着Long變量:

Dim n1 As Long 
Dim n2 As Long 
Dim n3 As Long 

n1 = 5 
n2 = 2 
n3 = n1/n2 

MsgBox "The result of 5/2 = " & n3 
'This will output "The result of 5/2 = 2" instead of the expected 2.5 

這是由於我用n3的事實,這是一個Long爲中介存儲顯示錶達之前。如果我要排除n3和追加直接表達式的值:

MsgBox "The result of 5/2 = " & n1/n2 

結果實際上將被隱式轉換爲Double和正確顯示,但它幾乎沒有東西,我會依靠。

底線:使用時分工參與Double小號

編輯:我看到的是什麼問題:發生了什麼事是你沒有被明確的關於您的數據類型和它的未來反噬您。

InputBox實際上會返回一個字符串,並且由於生產,價格,恢復等等以前沒有Dim'd(並且您沒有使用Option Explicit),因此該變量被創建爲一種類型,該類型將保存上下文中接收到的任何內容在這種情況下,Strings。在下面的屏幕中,我爲生產和煉油廠輸入了500。

Debugging screenshot

請你幫個忙,並在Option ExplicitDebugging

+0

改變了所有的變量翻番的,並且仍然返回0,而不是負值 –

+0

具體而言,什麼值顯示爲負值?將「Option Explicit」放在模塊頂部,重新編譯(Debug - > Compile VBA Project),然後再次檢查它可能會有幫助。 – drognisep

+0

感謝您的幫助我已經更加謹慎地重新撰寫,現在正在開展工作 –

0

也許試試將價格改爲Double而不是Long?

Dim price as Double 
+0

讀了改變所有變量翻番的,並且仍然返回0,而不是負值的 –