Arrays VBA:如何比较动态数组值

Arrays VBA:如何比较动态数组值,arrays,excel,vba,for-loop,Arrays,Excel,Vba,For Loop,大家好, 我是VBA的新手,非常感谢您在以下问题上的帮助: 我有一个长度不同的字符串数组。我想将数组中每个位置的值与不同长度数组中的所有位置进行比较。 我尝试了以下方法(将其与固定值进行比较,而不是将其与数组进行比较,但甚至无法实现这一点): Option Explicit Dim subassys(counter) As Long, Filter1 As String, Filter2 As String, Filter3 As String, Filter4 As String Sub s


大家好,

我是VBA的新手,非常感谢您在以下问题上的帮助:
我有一个长度不同的字符串数组。我想将数组中每个位置的值与不同长度数组中的所有位置进行比较。

我尝试了以下方法(将其与固定值进行比较,而不是将其与数组进行比较,但甚至无法实现这一点):

Option Explicit
Dim subassys(counter) As Long, Filter1 As String, Filter2 As String, Filter3 As String, Filter4 As String

Sub sub_fitler ()

    Sheets("data").Select
    ActiveSheet.Range("A1").CurrentRegion.AutoFilter Field:=4, Criteria1:="Spectrum 1"
    Range(("E2"), Range("E1").End(xlDown)).Copy
    Sheets("Temp").Select
    ActiveSheet.Paste
    Range("A1").End(xlDown).RemoveDuplicates Columns:=1, Header:=xlNo
    Range(ActiveCell, ActiveCell.End(xlDown)).Select
    set subassys = Selection
        Filter1 = "0"
        Filter2 = "ET"
        Filter3 = "Assy"
        Filter4 = "Normteil"
        For counter = 0 To UBound(subassys)
            If subassys(counter) = Filter1 Then
                ActiveCell.Delete
                    Exit For
            ElseIf subassys(counter) = Filter2 Then
                ActiveCell.Delete
                    Exit For
            ElseIf subassys(counter) = Filter3 Then
                ActiveCell.Delete
                Exit For
            ElseIf subassys(counter) = Filter4 Then
                ActiveCell.Delete
                Exit For
            End If
        Next counter
    Range(ActiveCell, ActiveCell.End(xlDown)).Select
    Set subassys = Selection
    Sheets("Temp").Range("A1").CurrentRegion.Clear
End sub

我觉得我在声明中已经犯了一个错误——没有将数组的值声明为字符串。但实际上,总的来说,我不知道如何让这项工作发挥作用。谁能帮我解决这个问题

Jack

P.S.这只是代码的一部分,前后还有其他元素

如果使用删除整行或整列,则不必提供选项Shift,因为没有真正的选择。但是,如果要删除一小组单元格或(在您的情况下)单个单元格,则必须指定

Shift:=xlshiftoleft
Shift:=xlShiftUp

工作表Temp上的哪个单元格接收.Paste?也许是A1?没有给出确切的细胞位置;只是在粘贴后不久就开始处理列A

删除循环中的单元格时,请从底部开始,以数字方式向顶部移动。如果不这样做,可能会导致在删除某个单元格时跳过该单元格,所有内容都会向上移动,然后循环到下一个单元格

我不知道为什么
Dim subassys(计数器),只要使用了
,然后
设置为a。随后将其与一系列文本字符串进行比较。我将其暗显为
范围
,仅在比较(以及可能的单元格删除)完成后使用

Option Explicit

Dim subassys As Range, Filters As String

Sub sub_fitler()
    Dim rw As Long
    With Worksheets("Data")
        With .Range("A1").CurrentRegion
            .AutoFilter Field:=4, Criteria1:="Spectrum 1"
            .Resize(.Rows.Count - 1, 1).Offset(1, 4).Copy _
              Destination:=Worksheets("Temp").Range("A1")
        End With
    End With
    With Worksheets("Temp")
        .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) _
            .RemoveDuplicates Columns:=1, Header:=xlNo
        Filters = Join(Array("", "0", "ET", "Assy", "Normteil", ""), ChrW(8203))
        For rw = .Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
            If CBool(InStr(1, Filters, ChrW(8203) & .Cells(rw, 1).Value2 & ChrW(8203), vbTextCompare)) Then
                .Rows(rw).EntireRow.Delete
            End If
        Next rw
        Set subassys = .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
        .Range("A1").CurrentRegion.Clear
    End With
End Sub

我已将主要比较更改为另一个已删除字符串中的分隔字符串。这完全避免了二次循环。

如果使用删除整行或整列,则不必提供Shift选项,因为没有真正的选项。但是,如果要删除一小组单元格或(在您的情况下)单个单元格,则必须指定
Shift:=xlshiftoleft
Shift:=xlShiftUp
。工作表Temp上的哪个单元格接收.Paste?也许是A1?这完全是悬而未决的。嗨,吉普,谢谢你的反馈!我不完全理解设置“过滤器”的作用(尤其是连接函数和ChrW(8203))。另外,我不太了解IF函数及其所有属性,因此我复制了您为测试它而创建的代码,但我确实收到了一个编译错误(下一步没有)任何想法?此外,thx提供了关于删除整行的建议,是的,粘贴到“temp”,可以使用A1,因为它是一张空白页,只是为了完成代码的这一部分而创建的,稍后将被删除。我很抱歉。我错放了一个
结束If
Join
创建一个带分隔符的字符串,如
×0×ET×Assy×Normteil×
,并检查
××
是否在该字符串中。效果很好-非常感谢!CHrW(8203)是做什么的?我可以通过给它一个定义为变量的字符串数组来替换“filters”中的值吗?(例如filters=join(array(variable_name),ChrW8203))此外,我需要使用存储在'subassy'变量中的值为每个值设置自动筛选条件,并将结果复制到不同的位置。以下是迄今为止我尝试过但未成功的内容(我没有告诉它使用值作为字符串,而且我还没有弄清楚每个循环的值:
Sheets(“BOM_数据”)。选择ActiveSheet.Range(“A1”).CurrentRegion.AutoFilter字段:=5,Criteria1:=子进程范围(“A2”),范围(“A”和Rows.Count)。End(xlUp))。复制目标:=Sheets(“HTZ_全局”).Range(“F”).SpecialCells(xlCellTypeLastCell)
有什么想法吗?