2016-11-16 2 views
4

У меня есть массив, который хранится в словаре, это границы от (от 0 до 29 и от 0 до 7) и хранит смесь строк и целых чисел.Несоответствие типа при попытке среза многомерного массива

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

Я видел, что существует ограничение на размер массива, который можно использовать с application.index, но это не так близко к этому пределу.

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), ",") 

Я всегда получаю несоответствие типов на последней строке. Я успешно использовал это с другими массивами, но не в этот раз.

Example File

Обновление: Заполнение 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 Пожалуйста, посмотрите на это:

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

показать, как вы заполняете 'FBList' – user3598756

+0

Просто любопытно - вы использовали индекс с массивами? Я думал, что он работает только с диапазонами - https://support.office.com/en-us/article/INDEX-function-a5dcf0dd-996d-40a4-a822-b56b061328bd – Vityata

+1

@Vityata [Посмотрите на это] (https: //usefulgyaan.wordpress.com/2013/06/12/vba-trick-of-the-week-slicing-an-array-without-loop-application-index/) – Tom

ответ

0

Ошибка возникает из-за того, что Application.WorksheetFunction.Index ограничен 255 символами, а значения вашего массива иногда превышают его.

Точно так же, как Application.Transpose(vArray), который я использовал для ввода кода, это удобное решение, но ограничение по 65536 строк и ограничение на 255 символов делают его ненадежным, теперь я использую только настраиваемую функцию для транспонирования.

Смежные вопросы