Page 1 of 1

ต้องการเพิ่มสมาชิกของ array 2 มิติ

Posted: Mon Jul 19, 2010 10:58 am
by ter-uni
สวัสดีครับรบกวนปรึกษาอาจารย์และผู้รู้หน่อยนะครับ คือผมต้องการจะสร้าง dynamic array แบบ 2 มิติ โดยมี 2 แถวแต่จำนวน column ไม่จำกัดจะเพิ่มไปเรื่อย ๆ ขึ้นอยู่กับจำนวนของ object ของแต่ละ sheet ครับ หน้าตาของ array ที่ได้จะเป็นตามรูปที่แนบครับผม

- โดยผมสร้างตัวแปลที่เป็น array 2 มิติไว้ตอน open workbook ให้เป็น Global combolist() as String
- สำหรับ sub ผมได้เขียนให้วนรอบตามจำนวน sheet เพื่อเก็บชื่อ sheet ใส่ array ในแถวที่ 1 และเก็บชื่อ object ที่มีอยู่ในแต่ละ sheet ในแถวที่ 2 ซึ่งผมได้ code ไว้ดังนี้ครับ

Sub addComboList()
Dim countObj, i, j, k As Integer
Dim sheetName As String
ReDim Preserve combolist(1, 1) As String
For k = 1 To 6
sheetName = ActiveWorkbook.Sheets(k).Name
Sheets(k).Select
countObj = ActiveSheet.OLEObjects.Count
For i = 1 To countObj
If i = 1 Then
combolist(0, 0) = sheetName
combolist(1, 0) = ActiveSheet.OLEObjects(i).Name
ElseIf i = 2 Then
combolist(0, 1) = sheetName
combolist(1, 1) = ActiveSheet.OLEObjects(i).Name
ElseIf i >= 3 Then
ReDim Preserve combolist(0, i)
combolist(0, i) = ActiveSheet.Name
ReDim Preserve combolist(1, i)
combolist(1, i) = ActiveSheet.OLEObjects(i).Name
End If
Next i
Next k

* ซึ่งผลที่ได้ปรากฎ Error ว่า "Script out of range" ที่ ReDim Preserve combolist(0, i) เมื่อเข้าเงื่อนไข i มากกว่า 3 ตามความเข้าใจของผมผมคิดว่ามีการประกาศสมาชิกที่มากกว่าเดิมที่ประกาศไว้ combolist(1, 1) จึงเกิด Error แต่ผมสงสัยนะคับว่าใช้คำสั่ง Redim Preserve แล้วทำไมจึง Error อยู่ รบกวนอาจารย์หรือผู้รู้ช่วยแนะนำหน่อยนะคับ ว่าหลักการที่ถูกต้องแล้วเป็นยังไง ผมควรแก้ไขอย่างไรครับ ขอบคุณครับ

Re: ต้องการเพิ่มสมาชิกของ array 2 มิติ

Posted: Mon Jul 19, 2010 5:13 pm
by snasui
:D เราสามารถจะ Redim Preserve ได้เฉพาะส่วน Dimension สุดท้ายของ Dynamic Array เท่านั้นครับ ดูที่นี่ประกอบ http://www.xtremevbtalk.com/showthread.php?t=82476

อันนี้ Code ที่ผมลองทดสอบแล้วไม่พบว่าผิดพลาด

Code: Select all

Option Explicit
Dim combolist() As String

Sub addComboList()
Dim countObj As Integer, i As Integer
Dim j As Integer, k As Integer
Dim sheetName As String
ReDim combolist(1, 1)
For k = 1 To Sheets.Count
            sheetName = ActiveWorkbook.Sheets(k).Name
            Sheets(k).Select
            countObj = ActiveSheet.OLEObjects.Count
        For i = 1 To countObj
                If i = 1 Then
                    combolist(0, 0) = sheetName
                    combolist(1, 0) = ActiveSheet.OLEObjects(i).Name
                ElseIf i = 2 Then
                    combolist(0, 1) = sheetName
                    combolist(1, 1) = ActiveSheet.OLEObjects(i).Name
                ElseIf i >= 3 Then
                ReDim Preserve combolist(1, i)'<== เปลี่ยนได้เฉพาะ Dimension ที่สอง
                    combolist(0, i) = ActiveSheet.Name
                    combolist(1, i) = ActiveSheet.OLEObjects(i).Name
                End If
        Next i
Next k
End Sub

Re: ต้องการเพิ่มสมาชิกของ array 2 มิติ

Posted: Tue Jul 20, 2010 5:45 pm
by ter-uni
ขอบคุณอาจารย์นะครับ ผมลองนำไปแก้ไขแล้ว
ผมผิดตรงที่ Redim Preserve comboList(0,i) ครับ
พอลองแก้เป็น Redim Preserve comboList(1,i)
ผมก็สามารถเพิ่มสมาชิกได้แล้วครับ ขอบคุณอาจารย์จริงๆ ครับ