检查两个数组中的值是否相等。他们是,但VBA认为他们不是(更新:底部的决议)

时间:2017-08-23 21:31:20

标签: excel vba excel-vba

我遇到了一个奇怪的问题: 我有两个独立的数组,我正在尝试匹配3个属性,以确定所有三个属性是匹配,部分匹配还是没有匹配。

我有一个循环遍历第一个数组中的值,循环中的第二个嵌套循环循环遍历第一个数组的每一行的第二个数组。

这里变得奇怪:我有三个If语句门检查每个数组中的第一个属性(金额)是否相等,然后是第二个属性(跟踪),最后是最后一个属性(客户)。 我在一个数组中有一个匹配金额的行项目(应该如此),但是在跟踪检查上失败了(它不应该在那里)。

我使用Debug.Print来查看值是否相同。他们是。我检查了原始数据的格式是否相同(即没有空格/隐藏字符等)。我确保当从单元格填充数组时,它使用.Value方法。

即使我已经检查了所有这些,并且Debug.Print显示它们是相同的,但在比较这两个值时它未通过检查。

以下是代码:

For RemMatchLoop = LBound(RemAmtMatchArray, 2) To UBound(RemAmtMatchArray, 2) Step 1
    PerfectMatchFound = False
    For MMMatchLoop = LBound(MMAmtMatchArray, 2) To UBound(MMAmtMatchArray, 2) Step 1
        If MMAmtMatchArray(MMAmountCol, MMMatchLoop) = RemAmtMatchArray(RemAmountCol, RemMatchLoop) Then
            Debug.Print "MM Trace: " & MMAmtMatchArray(MMTraceCol, MMMatchLoop)
            Debug.Print "Rem Trace: " & RemAmtMatchArray(RemTraceCol, RemMatchLoop)
            If MMAmtMatchArray(MMTraceCol, MMMatchLoop) = RemAmtMatchArray(RemTraceCol, RemMatchLoop) Then
                If MMAmtMatchArray(MMCustomerCol, MMMatchLoop) = RemAmtMatchArray(RemCustomerCol, RemMatchLoop) Then
                    ReDim Preserve RemPerfectMatchArray(1 To RemLastCol, 1 To RemPerfectMatchCount) As Variant
                    For RemPerfectMatchColFill = 1 To RemInBalanceCol Step 1
                        RemPerfectMatchArray(RemPerfectMatchColFill, RemPerfectMatchCount) = RemAmtMatchArray(RemPerfectMatchColFill, RemMatchLoop)
                        If RemPerfectMatchColFill = RemAmountCol Then
                            Debug.Print "Perfect Match Amount: " & RemPerfectMatchArray(RemPerfectMatchColFill, RemPerfectMatchCount)
                        End If
                    Next RemPerfectMatchColFill
                    RemPerfectMatchCount = RemPerfectMatchCount + 1
                    PerfectMatchFound = True
                End If
            End If
        End If
    Next MMMatchLoop

以下是Debug.Print针对相关订单项吐出的内容:

MM Trace: 1234
Rem Trace: 1234

因此,两条迹线都是相同的,但是当它通过线时:

If MMAmtMatchArray(MMTraceCol, MMMatchLoop) = RemAmtMatchArray(RemTraceCol, RemMatchLoop) Then

它将它们视为不相等。

更新:一种是Double,另一种是String。不知道为什么,因为导致String值的数组的数据不是Text格式而是数字。

此外,当数据填充到数组中时,它使用.Value方法,如下所示:

For RemAmtMatchColFill = 1 To RemLastCol Step 1
            RemAmtMatchArray(RemAmtMatchColFill, RemAmtMatchCount) = RemWS.Cells(RemAmtMatchLoop, RemAmtMatchColFill).Value
        Next RemAmtMatchColFill

不知道为什么它会检测到一个字符串...

任何帮助都会受到赞赏,因为我完全感到困惑。

解决 在使用注释中建议的Typename()来识别要比较的类型之后,确定Variant数组将两个源数据中的Currency数据类型转换为一个数组中的Double类型和另一个数组中的String类型。虽然奇怪的是它正在这样做,通过使用CStr()将两个值转换为字符串,同时比较修复问题。

谢谢! 乔

0 个答案:

没有答案