【问题标题】:InStr in Array not populating value if found如果找到,数组中的 InStr 不填充值
【发布时间】:2019-01-26 03:22:03
【问题描述】:

我编写了下面的代码来在工作表“CX”列 D 中的工作表“Fusion”列 H 中搜索一个值(供应商名称)。我也在做相反的检查,所以如果相同的值工作表 CX 中的(供应商名称)在工作表“Fusion”中。我不是在寻找精确匹配,因此使用 Instr 并以两种方式进行比较,因为我不确定用户如何在任一工作表中输入信息。

任一单元格中的数据类型应为文本。 如果找到匹配项,则在工作表“CX”的最后一列中,它应该只填充“找到供应商”或“未找到供应商”

目前它没有用任何数据填充最后一列,但宏在任何时候都没有出错。

我尝试添加 msgboxes 并且“Here”和“Here3”被触发,但它似乎没有触及“Here2”的代码部分,所以我认为它是导致问题的原因,但不确定如何解决。

我的数据截图是:CX Sheet 融合表

任何帮助将不胜感激。

Option Explicit


Sub CompareCXFusion()

Dim CX As Worksheet
Dim Fusion As Worksheet

Dim strTemp as string
Dim strCheck as string

Dim i As Long, J As Long

Dim CXArr As Variant
Dim FusionArr As Variant

Dim match As Boolean

Dim CXRng As Range
Dim FusionRng As Range

Set CX = ActiveWorkbook.Sheets("CX")
Set Fusion = ActiveWorkbook.Sheets("Fusion")

Set CXRng = CX.Range("A2", CX.Cells(Rows.Count, "A").End(xlUp).Offset(0, 6))
Set FusionRng = Fusion.Range("A2", Fusion.Cells(Rows.Count, "A").End(xlUp).Offset(0, 9))

CXArr = CXRng.Value2
FusionArr = FusionRng.Value2

strTemp = lcase(trim(FusionArr(J, 7)))  
strCheck = lcase(trim(CXArr(i, 3))) 


For i = 1 To UBound(CXArr)
    Match = False
        For J = 1 To UBound(FusionArr)
        MsgBox "Here"
            If (Instr(strTemp, strCheck) > 0) OR (InStr(strCheck, strTemp) > 0) Then
                MsgBox"Here2"
                CXArr(i, 6) = "Supplier Found"
            Else
            Msgbox"Here3"
                CXArr(i, 6) = "Supplier not found"

        End If
    Next J
Next i
End Sub

我期望的预期输出是:如果在 Fusion 的 H 列中,供应商名称是“供应商 A”,并且工作表“CX”的 D 列中的值是“供应商 A LTD”,那么我希望它用“Supplier Found”填充工作表 CX 中的 G 列,因为它是在字符串中找到的。

如果您需要更多信息,请告诉我。

我不知道如何正确插入我的数据示例,否则我会有

【问题讨论】:

  • 你正在填充一个数组——一旦它被填充,你想用这个数组做什么?在这段代码中,您没有向列写入任何内容。另外,match 的目的是什么? cell?
  • 填充数组后,我想在 FusionArr 的第 7 个元素中搜索 CXarr 中的第 3 个元素,反之亦然。我以为我在最后填充了 CXarr 中的第 6 个元素? CxArr(i,6) = "找到供应商" ?没有什么。我试图修改我编写的其他一些代码,但没有意识到我实际上根本没有使用这两个 Dim,所以我将删除那些
  • 你的意思是数组的列?
  • @MattWilliams “目前它没有用任何数据填充最后一列,但宏在任何时候都没有出错。” - 我想知道你的意思是什么.老实说,我认为这里不需要数组 - 为什么不只使用范围?
  • @dwirony 所以我想根据是否在数组中找到值,用“找到供应商”或“未找到供应商”填充工作表“CX”上的 G 列。我运行上面的代码,它运行没有错误,但在 G 表 CX 列中没有填充任何内容

