对行进行分组并检查条件

时间:2017-10-26 12:18:21

标签: vba excel-vba excel

我正在使用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)定义为变量,然后对这些变量进行检查?但是,我永远不知道我要做多少次。

我真的对如何设计这背后的逻辑结构感到茫然。我不知道这是否过于开放。

2 个答案:

答案 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”)

1. P1201-F盐
2. P1201-F醋
3. P1202-F盐
4. P1202-F醋
5. P1203-F盐
6. P1203-F小苏打

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)