2015-01-14 56 views
0

我想使用Excel 2010 VBA來填充包含三個數組的數組。第一個是字符串類型數組,另外兩個是整型數組。宏的相關部分如下。填充動態多維,多類型數組Excel VBA

Option Explicit 
Option Base 1 
Private Type T_small 

    myStr() As String 
    y() As Integer 
    z() As Integer 
End Type 

Sub ColorByPoint() 

On Error GoTo ErrHandler 

Dim I As Integer, SCCount As Integer, PCCount As Integer, CLCount As Integer 
Dim N As Integer, M As Integer, K As Integer, P As Integer 
Dim x() As String, y() As Integer, z() As Integer 
Dim pvtItM As Variant 
Dim xName As String, str As String 
Dim xlRowField As Range 
Dim PC As ChartObjects 
Dim WS As Sheet3 
Dim SC As SeriesCollection 
Dim MyObj As Object 
Dim PvTbl As Object 
Dim CelVal As Integer 
Dim rng As Variant, lbl As Variant, vlu As Variant 
Dim ItemField1 As PivotItem, ItemField2 As PivotItem 
Dim ValueField As PivotField 
Dim dField As PivotCell 
Dim oPi As PivotItem 
Dim acolRng As Range 
Dim arowRng As Range 
Dim myStr() As String 
Dim iData() As T_small 
Dim xSSN() As String 

Set WS = Application.ActiveWorkbook.ActiveSheet 

Set MyObj = Worksheets("Pivot1").ChartObjects("MyChart").Chart 
Set PvTbl = Worksheets("Pivot1").PivotTables("PivotTable1") 
Set rng = PvTbl.PivotFields("SSN").PivotItems 
Set lbl = PvTbl.DataFields 
M = 1 

SCCount = MyObj.SeriesCollection.Count   'Series count 
PCCount = PvTbl.TableRange1.Rows.Count   'Rows Count 
CLCount = PvTbl.TableRange1.Columns.Count 'Columns Count 


Set acolRng = PvTbl.ColumnRange 
Set arowRng = PvTbl.RowRange 
Worksheets("Pivot1").Activate 

P = PCCount 

    ReDim Preserve myStr(P) 
    ReDim Preserve y(P) 
    ReDim Preserve z(P) 
    ReDim Preserve iData(P) 
For N = 2 To PCCount 
    ReDim Preserve iData((iData(2).myStr(2)), (iData(N).y(N)),(iData(N).z(N))) 
Next N 


For I = 2 To PvTbl.TableRange1.Rows.Count Step 1 
    For K = 2 To PvTbl.TableRange1.Columns.Count Step 1 
     M = K 
     N = K 

     iData(I).myStr(I) = PvTbl.Cells("myStr" & I, "K").Value 
     iData(I).y(I) = PvTbl.Cells("I", "M").Value 
     iData(I).z(I) = PvTbl.Cells("I", "N").Value 
    Next K 
Next I 

的問題是該行

ReDim Preserve iData((iData(2).myStr(2)), (iData(N).y(N)), (iData(N).z(N))) 

繼續給我一個「運行時錯誤9下標越界」的錯誤。我嘗試了所有我能想到的方法,包括在整個過程中使用「N」代替「2」索引,添加和去除括號等。

什麼會導致運行時錯誤?

+0

有兩件事:1)在使用'ReDim Preserve'之前,你可能需要'ReDim'數組一次,2)'ReDim Preserve'只能改變最後一個維度的大小。這兩個中的一個(或兩個)導致你的問題。 – RBarryYoung

+0

我在處理動態數組時遇到了問題,但它們看起來有點過於複雜。是否有一個原因,你不能使用一個變種陣列redimmed作爲iData(3,PCCOUNT)?然後,如果需要變大,可以使用Redim保留。 –

回答

0

問題是您正在訪問T_small屬性的數組索引。你永遠不會定義(或改變)iData(x).myStr的界限;而你只有定義了myStr的範圍,即而不是部分iData數組。

換句話說,界限錯誤來自嘗試訪問iData(x).myStr(x),因爲iData(x).myStr沒有定義界限。

這應該工作:

' Now that the iData bounds have been defined, update the property bounds. 
ReDim Preserve iData(N).myStr(myStr(N)) 
ReDim Preserve iData(N).y(y(N)) 
ReDim Preserve iData(N).z(z(N)) 

請注意,我有以下正是你的代碼上,努力實現有點困難的,因此,上述僅涉及您收到的具體錯誤。