标签: excel vba


【解决方案1】:
Option Explicit
Sub CompareCXFusion()
    Dim CX As Worksheet
    Dim Fusion As Worksheet
    Dim i As Long, J As Long, lastRowCX As Long, lastRowFU As Long
    Dim CXText As String, FusionText As String
    Dim match As Boolean
    Dim CXRng As Range, FusionRng As Range

    Set CX = ActiveWorkbook.Sheets("CX")
    Set Fusion = ActiveWorkbook.Sheets("Fusion")

    lastRowCX = CX.Range("D1").SpecialCells(xlCellTypeLastCell).Row - 1
    lastRowFU = Fusion.Range("H1").SpecialCells(xlCellTypeLastCell).Row - 1

    Set CXRng = CX.Range("D1:D" & lastRowCX)
    Set FusionRng = Fusion.Range("H1:H" & lastRowFU)

    For i = 1 To lastRowCX
        match = False
            For J = 1 To lastRowFU
            'Debug.Print "Here"
                FusionText = FusionRng.Range("A1").Offset(J, 0).Value
                CXText = CXRng.Range("A1").Offset(i, 0).Value
                If FusionText <> "" And CXText <> "" Then
                If InStr(FusionText, CXText) Or InStr(CXText, FusionText) Then
                    'Debug.Print "Here2"
                    match = True
                End If
                End If
            Next J


        'Result goes to column G of CX range:
        If match Then
            CXRng.Range("A1").Offset(i, 3).Value = "Supplier found" ' "Supplier found - " & i & " - " & CXRng.Range("A1").Offset(i, 0).Address & " - " & CXRng.Range("A1").Offset(i, 3).Address
        Else
            CXRng.Range("A1").Offset(i, 3).Value = "Supplier NOT found" '"Supplier NOT found - " & i & " - " & CXRng.Range("A1").Offset(i, 0).Address & " - " & CXRng.Range("A1").Offset(i, 3).Address
        End If

    Next i
End Sub

【讨论】:

  • 感谢您,它按预期工作。希望我能够使用它来比较工作表中的另外 2 列以获得完全匹配。
【解决方案2】:

您需要确保检查是否区分大小写:

    Dim strTemp as string
    Dim strCheck as string 


    'Inside for I loop
        'Inside for j Loop
    strTemp = lcase(trim(FusionArr(J, 7)))  
    strCheck = lcase(trim(CXArr(i, 3)))  

    If (Instr(strTemp, strCheck) > 0) OR (InStr(strCheck, strTemp) > 0) Then 
        '...  

    End If
        'end for j
    'end for i

【讨论】:

  • 为什么不用我们vbTextCompare 来代替?
  • @dwirony lcase 更快,因为大多数字母都是小写的。其中文本比较检查每个字符。 “请记住,StrComp(,,vbTextCompare) [或对于我们的情况是 Instr()] 不仅仅是一个不区分大小写的比较。它实际上是为排序而构建的,而不是为相等性进行比较。在许多情况下,这种依赖于语言环境的文本比较是一种过度杀伤力,甚至会导致细微的错误。” - link
  • @IAmNerd2000 插入上述代码以替换 If 语句的行时,下标超出范围。我添加了 Dim 和 strTemp+strCheck。我应该删除什么,然后我应该在哪里插入您的代码?
  • 您能否更新您的代码问题以显示您的结果和代码?
  • @IAmNerd2000 我已经将我的代码编辑为我现在拥有的代码,并将您的代码插入我认为应该去的地方。我收到的错误消息是“下标超出范围”
猜你喜欢
  • 2020-12-02
  • 2019-05-02
  • 1970-01-01
  • 2019-11-24
  • 1970-01-01
  • 2019-01-31
  • 2023-01-13
  • 2019-07-05
  • 2015-07-13
相关资源
最近更新 更多