Ошибка VBA 13: почему я получаю эту ошибку, хотя она работала для других переменных с тем же кодом

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

   ReDim sArray4(1 To UBound(var4))  & ReDim sArray5(1 To UBound(var5))

var4 — это строка/вариант для выражения «Консалтинг и поддержка», но UBound(var4) выдает несоответствие. Я не понимаю, что var1, var2 и var3 также похожи на var4 2D-вариант и ReDim sArray2(1 To UBound(var2)) . .. работает отлично.

любая помощь приветствуется :)

PS: новое в VBA, и это не мой код

Я уже видел вопросы, связанные с этой ошибкой. не нахожу ничего полезного

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

Workbooks.Open Pfad1
ActiveSheet.Name = ("Quelldatei")
ActiveSheet.Copy After:=ActiveSheet
ActiveSheet.Name = "GMS"
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

person Josef.Zep    schedule 15.02.2019    source источник
comment
Dim sArray1(), sArray2(), sArray3(), sArray4(), sArray5() As String недействителен, он только объявляет sArray5() как строку, остальное объявляется как вариант. Вы должны написать как: Dim sArray1() as String, sArray2() as string....   -  person Luuklag    schedule 15.02.2019
comment
Чтобы добавить к комментарию @Luuklag, Dim range1, range2, range3, range4, range5 As Range объявляет только range5 как Range. Все остальные Variant. Вы должны быть явными при объявлении типов: Dim range1 as Range, range2 as Range, ...   -  person BruceWayne    schedule 15.02.2019
comment
@Luuklag не совсем так. sArray1...5() все еще являются массивами - только они являются массивами Variant, кроме sArray5(), который является массивом String. Исправление, которое делает намерение более явным, что хорошо, но не приведет к несоответствию типов, например. sArray1(i) = var1(i, 1)   -  person Mathieu Guindon    schedule 15.02.2019


Ответы (1)


ReDim sArray4(1 To UBound(var4))

Проблема в UBound(var4), потому что var4 - это массив 2D-вариантов, согласно этой инструкции:

var4 = range4.Value

Поскольку range4 содержит несколько ячеек, согласно этой инструкции:

Set range4 = Workbooks(Umsatzdatenbank).Sheets("Filter").Range("C3:C" & lastbez2)

Есть два решения.

Можно было бы указать размер в UBound(var4):

ReDim sArray4(1 To UBound(var4, 1))

Другим было бы, поскольку range4 является диапазоном из одного столбца, чтобы сделать var4 одномерным массивом, используя Application.Transpose:

var4 = Application.Transpose(range4.Value)

Поскольку var4 является одномерным массивом, UBound(var4) будет работать, как и ожидалось, — обратите внимание, что создание var4 одномерного массива устраняет необходимость в явном указании индекса для второго измерения здесь:

sArray4(i) = var4(i, 1)

...и оставление его приведет к ошибке индекс вне диапазона.

person Mathieu Guindon    schedule 15.02.2019
comment
к сожалению, это не сработало. Я не понимаю, что var1, var2 и var3 также похожи на var4 2D вариант и ReDim sArray2(1 To UBound(var2))... отлично работает - person Josef.Zep; 01.03.2019