2016-03-31 4 views
2

Ниже приведен код, который создает атрибуты, а затем печатает их в виде XML-файла. Каждый раз, когда я запускаю его, он говорит, что индекс находится вне диапазона, выделяя атрибуты2. Столбцы 40-41 должны находиться в пределах определенного диапазона.Подкатегория вне диапазона при построении массивов в Excel VBA?

Я предполагаю, что проблема может быть в том, что я не должен использовать «ElseIf». Когда я запускаю его как атрибуты1 и attributes2, он отлично работает, когда я использую оператор «Else». Возможно, я неправильно определил свои массивы, так как я не могу найти ответ и нуждаюсь в свежих глазах.

Sub ILikeFruits() 

Dim headers(), data(), attributes1(), attributes2(), attributes3(), _ 
attributes4(), attributes5(), attributes6(), attributes7(), attributes8(), attr$, r&, c& 

' load the headers and data to an array ' 

headers = Cells(1, 1).Resize(1, 104).Value 
data = Cells(2, 1).Resize(10, 104).Value 


' set the size for the attributes ' 
ReDim attributes1(1 To 39) 
ReDim attributes2(40 To 41) 
ReDim attributes3(42 To 51) 
ReDim attributes4(52 To 65) 
ReDim attributes5(66 To 69) 
ReDim attributes6(70 To 89) 
ReDim attributes7(90 To 97) 
ReDim attributes8(98 To 104) 

' open file and print the header ' 
Open "C:\desktop\XML Update\Simulation\XML tests (Attributes)\DataTest.xml" For Output As #1 
Print #1, "<Fruits>" 
Print #1, " <Tasty_Fruits>" 

' iterate each row ' 
For r = 2 To UBound(data) 

    ' iterate each column ' 
    For c = 1 To UBound(data, 2) 

    ' build each attribute ' 
    attr = headers(1, c) & "=""" & data(r, c) & """" 
    If c <= 39 Then 
     attributes1(c) = attr 
    ElseIf 40 <= c <= 41 Then 'Subscript out of range 
     attributes2(c) = attr 
    ElseIf 42 <= c <= 51 Then 
     attributes3(c) = attr 
    ElseIf 52 <= c <= 65 Then 
     attributes4(c) = attr 
    ElseIf 66 <= c <= 69 Then 
     attributes5(c) = attr 
    ElseIf 70 <= c <= 89 Then 
     attributes6(c) = attr 
    ElseIf 90 <= c <= 97 Then 
     attributes7(c) = attr 
    ElseIf 98 <= c <= 104 Then 
     attributes8(c) = attr 
     End If 
    Next 

    ' print the row ' 
    Print #1, " <Fruits_By_Color " & Join(attributes1, " ") & " >" 
    Print #1, "  <Small_Red_Fruits>" 
    Print #1, "  <Cranberry " & Join(attributes2, " ") & " />" 
    Print #1, "  </Small_Red_Fruits>" 
    Print #1, "  <Big_Red_Fruits>" 
    Print #1, "  <Apple " & Join(attributes3, " ") & " />" 
    Print #1, "  <Pomegranate " & Join(attributes4, " ") & " />" 
    Print #1, "  <Tomato " & Join(attributes5, " ") & " />" 
    Print #1, "  </Big_Red_Fruits>" 
    Print #1, "  <Yellow_Fruits>" 
    Print #1, "  <Small_Yellow_Fruits " & Join(attributes6, " ") & " >" 
    Print #1, "  <Banana " & Join(attributes7, " ") & " />" 
    Print #1, "  <Lemon " & Join(attributes8, " ") & " />" 
    Print #1, "  </Small_Yellow_Fruits>" 
    Print #1, "  </Yellow_Fruits>" 
    Print #1, " </Fruits_By_Color>" 

Next 

' print the footer and close ' 
Print #1, " </Tasty_Fruits>" 
Print #1, "</Fruits>" 
Close #1 

End Sub 
+0

Вы запрашиваете 'ElseIf 40 <= CBool ​​(c <= 41)'. Возможно, вы должны спросить 'ElseIf 40 <= c И c <= 41)' ...? – Jeeped

ответ

3

Проблема с вашими If заявления - вы не можете цепи условными, как, что в VBA. В VBA, они будут вычисляются слева направо, так что ...

40 <= 50 <= 41 

... превращается в это:

(40 <= 50) <= 41 

Выражение 40 <= 50 возвращает True, который становится ...

True <= 41 

... и правда бросает в числовое значение -1 в VBA, так что вы в конечном итоге с ...

If -1 <= 41 Then 

... который как True, так и индекс, который выходит за пределы допустимого диапазона.

Так, положить в ваших тестах в And:

ElseIf 40 <= c And c <= 41 Then 
+0

Святый ... если это ответ, я режу. Обновите, когда у меня есть время, чтобы проверить это. –

+0

Работает отлично, спасибо большое. –

1

предыдущий ответ правильный, но как стилистическая вещь, это идеальное место, чтобы использовать Select .. Case заявление:

Select Case c 
    Case 1 To 39 
     attributes1(c) = attr 
    Case 40 To 41 
     attributes2(c) = attr 
    Case 42 To 51 
     attributes3(c) = attr 
    ... ' Fill in the other possibilities 
End Select 
+0

Спасибо, что напомнили мне об этом, я знал, что решение было очень очевидно. Иногда вам просто нужно прогуляться и вернуться с новой перспективой ... –

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