我正在尝试创建自动填充我创建的工资单电子表格。但是,无论我多少尝试一次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。这就是它不会分配值的原因。但是,我不明白为什么它继续分配给。
所以第一张图片是数据编码的地方(图片中没有显示,因为它位于电子表格的最左边,但基本上它输入了人物的姓名,日期和日常时间记录(DTR)人)。当数据被编码时,它将根据帮助列AG月份和年份列AH自动指示它所基于的月份和年份。在B列的同一工作表的开头某处是人的姓名。所有这三个都将被使用。
第二张图像是计算摘要的位置。如果特定人员在特定月份和年份有一个条目,并且该条目不在此工作表中,则它将自动填写该人员的姓名以及月份和年份。基本上这就是我正在尝试创建的代码。
输出是一个完全自动化的电子表格,只需要在DTR表中输入数据。所有计算都已经有了相应的公式。
答案 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)。
变量永远不会被设置为。可能是设置了,你不明白原因。
逐步调试您的代码,观察它的行为与您期望的不同,并找出它为什么会这样做的原因。