2017-05-10 44 views
1

我在excel vba中的代碼有點麻煩。我的目標是將以下if語句轉換爲VBA宏。Excel VBA如果ElseIF else

if語句:

'=IF(R8="W", 
'IF(L8>0,L8, 
'IF(ABS(L8)<ABS(V7),L8, 
'IF(N8+L8<0,L8+Z7,-V7))), 

'IF(R8="A", 
'IF(L8>0,(V7/(V7+Z7)*L8), 
'IF(ABS(V7/(V7+Z7)*L8)>V7,-V7,(V7/(V7+Z7)*L8))), 

'Added H not tested it yet 
'IF(AND(R9="H",-L9>Z8),Z8+L9,0) 

'IF(R8="C", 
'IF(L8>0,L8/2, 
'IF(AND((-L8/2)<V7,(-L8/2<Z7)),L8/2, 
'IF(AND(V7<=0,Z7<=0),L8/2, 
'IF(Z7+L8>0,-V7,-V7+(L8+Z7+V7)/2)))),0))) 

我想要做的是,如果在R列一個W,我想它來檢查,如果在L欄量之大,零,如果這是真的,返回列L中的金額。如果爲false,則檢查列L中金額的絕對值是否小於列V中金額的絕對值。如果爲true,則返回列L中的金額,否則對列N中的金額進行求和和列L.如果總和小於零,則返回列L和Z中金額的總和。如果它爲假,則返回列v中的金額(使其爲負)。

我試圖解決它。

Private Sub looping() 
    Dim rw_cnt As Integer 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    rw_cnt = 8 
    Do While Sheets("Personal").Range("R" & rw_cnt).Value <> "" 

    If Sheets("Personal").Range("R" & rw_cnt).Value = "W" Then 

     'I am having difficulties on this section. 
     Sheets("Personal").Range("V" & rw_cnt).Select 
     If "=RC[-8]" > 0 Then 
     ActiveCell.FormulaR1C1 = "=RC[-8]" 
     ElseIf Abs("=RC[-8]") < Abs("=R[-1]C[2") Then 
     ActiveCell.FormulaR1C1 = "=RC[-8]" 
     ElseIf ("=RC[-6]" + "=RC[-8]") < 0 Then 
     ActiveCell.FormulaR1C1 = "=RC[-8]" + "=R[-1]C[6" 
     Else 
     ActiveCell.FormulaR1C1 = "=-R[-1]C[7" 
     End If 

     Sheets("Personal").Range("Z" & rw_cnt).Select 
     ActiveCell.FormulaR1C1 = "=0" 
    End If 

    rw_cnt = rw_cnt + 1 
    Loop 
    MsgBox ("Done!!!") 

    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
    End Sub 

在此先感謝!

https://i.stack.imgur.com/4KiVg.png

+1

你試圖插入公式插入到細胞,或你想放置的實際值進入細胞? – YowE3K

+0

而且我假設您試圖替換的Excel公式在您顯示的位(或至少是'')')之後有一個',FALSE)'是否正確?或者你是否試圖編寫一個宏,以便在列R中不包含「W」的情況下保留列T中的當前值不變? – YowE3K

+0

你試圖將結果放入哪一列? (你現在的代碼並不符合問題中的公式 - 例如,你正在尋找代碼中列T是否包含「W」,但問題是關於包含「W」的列R,而你的代碼正在更新列V或列Z,但你的問題說列V是公式中的輸入之一等等) – YowE3K

回答

0

如果我明白你正確地做什麼,這是把你的...Range("V" & rw_cnt)細胞,看看它是否比0比小區的絕對值越大,少留一個山坳。並向下2行,或者如果兩個偏移單元格小於0 ...

這是如何工作的?

'I am having difficulties on this section. 
Dim myCel As Range 
Set myCel = Sheets("Personal").Range("V" & rw_cnt) 
With myCel 
    If .Offset(0, -8).Value > 0 Then 
     .FormulaR1C1 = "=RC[-8]" 
    ElseIf Abs(.Offset(0, -8).Value) < Abs(.Offset(-1, 2).Value) Then 
     .FormulaR1C1 = "=RC[-8]" 
    ElseIf (.Offset(0, -6).Value + .Offset(0, -8).Value) < 0 Then 
     .FormulaR1C1 = "=RC[-8]+R[-1]C[6]" 
    Else 
     .FormulaR1C1 = "=-R[-1]C[7]" 
    End If 
End with 

基本上,如果你有一個公式,VBA只是將它解釋爲一個字符串。將R1C1參考替換爲偏移量,然後它應該適合您。如果上述內容沒有做任何事情,或者是不正確的,請告訴我......但看看您是否能夠理解我在嘗試的內容,因爲我認爲這是您主要問題的癥結所在。

編輯:而不是ActiveCell,使用myCell

EDIT2: 編輯:這是一個「嚴格的」版本的代碼:

Private Sub looping() 
Dim rw_cnt As Long, lastRow As Long 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

With Sheets("Personal") 
    lastRow = .Cells(.Rows.Count, 22).End(xlUp).Row 
    For rw_cnt = 8 To lastRow 
     If .Range("R" & rw_cnt).Value = "W" And .Range("R" & rw_cnt).Value <> "" Then 
      'I am having difficulties on this section. 
      Dim myCel As Range 
      Set myCel = Sheets("Personal").Range("V" & rw_cnt) 
      With myCel 
       .Select 
       If .Offset(0, -8).Value > 0 Then 
        .FormulaR1C1 = "=RC[-8]" 
       ElseIf Abs(.Offset(0, -8).Value) < Abs(.Offset(-1, 2).Value) Then 
        .FormulaR1C1 = "=RC[-8]" 
       ElseIf (.Offset(0, -6).Value + .Offset(0, -8).Value) < 0 Then 
        .FormulaR1C1 = "=RC[-8]+R[-1]C[6]" 
       Else 
        .FormulaR1C1 = "=-R[-1]C[7]" 
       End If 
      End With 
      .Range("Z" & rw_cnt).FormulaR1C1 = "=0" 
     End If 
    Next rw_cnt 
End With      'Sheets("Personal") 

MsgBox ("Done!!!") 

Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 
End Sub 
+1

'ActiveCell'?!?!你應該爲自己感到羞恥 ! ;)('myCel'也許?) – YowE3K

+0

@ YowE3K - 我知道,我知道!啊,我非常專注於做'mycel'引用,我沒有把它放在一起,'Selection'*是'ActiveCell'。 :O – BruceWayne

+1

一個不錯的'With myCel'塊也不會誤入歧途;)(我現在閉嘴。:D) – YowE3K