Xin hỏi cách khai báo Array động, lấy dữ liệu từ Access vào Combobox? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

anhthuan

Thành viên hoạt động
Tham gia
10/12/06
Bài viết
106
Được thích
264
Mình có dòng code liên quan đến Array như sau;
Private Sub UserForm_Activate()
Dim rcArray(2, 3)
Dim i As Integer
i = 0
.........
Do While Not rst.EOF
rcArray(i, 0) = rst.Fields(0)
rcArray(i, 1) = rst.Fields(1)
rcArray(i, 2) = rst.Fields(2)
Me.ComboBox1.List() = rcArray
rst.MoveNext
i = i + 1
Loop
End If
Đây là trường hợp sử dụng Array cố định với row=2 và column=3, vậy nếu muốn row của Array thay đổi theo một tham số không cố định thì phải khai báo Array như thế nào?. Mình cũng đã khai Dim rcArray() và một số cách khác nhưng đều báo lỗi. Các bạn chỉ ra cho mình với

Cảm ơn nhiều
 
Bạn tham khảo cái này xem có ích gì không, nha!

PHP:
Option Explicit
Sub resize()
 Dim Mang():                 Dim Rng As Range
 Set Rng = Range("D1:e3")
  Mang = Rng
 
 Mang() = Range("D1").resize(4, 3)
 Dim iJ As Integer, iZ As Integer, iW As Integer
 For iW = 1 To 4
    For iZ = 1 To 3
        MsgBox Mang(iW, iZ)
Next iZ, iW
End Sub
 
bạn có thể giải thích cho mình biết Array là gì?omboBox?
mình nghe các từ náy nhiều songkho6ng hiểu
thông cảm dân vùng sâu vùng xa không biết đừng trách bạn nhé
 
anhthuan đã viết:
Mình có dòng code liên quan đến Array như sau;
Private Sub UserForm_Activate()
Dim rcArray(2, 3)
Dim i As Integer
i = 0
.........
Do While Not rst.EOF
rcArray(i, 0) = rst.Fields(0)
rcArray(i, 1) = rst.Fields(1)
rcArray(i, 2) = rst.Fields(2)
Me.ComboBox1.List() = rcArray
rst.MoveNext
i = i + 1
Loop
End If
Đây là trường hợp sử dụng Array cố định với row=2 và column=3, vậy nếu muốn row của Array thay đổi theo một tham số không cố định thì phải khai báo Array như thế nào?. Mình cũng đã khai Dim rcArray() và một số cách khác nhưng đều báo lỗi. Các bạn chỉ ra cho mình với

Cảm ơn nhiều
Bạn muốn sử dụng mảng Array động thì khai báo ReDim Preserve....
Mình sửa lại code trên như sau:
Mã:
Private Sub UserForm_Activate()
Dim rcArray()
Dim i As Integer
i = 0
'.........
Do While Not rst.EOF
    i = i + 1
    ReDim Preserve rcArray(i, 2)
    rcArray(i, 0) = rst.Fields(0)
    rcArray(i, 1) = rst.Fields(1)
    rcArray(i, 2) = rst.Fields(2)
    Me.ComboBox1.List() = rcArray
    rst.MoveNext
Loop
End If
 
nvson đã viết:
Bạn muốn sử dụng mảng Array động thì khai báo ReDim Preserve....
Mình sửa lại code trên như sau:
Mã:
Private Sub UserForm_Activate()
Dim rcArray()
Dim i As Integer
i = 0
'.........
Do While Not rst.EOF
    i = i + 1
    ReDim Preserve rcArray(i, 2)
    rcArray(i, 0) = rst.Fields(0)
    rcArray(i, 1) = rst.Fields(1)
    rcArray(i, 2) = rst.Fields(2)
    Me.ComboBox1.List() = rcArray
    rst.MoveNext
Loop
End If

Cách để chuyển Array động thì đúng rồi, nhưng vẫn chưa đúng ý định của mình. Nếu cho chạy dòng code trên sẽ lấy sai danh mục (tức là chỉ lấy được một dòng danh mục cuối cùng, toàn bộ ở trên là những dòng trống). Mình đưa dòng ReDim Preserve rcArray(i, 2) ra khỏi vòng Do..loop như sau;
Private Sub UserForm_Activate()
Dim rcArray()
Dim i As Integer, t as interger
i = 0
'.........
t= rst.recordcount
ReDim Preserve rcArray(t, 2)
Do While Not rst.EOF
rcArray(i, 0) = rst.Fields(0)
rcArray(i, 1) = rst.Fields(1)
rcArray(i, 2) = rst.Fields(2)
Me.ComboBox1.List() = rcArray
rst.MoveNext
Loop
End If

Dòng code có vẻ ổn, tuy nhiên giá trị của t lúc này không phải là Interger nữa mà lại chuyển thành Long, khi đó dòng ReDim Preserve rcArray(t, 2) sẽ báo lỗi tràn mảng (erros 9). Có cách nào để t luôn luôn là interger không????
 
Dòng code có vẻ ổn, tuy nhiên giá trị của t lúc này không phải là Interger nữa mà lại chuyển thành Long, khi đó dòng ReDim Preserve rcArray(t, 2) sẽ báo lỗi tràn mảng (erros 9). Có cách nào để t luôn luôn là interger không????
Tại sao bạn không khai báo t kiểu Long?
Mình thì vẫn giữ nguyên đoạn code mà mình đã post ở trên. Tuy nhiên bạn nên đưa dòng lệnh Me.ComboBox1.List() = rcArray sau khi đã kết thúc vòng lặp Do
Mã:
Private Sub UserForm_Activate()
On Error Resume Next
Dim rcArray()
Dim i As Integer 'Theo minh nen khai bao la Long
i = 0
'.........
Do While Not rst.EOF
    i = i + 1
    ReDim Preserve rcArray(1 To i, 2)
    rcArray(i, 0) = rst.Fields(0)
    rcArray(i, 1) = rst.Fields(1)
    rcArray(i, 2) = rst.Fields(2)
    rst.MoveNext
Loop
Me.ComboBox1.List() = rcArray
End Sub
P/S: Cách tốt nhất là bạn upload file lên diễn đàn để mọi người giúp đỡ nhanh hơn.
 
To nvson

Mình úp file vidu.rar lên để bạn giúp mình. Thông tin và yêu cầu mình viết ở file excel
Cảm ơn rất nhiều
 

File đính kèm

Theo mình thì không cần phải sử dụng mảng làm gì cho tốn bộ nhớ.
Bạn thay đổi lại code như sau:
Mã:
Private Sub UserForm_Activate()
'Dim rcArray()
Dim i As Long
i = -1
Set rst = New ADODB.Recordset
QL = "Select[ma],[tk],[ten]from[dmcn]"
rst.Open QL, cnn
With Me.ComboBox1
    .Clear
    .ColumnCount = 3
    .ColumnWidths = "50pt;40pt;150pt"
End With
Do While Not rst.EOF
    i = i + 1
    '
    ComboBox1.AddItem rst.Fields(0)
    ComboBox1.List(i, 1) = rst.Fields(1)
    ComboBox1.List(i, 2) = rst.Fields(2)
    '
    rst.MoveNext
Loop
rst.Close
End Sub
Mình đã Test thử và thấy OK!
 
Web KT

Bài viết mới nhất

Back
Top Bottom