excel - VBA 错误 13:为什么 Ubound() 中出现不匹配错误?
问题描述
我需要过滤一些列(字符串和数字)。我将, ()定义var
为。我在这里得到一个错误类型 13 :variant
sArray
String
sArray (4,5)
ReDim sArray4(1 To UBound(var4))
'and here
ReDim sArray5(1 To UBound(var5))
var4
是 exp "Consulting & Support" 的字符串/变体,但UBound(var4)
不匹配。我不明白。var1
,var2
也是var3
2D 变体,例如var4
and ReDim sArray2(1 To UBound(var2))
... 工作正常。
我已经看到与此错误相关的问题。我发现没有任何帮助
Dim Pfad1 As String
Dim Bezeichnung As Variant
Umsatzdatenbank = ActiveWorkbook.Name
Pfad1 = Workbooks(Umsatzdatenbank).Sheets("Umsatz").Cells(5, 5)
Dim range1, range2, range3, range4, range5 As Range
lastoffice = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("H" & Rows.Count).End(xlUp).Row
lastoffice = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("H" & Rows.Count).End(xlUp).Row
lastbez = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("B" & Rows.Count).End(xlUp).Row
lastbez2 = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("C" & Rows.Count).End(xlUp).Row
lastoffice2 = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("F" & Rows.Count).End(xlUp).Row
Set range1 = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("B3:B" & lastbez)
Set range2 = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("E3:E" & lastoffice)
Set range3 = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("H3:H" & lastoffice)
Set range4 = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("C3:C" & lastbez2)
Set range5 = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("F3:F" & lastoffice)
Dim var1, var2, var3, var4, var5 As Variant
Dim sArray1(), sArray2(), sArray3(), sArray4(), sArray5() As String
Dim i As Long
'Bestimmung des Arrays
var1 = range1.Value
ReDim sArray1(1 To UBound(var1))
For i = 1 To (UBound(var1))
sArray1(i) = var1(i, 1)
Next
var2 = range2.Value
ReDim sArray2(1 To UBound(var2))
For i = 1 To (UBound(var2))
sArray2(i) = var2(i, 1)
Next
var3 = range3.Value
ReDim sArray3(1 To UBound(var3))
For i = 1 To (UBound(var3))
sArray3(i) = var3(i, 1)
Next
var4 = range4.Value
ReDim sArray4(1 To UBound(var4))
For i = 1 To (UBound(var4))
sArray4(i) = var4(i, 1)
Next
var5 = range5.Value
ReDim sArray5(1 To UBound(var5))
For i = 1 To (UBound(var5))
sArray5(i) = var5(i, 1)
Next
Workbooks.Open Pfad1
ActiveSheet.Name = ("Quelldatei")
ActiveSheet.Copy After:=ActiveSheet
ActiveSheet.Name = "FSS"
LastRow = Range("A" & Rows.Count).End(xlUp).Row
Range("K1").Select
Selection.AutoFilter
Worksheets("FSS").Range("$A$1:$AA$" & LastRow).AutoFilter Field:=11, Criteria1:=sArray1, Operator:=xlFilterValues
Worksheets("FSS").Range("$A$2:$AA$" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
ActiveSheet.ShowAllData
Worksheets("FSS").Range("$A$1:$AA$" & LastRow).AutoFilter Field:=13, Criteria1:=sArray2, Operator:=xlFilterValues
Worksheets("FSS").Range("$A$2:$AA$" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
ActiveSheet.ShowAllData
'Sheets("FSS").Range("$A$1:$AA$" & lastRow).AutoFilter Field:=18, Criteria1:=sArray3, Operator:=xlFilterValues
Workbooks.Open Pfad1
ActiveSheet.Name = ("Quelldatei")
LastRow = Range("A" & Rows.Count).End(xlUp).Row
ActiveSheet.Name = "GMS"
Range("K1").Select
Selection.AutoFilter
Worksheets("Quelldatei").Range("$A$1:$AA$" & LastRow).AutoFilter Field:=11, Criteria1:=sArray4, Operator:=xlFilterValues
Worksheets("Quelldatei").Range("$A$1:$AA$" & LastRow).AutoFilter Field:=13, Criteria1:=sArray5, Operator:=xlFilterValues
Worksheets("Quelldatei").Range("$A$2:$AA$" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Copy
Worksheets("GMS").Range("$A$2:$AA$" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Paste
ActiveSheet.ShowAllData
Application.ScreenUpdating = True
End Sub
解决方案
您正在使用 varX = rangeX.Value 从工作表中读取值。如果 Range 包含多个单元格,则结果是一个二维数组。但是,如果 Range 仅包含一个单元格,则结果是单个值,而不是数组 - 您不能将UBound
- 函数用于单个(标量)值。
现在,对于过滤器,您可以传递单个值或一维数组。该代码将范围数据的第一列复制到一个新的一维变量sArrayX
。
您必须区分只有一个值和有多个值的两种情况。当你做了 5 次全部工作时,我建议为此使用一个函数:
Function copyToArray(r As Range) As Variant
Dim a As Variant
If r.Count = 1 Then
ReDim a(1 To 1)
a(1) = r.Value2
Else
ReDim a(1 To r.Rows.Count)
Dim i As Long
For i = 1 To r.Rows.Count
a(i) = r.Cells(i, 1).Value2
Next i
End If
copyToArray = a
End Function
你可以这样调用函数:
Dim sArray1, sArray2, sArray3, sArray4, sArray5 ' Declare as Variant is okay!
sArray1 = copyToArray(range1)
sArray2 = copyToArray(range2)
...
VarX
不再需要-变量。一句话:类型的变量Variant
可以保存任何东西,包括数组。使用 Variants 从/向函数传递数组通常是最简单的解决方案。
我强烈建议您为变量提供更具描述性的名称。
推荐阅读
- android - 如何使用 P3 颜色空间使用 EGL 扩展创建表面
- python-3.x - TypeError:数据类型不理解模型?
- vb.net - 在 CSV 中按组查找重复项
- reactjs - 如何在反应中设置不同的弹出屏幕?
- swift - TableView中的自定义单元格隐藏DidSelect上的标签
- django - Django 模型 - ManyToManyField 限制从同一类别中选择多个项目
- java - 大家好,请问一下按键时的声音处理?
- angular - eva-icons@1.1.3、@angular/compiler@8.2.14、@angular/core@8.2.14 的 npm WARN tarball tarball 数据似乎已损坏
- php - 如何显示子路由器?
- html - 无法从移动设备提交联系表格