我正在使用Excel VBA进行以下项目
我最近开始学习VBA以提高工作效率,并且在Userforms方面做得非常好。逻辑是有道理的,即使我不知道我需要的语法的一半,谷歌(特别是这个网站)让我看起来像是一个专家。
我现在正在尝试处理一个不使用Userforms的项目,我甚至不知道从哪里开始使用逻辑。
目标:自动检查记录与模板的偏差。我有一个用于创建ProductX的材料列表,以及我们创建ProductX的大量数据。目标是根据记录检查材料清单以检查偏差。
数据中的每条记录都以一个字符串开头,该字符串表示与该记录关联的运行。
**Example of Transaction Data:**
P1201-F Salt
P1201-F Vinegar
P1202-F Salt
P1202-F Vinegar
P1203-F Salt
P1203-F Baking Soda
模板说(盐,醋)
我正在尝试运行一个程序,检查P1201,然后P1202,然后P1203,如果材料不是盐和醋(如P1203),它会将它放在一个单独的表中,以便我可以跟踪所有偏差。
我在想这一点,我需要将每个组(P1201,P1202,P1203)定义为变量,然后对这些变量进行检查?但是,我永远不知道我要做多少次。
我真的对如何设计这背后的逻辑结构感到茫然。我不知道这是否过于开放。
答案 0 :(得分:1)
要明确的是,P1201-F不是您正在验证的,只是P1201(例如左(P1201-F,5))?
您需要先了解一些事项:循环(动态最后一行),if语句(比较)和source.copy目标(移动/复制数据时)。
快速查看循环:For循环或For Each循环...在这种情况下我建议使用For循环,因为您将在单个工作表中遍历单元格,直到最后一行(找到动态地)。
Dim i As Long, LR as Long
LR = Cells( Rows.Count, 1).End(xlUp).Row 'if you google "VBA Last Row" you can see Rob de Bruin showing you this
For i = 2 to LR 'assumes headers in row 1
'Do something
Next i
你的if语句是你在这里做的......非常通用:
If X = Y Then 'condition
'somethign if condition true
Else
'something if condition false
End If
if语句可以有多个条件,与AND链接(满足所有条件)或OR(必须满足至少一个条件),例如:
If X = Y AND Z = A Then
答案 1 :(得分:1)
阵列将是你最好的选择。创建一个数组 - 可能是2列数组的事务数组,并从模板表中创建另一个2列数组。
假设名为Transaction_Data_Sheet的工作表中的以下数据在范围内(“A1:B6”)
dim thirdSheetRow as long, I as long, j as long
dim splitArrStrings1
dim splitArrStrings2
dim myArr1()
dim myArr2()
myArr1 = Sheets("Transaction_Data_Sheet").Range("A2:B6") ' Items to check
myArr2 = Sheets("Template_Data_Sheet").Range("A2:B600") ' Past items to check against
thirdSheetRow = 1
for I = 1 to ubound(myArr1)
splitArrStrings1 = split(myArr1(I, 0),"-")
For j = 1 to Ubound(myArr2)
splitArrStrings2 = split(myArr2(J, 0),"-")
If splitArrStrings1 = splitArrStrings2 AND uCase(myArr1(I, 1)) <> uCase(myArr2(j, 1)) Then
Sheets("thirdSheet").Range("A" & thirdSheetRow).Value = "Row: " & I
Sheets("thirdSheet").Range("B" & thirdSheetRow).Value = myArr1(I, 0)
Sheets("thirdSheet").Range("B" & thirdSheetRow).Value = myArr1(I, 1)
thirdSheetRow = thirdSheetRow + 1
End If
Next j
Next I
“拆分”功能用于将“-F”与项目的第一部分分开,即P1201。我也用它作为模板表数据,但我不知道你的模板表是否有尾随的“-F”。如果没有,则从模板表中删除“split”函数,并使用变量splitArrStrings2作为整个值,如下所示:
splitArrStrings2 = myArr2(j, 0)