2016-11-16 6 views
4

ein mehrdimensionales Array zu schneiden versuchen, habe ich eine Reihe bekommt, die in einem Wörterbuch gespeichert ist, es Grenzen sind ist von (0 bis 29 und 0 bis 7) und speichert eine Mischung aus Streichern und Zahlen.Typenkonflikt, wenn

Ich versuche jedoch eine Spalte, um es jedes Mal, wenn ich mir einen Typenkonfliktfehler ohne Looping bekommen.

Ich habe gesehen, dass es eine Grenze für die Größe eines Arrays ist, dass Sie mit application.index verwenden können, aber es gibt keine Möglichkeit, in der Nähe dieser Grenze.

Dim tmp As Variant 

' Get Array from Public Dictionary 
tmp = FBList(214) 

' Output a string of values from one column of array 
Debug.Print Join(Application.WorksheetFunction.Index(tmp, 19, 0), ",") 

ich Typenkonflikt immer in der letzten Zeile. Ich habe das erfolgreich mit anderen Arrays verwendet, aber diesmal nicht.

Example File

Update: Bestücken FBList

Dim i As Integer, j As Integer, NoCol As Integer, si As Integer, sKey As Integer 

Set cn = Nothing 

With FBList 
    .RemoveAll 
    .CompareMode = TextCompare 
End With 
With FBMap 
    .RemoveAll 
    .CompareMode = TextCompare 
End With 

If UserList.Count = 0 Or ThisUser = "" Then Call UserDL 

Call ConnecttoDB 
Set cmd = New ADODB.Command: Set rs = New ADODB.Recordset 

With cmd 
    .CommandTimeout = 120 
    .ActiveConnection = cn 
    .CommandText = "CSLL.Reports" 
    .CommandType = adCmdStoredProc 
    .Parameters.refresh 
    .Parameters("@Alias").value = ThisUser 
    On Error GoTo NoConnection 
    Set rs = .Execute 
    On Error GoTo 0 
End With 

With rs 
    For i = 0 To .Fields.Count - 1 
     If i = 0 Then 
      FBMap.Add .Fields.Item(0).Name, "Key" 
     Else 
      FBMap.Add .Fields.Item(i).Name, i - 1 
     End If 
    Next i 

    NoCol = .Fields.Count - 2 

    If Not .BOF And Not .EOF Then 
     .MoveLast 
     .MoveFirst 
      While (Not .EOF) 
        With FBList 
         ReDim UStemp(0 To NoCol, 0) As Variant 
         sKey = rs("ID") 
         If Not .Exists(sKey) Then 
          For i = 1 To NoCol + 1 
           UStemp(i - 1, 0) = rs(i) 
          Next i 
          .Add sKey, UStemp 
         ElseIf .Exists(sKey) = True Then 
          si = UBound(FBList(sKey), 2) 
          ReDim UStemp(0 To NoCol, 0 To si + 1) 
          For j = 0 To si + 1 
           If j <= si Then 
            For i = 0 To NoCol 
             UStemp(i, j) = .Item(sKey)(i, j) 
            Next i 
           ElseIf j > si Then 
            For i = 0 To NoCol 
             UStemp(i, j) = rs(i + 1) 
            Next i 
           End If 
          Next j 
          .Remove sKey 
          .Add sKey, UStemp 
         End If 
        End With 
       .MoveNext 
      Wend 
     .MoveFirst 
    End If 
End With 

Set cmd = Nothing: Set rs = Nothing: Set cn = Nothing 

-------- @Vityata Betrachten Sie bitte dieses:

Option Explicit 
Public Sub ProofOfSlicingWithArray() 
    Dim tmp(1 To 10, 1 To 10) As Variant 
    Dim i As Long, j As Long 

    ' Populate multi-dimensional array 
    For i = 1 To 10 
     For j = 1 To 10 
      tmp(i, j) = Int((999 - 100 + 1) * Rnd + 100) 
     Next j 
    Next i 

    Debug.Print Join(Application.Index(tmp, 5, 0), ",") 

End Sub 
+0

zeigen, wie Sie füllen 'FBList' – user3598756

+0

Einfach nur neugierig - haben Sie Index mit Arrays verwendet? Ich dachte, es nur mit Bereichen arbeitet - https://support.office.com/en-us/article/INDEX-function-a5dcf0dd-996d-40a4-a822-b56b061328bd – Vityata

+1

@Vityata [Haben Sie einen Blick auf diese] (https: //usefulgyaan.wordpress.com/2013/06/12/vba-trick-of-the-week-slicing-an-array-without-loop-application-index/) – Tom

Antwort

0

Fehler passiert, weil Application.WorksheetFunction.Index auf 255 Zeichen begrenzt ist und die Werte Ihres Arrays manchmal überschreiten.

Genau wie Application.Transpose(vArray), die ich in meinen Code eingegeben habe, ist es eine bequeme Lösung, aber 65536 Zeile Grenze und 255 Zeichen Grenze machen es unzuverlässig, jetzt verwende ich nur eine benutzerdefinierte Funktion für die Umsetzung.