在笛卡尔积中,下标超出范围

我试图find有分隔符分隔数据的4列的笛卡尔乘积

ID ID2 String String2 1234 33423,43222,442224,213432 Sample;repeat;example;multiple second; possible;delimiter 2345 12354; 55633; 343534;65443;121121 data;set;sample;find answer;combination;by 

我得到一个错误的下标与下面的代码的范围。 任何人都可以帮助哪里出错?

 Sub Cartesian() Dim MyStr1 As Variant, MyStr2 As Variant, MyStr3 As Variant, MyStr4 As Variant, _ Str1 As Variant, Str2 As Variant, Str3 As Variant, Str4 As Variant, X As Long, _ OrigString1 As Variant, OrigString2 As Variant, OrigString3 As Variant, _ OrigString4 As Variant, Y As Long OrigString1 = Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row) OrigString2 = Range("B2:B" & Range("A" & Rows.Count).End(xlUp).Row) OrigString3 = Range("C2:C" & Range("A" & Rows.Count).End(xlUp).Row) OrigString4 = Range("D2:D" & Range("A" & Rows.Count).End(xlUp).Row) X = 2 For Y = LBound(OrigString1) To UBound(OrigString1) MyStr1 = Split(OrigString1(Y), ";") MyStr2 = Split(OrigString2(Y), ";") MyStr3 = Split(OrigString3(Y), ";") MyStr4 = Split(OrigString4(Y), ";") For Each Str1 In MyStr1 For Each Str2 In MyStr2 For Each Str3 In MyStr3 For Each Str4 In MyStr4 Range("A" & X).Formula = Str1 Range("B" & X).Formula = Str2 Range("C" & X).Formula = Str3 Range("D" & X).Formula = Str4 X = X + 1 Next Next Next Next Next End Sub 

还是有更好的方法来处理这个使用SQL? 或者更好的方法来实现使用VBA的每一行的笛卡尔乘积?

像这样的工作。 我找不到更优雅的解决scheme。

 Sub Cartesian() Dim MyStr1() As String Dim MyStr2() As String Dim MyStr3() As String Dim MyStr4() As String Dim X As Long Dim OrigString1() As String Dim OrigString2() As String Dim OrigString3() As String Dim OrigString4() As String Dim Y As Long Dim sht As Worksheet Set sht = Worksheets("Sheet1") ReDim OrigString1(1 To Range("A" & Rows.Count).End(xlUp).Row - 1) For Y = 1 To UBound(OrigString1) OrigString1(Y) = CStr(Range("A" & CStr(Y + 1)).Value) Next ReDim OrigString2(1 To Range("B" & Rows.Count).End(xlUp).Row - 1) For Y = 1 To UBound(OrigString2) OrigString2(Y) = CStr(Range("B" & CStr(Y + 1)).Value) Next ReDim OrigString3(1 To Range("C" & Rows.Count).End(xlUp).Row - 1) For Y = 1 To UBound(OrigString3) OrigString3(Y) = CStr(Range("C" & CStr(Y + 1)).Value) Next ReDim OrigString4(1 To Range("D" & Rows.Count).End(xlUp).Row - 1) For Y = 1 To UBound(OrigString4) OrigString4(Y) = CStr(Range("D" & CStr(Y + 1)).Value) Next X = 2 For Y = LBound(OrigString1) To UBound(OrigString1) MyStr1() = Split(OrigString1(Y), ";") MyStr2() = Split(OrigString2(Y), ";") MyStr3() = Split(OrigString3(Y), ";") MyStr4() = Split(OrigString4(Y), ";") For Each Str1 In MyStr1 For Each Str2 In MyStr2 For Each Str3 In MyStr3 For Each Str4 In MyStr4 Range("A" & X).Formula = Str1 Range("B" & X).Formula = Str2 Range("C" & X).Formula = Str3 Range("D" & X).Formula = Str4 X = X + 1 Next Next Next Next Next End Sub 

第一行包含逗号而不是分号,这是搞乱vector的维度

当你将一块单元格的值填充到一个变体数组中时,最好不要依赖于.Value的默认属性。 明确指出你想要单元格中的值。 实际上,使用.Value2从单元格中获取基本值。

 OrigString1 = Range("A2:A" & Range("A" & Rows.Count).End(xlUp).Row).Value2 OrigString2 = Range("B2:B" & Range("A" & Rows.Count).End(xlUp).Row).Value2 OrigString3 = Range("C2:C" & Range("A" & Rows.Count).End(xlUp).Row).Value2 OrigString4 = Range("D2:D" & Range("A" & Rows.Count).End(xlUp).Row).Value2 

有关.Value2的更多信息,请参阅Range.Value2属性 。 在尝试批量处理内存时,Currency和Date值types的特定小属性并不重要; 只有当原始值传回给工作表时。