2017-09-14 31 views
0

我想創建一個自動填充我創建的工資表電子表格。然而,即使邏輯返回FALSE值(我使用MsgBox進行了驗證),無論我嘗試多少次z = 1的值。VBA excel如何在條件語句中繼續運行語句,即使它是假的?

此代碼中的目標是檢查另一張表中是否已有記錄。如果沒有,它會根據可用數據自動添加具有適當詳細信息的記錄。

以下是完整的VBA代碼(注意代碼是不完全,所以這是一個有點糙米仍然):

Option Explicit 

Public p As Long 

Sub test() 

    Dim Total_rows_PR As Long 
    Dim Total_rows_DTR As Long 

    Total_rows_PR = Worksheets("Payroll - Regular").Range("B" & Rows.Count).End(xlUp).Row 
    Total_rows_DTR = Worksheets("DTR").Range("B" & Rows.Count).End(xlUp).Row 

    Dim q As Long 
    Dim j As Long 
    Dim z As Long 

    For j = 1 To Total_rows_DTR - 1 
     For q = 1 To Total_rows_PR + p - 2 
      If Worksheets("DTR").Cells(1 + j, 33) = Worksheets("Payroll - Regular").Cells(2 + q, 1) Then 
       If Worksheets("DTR").Cells(1 + j, 34) = Worksheets("Payroll - Regular").Cells(2 + q, 2) Then 
        If Worksheets("DTR").Cells(1 + j, 2) = Worksheets("Payroll - Regular").Cells(2 + q, 3) Then 
         z = 1 
         Exit For 
        End If 
       End If 
      End If 
     Next q 

' Below is where the assignment should happen but only returns a blank cell 

     If z = 0 Then Worksheets("Payroll - Regular").Cells(Total_rows_PR + 1 + p, 1) = Worksheets("DTR").Cells(1 + j, 33) 
     If z = 0 Then Worksheets("Payroll - Regular").Cells(Total_rows_PR + 1 + p, 2) = Worksheets("DTR").Cells(1 + j, 34) 
     If z = 0 Then Worksheets("Payroll - Regular").Cells(Total_rows_PR + 1 + p, 3) = Worksheets("DTR").Cells(1 + j, 2) 
     If z = 0 Then p = p + 1 
     z = 0 
    Next j 

End Sub 

更新:我意識到,即使條件不被一中的第一部分滿足如果 - 然後循環,z的值無緣無故地設置爲1。這就是它不會賦值的原因。不過,我不明白爲什麼它一直分配給1

更新#2:@ShaiRado DTR Table

所以第一個圖像是進行數據編碼(圖像中沒有顯示,因爲它是在最左邊的部分的電子表格,但基本上它輸入了該人的姓名,日期和該人的每日時間記錄(DTR))。當數據被編碼時,它將自動指示它基於年份的助手列AG月份和列AH的月份和年份。在列B的同一張工作表的開頭的某處是該人的姓名。所有這3個將被使用。

Payroll - Regular Table

該第二圖像是其中摘要計算。如果在特定的月份和年份有特定人員的條目,並且該條目不在該工作表中,則會自動填寫該人員的姓名以及月份和年份。基本上這就是我試圖創建的代碼。

輸出是一個完全自動化的電子表格,只需要在DTR表格中輸入數據。所有的計算都已經有了相應的公式。

+0

在哪一行不分配值?你能告訴我們更多嗎? –

+0

對不起,我試圖正確格式化。我已經編輯它 –

+0

你有一些語法缺失:'如果工作表(「DTR」)。單元格(1 + j,33)=工作表(「工資單 - 常規」)。單元格(2 + q,1)_ 然後如果工作表(「DTR」)。Cells(1 + j,34)= Worksheets(「Payroll - Regular」)。Cells(2 + q,2)_ Then If Worksheets(「DTR」)。Cells(1 + j ,2)=工作表(「工資 - 常規」)。單元格(2 + q,3)_ 然後z = 1',你需要用'End If'來關閉每個'If'' –

回答

0

首先:你有一個非常奇怪的方式來編寫你的if語句。 我想你的意思是

For q = 1 To Total_rows_PR + p 
    If Worksheets("DTR").Cells(1 + j, 33) = Worksheets("Payroll - Regular").Cells(2 + q, 1) _ 
     And Worksheets("DTR").Cells(1 + j, 34) = Worksheets("Payroll - Regular").Cells(2 + q, 2) _ 
     And Worksheets("DTR").Cells(1 + j, 2) = Worksheets("Payroll - Regular").Cells(2 + q, 3) Then 
     z = 1 
     Exit For ' Once found, z stays 1 so you don't have to continue the inner loop. 
    End If 
Next q 

二:我不知道到底要達到什麼樣的,但據我瞭解,你的問題是,你是循環遠。在外循環的最後一次迭代中,表DTR的訪問行1 + j當時爲空,並且您正在訪問行2 + q(與2 + Total_rows_PR + p相同) - 也爲空(並比較兩個空行集z到1)。

A variable is never set for no reason. Is is maybe set and you don't understand the reason.

一步一步地調試你的代碼,觀察它的行爲與你期望的不同,並找出它做什麼的原因。

+0

我寫了很多Ifs,因爲當我試圖把「和」連接起來的時候出錯。也許它的排列方式與其他語言不同,這對VBA來說非常獨特。剛剛用「End If」語句實現了它 –

+0

@ YowE3K:是的,你說得對。有一次,我沒有在VBA編輯器中測試它,但在Notepad ++中進行了編輯 - 吸取了我的教訓。將更正我的答案 – FunThomas

+0

你是對的我在定義循環邊界時犯了一個錯誤。我將「ifs」更改爲「and」,並且出現錯誤:「運行時錯誤」13:類型不匹配「。這就是爲什麼我以製作許多If-Thens的奇怪方式纏繞它的原因。 –