【问题标题】:Compare Cell value with Array content将单元格值与数组内容进行比较
【发布时间】:2019-04-15 23:56:50
【问题描述】:

我的目标是检查一列是否每个单元格都包含(除了其他值之外)我数组中的一个字母。

细胞看起来像“123A”。
我的数组包含值 A、C、D、X、Y、Z。
两者都只是示例值。
请注意,如果单元格包含任何字母,我的 if 语句应该为真,因此对于示例,它应该为真。
对于单元格值“123B”,它应该为 false(数组中没有 B)。

我发现了一个“IsinArray”函数,它似乎正在工作,但会检查特定值。

我需要的是更接近 ---> "*" & IsinArray & "*"

我找到的函数是这样的:

Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
  IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0))
End Function

我的循环列的 For 语句也在工作(我会说 ^^)

如果您对如何做得更好有任何想法,我也愿意接受“创造性”解决方案。

【问题讨论】:

    标签: arrays excel vba if-statement


    【解决方案1】:

    试试,

    Public Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
        Dim s As String, i As Integer
        Dim a As Variant
        For i = 1 To Len(stringToBeFound)
            s = Mid(stringToBeFound, i, 1)
            For Each a In arr
                If s = a Then
                    IsInArray = True
                    Exit Function
                End If
            Next a
        Next i
    End Function
    

    【讨论】:

      【解决方案2】:

      你可以把它转过来

      Option Explicit
      
      Public Sub Test()
          Dim testArray(), cellValue As String, rng As Range
          Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")    '<== contains
          testArray = Array("A", "C", "D", "X", "Y", "Z")
          Debug.Print IsInArrayValue(testArray, rng)
      End Sub
      
      Public Function IsInArrayValue(ByVal testArray As Variant, ByVal rng As Range) As Variant
          Dim i As Long, testString As String
          testString = rng.Text
          If rng.Cells.Count > 1 Then
              IsInArrayValue = CVErr(xlErrNA)
              Exit Function
          End If
          For i = LBound(testArray) To UBound(testArray)
      
              If InStr(testString, testArray(i)) > 0 Then
                  IsInArrayValue = True
                  Exit Function
              End If
          Next
          IsInArrayValue = False
      End Function
      

      如果用作 UDF,您可以如上所示传递数组,或者如果数组没有改变,您可以移入函数本身。就个人而言,我更喜欢将数组作为参数传递给函数,因为它更灵活。我无法弄清楚你要复制的行来自哪里。您作为答案发布的评论使用了一个 j 变量,该变量似乎没有参与显示的循环,并且该行是从另一张表中复制的。所以下面不会直接工作,而是给你一个框架。

      Public Function IsInArrayValue(ByVal rng As Range) As Variant
          Dim i As Long, testString As String, testArray()
          testArray = Array("A", "C", "D", "X", "Y", "Z")
          testString = rng.Text
          If rng.Cells.Count > 1 Then
              IsInArrayValue CVErr(xlErrNA)
              Exit Function
          End If
          For i = LBound(testArray) To UBound(testArray)
      
              If InStr(testString, testArray(i)) > 0 Then
                  IsInArrayValue = True
                  Exit Function
              End If
          Next
          IsInArrayValue = False
      End Function
      

      呼叫:


      下面的评论看起来像是一个新问题,但您可能想要这样的问题:

      Dim loopRange As Range, rng As Range
      
      With ThisWorkbook.Worksheets("Filter")
          Set loopRange = .Range(.Cells(1, VarNutzerSpalte), .Cells(VarAnzahlZeilen, VarNutzerSpalte))
      End With
      
      For Each rng In loopRange
         If IsInArrayValue(ArrAuswahlNutzer, rng) Then
             rng.EntireRow.Copy  '<= use Union to gather range if all being pasted in a block somewhere
         End If
      Next
      

      联合版本可能如下所示:

      Dim loopRange As Range, rng As Range, unionRng As Range
      
      With ThisWorkbook.Worksheets("Filter")
          Set loopRange = .Range(.Cells(1, VarNutzerSpalte), .Cells(VarAnzahlZeilen, VarNutzerSpalte))
      End With
      
      For Each rng In loopRange
         If IsInArrayValue(ArrAuswahlNutzer, rng) Then
         If Not unionRng Is Nothing Then
             Set unionRng = Union(unionRng, rng)
         End If
             Set unionRng = rng  '<= use Union to gather range if all being pasted in a block somewhere
         End If
      Next
      
      If Not unionRng Is Nothing Then
      
          unionRng.EntireRow.Copy  'destination for paste
      
      End If
      

      【讨论】:

      • 您好,非常感谢,但我有一个小问题如果函数为真,那么我想复制整行。通常我会使用一个 for 循环并说 row(i).copy 但是很好,如何实现呢?这是我当前的代码`'范围应该没问题(需要它变量) Set rng = ThisWorkbook.Worksheets("Filter").Range(Cells(1, VarNutzerSpalte), Cells(VarAnzahlZeilen, VarNutzerSpalte)) 'For i = 1到 VarAnzahlZeilen If IsInArrayValue(ArrAuswahlNutzer, rng) Then 'Here I want to copy the Current Row End If 'Next i' 我猜这个版本行不通
      • 这真的是一个新问题。 rng 必须是单个单元格,因此您将循环 ThisWorkbook.Worksheets("Filter").Range(Cells(1, VarNutzerSpalte), Cells(VarAnzahlZeilen, VarNutzerSpalte)) 中的所有单元格。如果有帮助,请参阅上面的编辑。
      • 非常感谢,我尝试了一些不同的(而且丑陋的)但我想它可以工作:)
      • 您是否将所有行复制到同一个位置?在这种情况下,将所有行复制到一个联合范围对象并一次性粘贴是可能且有效的。
      【解决方案3】:

      很抱歉回答我自己的问题(当然欢迎对此解决方案进行更正/反馈)

      我这样尝试过,我想它应该可以工作(不能真正测试,因为我的 makro 的其他部分没有工作) 这有点不必要的复杂,也许很慢,但我说它可以工作:

      For i = 1 To VarAnzahlZeilen
          Set rng = Worksheets("Filter").Range(Cells(i, VarNutzerSpalte), Cells(i, VarNutzerSpalte))
      
          If IsInArrayValue(ArrAuswahlNutzer, rng) Then
              Worksheets("Import").Rows(j).Copy
              Worksheets("Filter").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
          End If
      
      Next i
      

      QHarr 使用此函数(仅更改了数组名称)

      Public Function IsInArrayValue(ByVal testArray As Variant, ByVal rng As Range) As Variant
          Dim i As Long, testString As String
          testString = rng.Text
          If rng.Cells.Count > 1 Then
              IsInArrayValue = CVErr(xlErrNA)
              Exit Function
          End If
          For i = LBound(testArray) To UBound(testArray)
      
              If InStr(testString, testArray(i)) > 0 Then
                  IsInArrayValue = True
                  Exit Function
              End If
          Next
          IsInArrayValue = False
      End Function
      

      非常感谢@QHarr 和@Dy.Lee!

      【讨论】:

      • 嗨!这个区域是为了回答。另外,在上面你并没有改变我可以看到的第 j 行。 j 与你的循环有什么关系?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多