【问题标题】:VBA: how to compare dynamic array valuesVBA:如何比较动态数组值
【发布时间】:2016-03-03 23:22:44
【问题描述】:


大家好,

我是 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

我觉得我已经在声明中犯了一个错误——没有将数组的值声明为字符串。但实际上我完全不知道如何让它发挥作用。有人可以帮我解决这个问题吗?

杰克

附言这只是代码的一部分,前后还有其他元素

【问题讨论】:

  • 如果您使用Range.Delete method 删除整行或整列,则不必提供选项Shift xlDeleteShiftDirection,因为没有真正的选择。但是,如果您要删除一小组单元格或(如您的情况)单个单元格,则必须指定 Shift:=xlShiftToLeftShift:=xlShiftUp
  • 工作表 Temp 上的哪个单元格接收 .Paste?也许A1?这完全悬而未决。

标签: arrays excel vba for-loop


【解决方案1】:

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

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

当您在循环中删除单元格时,请从底部开始,然后按数字顺序一直到顶部。不这样做可能会导致您在删除一个单元格时跳过一个单元格,一切都会向上移动,然后您循环到下一个单元格。

我不知道为什么使用Dim subassys(counter) As Long,然后使用SetRange object。随后将其与一系列文本字符串进行比较。我将其调暗为Range,并且仅在比较(以及可能的单元格删除)完成后才使用它。

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

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

【讨论】:

  • 您好 Jeeped,感谢您的反馈!我不完全理解设置“过滤器”的作用(特别是加入函数和 ChrW(8203))。另外我不太了解 IF 函数及其所有属性,因此我复制了您为测试它而创建的代码,但我确实收到了编译错误(Next without For)有什么想法吗?
  • 另外,感谢有关删除整行的建议,是的,粘贴到“temp”中,可以使用 A1,因为它是一个空白表,只是为了完成这部分代码而创建的,之后将被删除.
  • 我很抱歉。我放错了End IfJoin 创建一个分隔字符串,如 ×0×ET×Assy×Normteil×InStr function 检查 ×<cell value>× 是否在该字符串内。
  • 效果很好 - 非常感谢! CHrW(8203) 有什么作用?我可以通过给它一个定义为变量的字符串数组来替换“过滤器”中的值吗? (例如,filters = join (array(variable_name),ChrW8203))
  • 另外,我需要使用存储在“subassy”变量中的值来为每个值设置自动过滤条件,并将结果复制到不同的位置。到目前为止,这是我尝试失败的方法(我没有告诉它使用值作为字符串,而且我还没有弄清楚 for each 循环:Sheets("BOM_data").Select ActiveSheet.Range("A1").CurrentRegion.AutoFilter Field:=5, Criteria1:=subassy Range(("A2"), Range("A" & Rows.Count).End(xlUp)).Copy Destination:=Sheets("HTZ_global").Range("F").SpecialCells(xlCellTypeLastCell) 任何想法?
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多