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)
有什么想法吗?