为什么VBA excel一直在条件语句中运行语句,即使它是假的?

时间:2017-09-14 05:39:09

标签: excel vba excel-vba

我正在尝试创建自动填充我创建的工资单电子表格。但是,无论我多少尝试一次z = 1的值,即使逻辑返回FALSE值(我使用MsgBox验证了这一点)。

我在此代码中的目标是检查另一张表中是否已有记录。如果没有,它将根据可用数据自动添加包含相应详细信息的记录。

下面是完整的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

更新:我意识到即使在If-Then循环的第一部分中没有满足条件,z的值也无缘无故地设置为1。这就是它不会分配值的原因。但是,我不明白为什么它继续分配给。

更新#2:@ShaiRado DTR Table

所以第一张图片是数据编码的地方(图片中没有显示,因为它位于电子表格的最左边,但基本上它输入了人物的姓名,日期和日常时间记录(DTR)人)。当数据被编码时,它将根据帮助列AG月份和年份列AH自动指示它所基于的月份和年份。在B列的同一工作表的开头某处是人的姓名。所有这三个都将被使用。

Payroll - Regular Table

第二张图像是计算摘要的位置。如果特定人员在特定月份和年份有一个条目,并且该条目不在此工作表中,则它将自动填写该人员的姓名以及月份和年份。基本上这就是我正在尝试创建的代码。

输出是一个完全自动化的电子表格,只需要在DTR表中输入数据。所有计算都已经有了相应的公式。

1 个答案:

答案 0 :(得分: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相同) - 也是空的(比较两个emtpy行集z到1)。

  

变量永远不会被设置为可能是设置了,你不明白原因。

逐步调试您的代码,观察它的行为与您期望的不同,并找出它为什么会这样做的原因。