Ошибка 13 VBA. Почему в Ubound () возникает ошибка несоответствия? - PullRequest
0 голосов
/ 05 марта 2019

Мне нужно отфильтровать некоторые столбцы (строки и числа).Я определил var как variant, sArray () как String.Я получаю тип ошибки 13 для sArray (4,5) здесь:

 ReDim sArray4(1 To UBound(var4))
 'and here
 ReDim sArray5(1 To UBound(var5))

var4 - это строка / вариант для выражения "Консалтинг и поддержка", но UBound(var4) выдает несоответствие.Я этого не понимаюvar1, var2 и var3 также являются 2D-вариантами, такими как var4 и 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

1 Ответ

1 голос
/ 05 марта 2019

Вы читаете значения с листа с 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 может содержать что угодно , и это включает массивы. Использование вариантов для передачи массивов из / в функцию часто является самым простым решением.

И я настоятельно рекомендую вам дать вашим переменным более описательные имена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...