2016-03-31 11 views
2

以下は、属性を構築し、xmlファイルとして出力するコードです。私はそれを実行するたびに、添え字が範囲外であり、属性2を強調表示しています。列40〜41は、定義された範囲内になければなりません。Excel VBAでアレイを構築するときに下付き文字が範囲外ですか?

「ElseIf」は使用しないでください。私はそれを属性1と属性2だけとして実行すると、 '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 And c <= 41)' ...と尋ねるべきでしょうか? – Jeeped

答えて

3

問題はIfステートメントにあります.VBAのような条件文をチェーンすることはできません。 VBAで、彼らは、左から右に評価されますので、この...

40 <= 50 <= 41 

...これに変わる:

(40 <= 50) <= 41 

表現になっ40 <= 50戻りTrueを、...

あなたは

...で終わるよう
True <= 41 

...と真は、VBAで-1の数値にキャストします

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

私にこれを思い出させていただきありがとうございます、私は解決策が非常に明白であることを知っていました。時々、散歩をして、新しい視点で戻ってくる必要がある... –