VBA使用多个条件和带有标识符的标签项将数据与其自身进行比较

如何解决VBA使用多个条件和带有标识符的标签项将数据与其自身进行比较

enter image description here

有人可以建议VBA解决方案提供帮助吗?我正在尝试将数据行(多个条件)与同一数据集中的其他行进行比较,然后用一个标识符进行标记,以供以后使用。这是一个较大的VBA代码项目的一部分,我正在寻找一种方法来尽可能高效地比较数据,因为数据可能超过1万行。到目前为止,我尝试使用if / then数组进行的所有操作均无法产生预期的结果,并将行与自身进行比较,这是不必要的。我不精通VBA,因此可能忽略了一个简单的解决方案。

示例代码尝试和附加数据。任何帮助将不胜感激。

Arr1 = WS.ListObjects("mockdata").DataBodyRange.Value
For i = 1 To UBound(Arr1)
    If Arr1(i,1) = "AC" Then
        For j = 1 To UBound(Arr1)
            'concat doctype/reference/amount for comparison
            If Arr1(i,1) & Arr1(i,4) & Arr1(i,3) = Arr1(j,1) & Arr1(j,4) & Arr1(j,3) * -1 Then
                Arr1(i,7) = "ZD"
            ElseIf Arr1(i,3) <> Arr1(j,7) = "CFWD"
            End If
            Exit For
        Next j
    ElseIf Arr1(i,1) = "XJ" Then
        For j = 1 To UBound(Arr1)
            If Arr1(j,1) = "PY" Then
                For k = 1 To UBound(Arr1)
                    'concat reference/co for comparison
                    If Arr1(i,5) = Arr1(k,4) & Arr1(k,5) And Arr1(i,3) + Arr1(k,3) = "0" Then
                        Arr1(i,7) = "ZD"
                    ElseIf Arr1(i,3) <> "0" Then
                        Arr1(i,7) = "Variance"
                    'if ref match but co does not
                    ElseIf Arr1(i,4) = Arr1(k,4) And Arr1(i,3) = "0" And Arr1(1,5) <> Arr1(k,5) Then
                        Arr1(i,7) = "Cross Co"
                    ElseIf Arr1(i,3) <> "0" And Arr1(1,7) = "Cross Co/Variance"
                    End If
                Next k
            End If
        Next j
    ElseIf Arr1(i,1) = "PY" Then
        For j = 1 To UBound(Arr1)
            If Arr1(j,1) = "XJ" Then
                For k = 1 To UBound(Arr1)
                    'concat reference/co for comparison
                    If Arr1(i,7) = "Cross Co/Variance"
                    End If
                Next k
            End If
        Next j
    End If
Next i
Range("A2").Resize(UBound(Arr1,1),7).Value = Arr1

解决方法

原始答案将在下面保留,但这是此数据集的有效版本。但是,您的原始代码中缺少一些内容:没有像您期望的结果所示那样以XJ类型生成“ CFWD”的检查,因此您仍然需要解决这个问题。另外,在您的交流中,您没有可以返回ZD结果的选择

Sub RUNME()

arr1 = Sheet1.ListObjects("mockdata").DataBodyRange.Value
For i = 1 To UBound(arr1)
If arr1(i,1) = "AC" Then
    For j = 1 To UBound(arr1)
        'concat doctype/reference/amount for comparison
        If arr1(i,1) & arr1(i,4) & arr1(i,3) = arr1(j,1) & arr1(j,4) & arr1(j,3) * -1 Then
            arr1(i,7) = "ZD"
        
        ElseIf arr1(i,3) <> arr1(j,7) = "CFWD"
        End If
        Exit For
    Next j
ElseIf arr1(i,1) = "XJ" Then
    For j = 1 To UBound(arr1)
        If arr1(j,1) = "PY" Then
            If j = i Then
                'skip this line we don't need to compare to itself
            Else
                If arr1(i,5) = arr1(j,5) Then
                    If arr1(i,3) + arr1(j,3) <> "0" Then
                        arr1(i,7) = "Variance"
                    ElseIf arr1(i,3) = "0" Then
                        arr1(i,7) = "ZD"
                    End If
                ElseIf arr1(i,4) = arr1(j,4) Then
                    If arr1(i,5) <> arr1(j,5) Then
                        If arr1(i,3) <> 0 Then
                            arr1(i,7) = "Cross Co"
                        ElseIf arr1(i,3) = 0 Then
                            arr1(i,7) = "Cross Co/Variance"
                        End If
                    End If
                End If
            End If
        End If
    Next j
ElseIf arr1(i,1) = "PY" Then
    For j = 1 To UBound(arr1)
        If arr1(j,1) = "XJ" Then
            If j = i Then
                'skip this line we don't need to compare to itself
            Else
                If arr1(i,7) = "Cross Co/Variance"
                        End If
                    End If
                End If
            End If
        End If
    Next j
End If
Next i
Range("A2").Resize(UBound(arr1,1),7).Value = arr1
End Sub

下面的原始答案

您的逻辑存在缺陷。

任何时候,您都要进行一组比较(如果在此处声明),并且还要检查双重真实条件,则需要先检查双重真实条件,否则您的单一真实将结束比较然后您将获得所得到的结果。

如果我们有2列,则简化:

x-正确 y-是

如果我们执行以下操作:

if x = True then
    b = Yes
elseif x = true and y = true
    b = YesYes
end if

代码将在第一次检查后退出,并且从不评估elseif

您需要相应地对If语句重新排序。我正在尝试为您找到可行的修复程序,但我并没有真正遵循您的逻辑检查-如果您可以澄清这一点,我可以再次查看。

我也不确定您是否需要进行3次深循环。

我确实做到了以下几点:

    ElseIf Arr1(i,1) = "XJ" Then
    For j = 1 To UBound(Arr1)
        If Arr1(j,1) = "PY" Then
            For k = 1 To UBound(Arr1)
                'concat reference/co for comparison
                
                If Arr1(i,4) = Arr1(k,4) Then
                    If Arr1(i,3) + Arr1(k,3) = "0" And Arr1(1,5) <> Arr1(k,5) Then
                        Arr1(i,7) = "Cross Co"
                    ElseIf Arr1(i,3) <> "0" And Arr1(1,7) = "Cross Co/Variance"
                    End If
                ElseIf Arr1(i,4) & Arr1(i,5) = Arr1(k,4) & Arr1(k,5) Then
                    If Arr1(i,3) <> "0" Then
                        Arr1(i,7) = "Variance"
                    ElseIf Arr1(i,3) = "0" Then
                        Arr1(i,7) = "ZD"
                    End If
                End If
            Next k
        End If
    Next j

与其进行5次比较,失败并进行另外5次比较,不如将其分解成一个,然后再进行另一个较小的集合。这可能有助于加快整个过程

编辑:多看一点我看不到在示例数据集中满足您当前“方差”条件的情况。

ElseIf Arr1(i,5) And Arr1(i,3) <> "0" Then
                   Arr1(i,7) = "Variance"

您希望获得差异的行是第15和9行

Arr1(9,4)和Arr1(9,5)将给出“ 781498071220055”

Arr1(15,4)和Arr1(15,5)将给出“ 781498071220008”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res