ADO: Kết nối, truy vấn Excel Database vào các control ở Userform. (2 người xem)

Liên hệ QC

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

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia
18/3/08
Bài viết
8,311
Được thích
15,874
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Tiếp chiêu bài ADO: Kết nối Excel Database cho công việc kế toán của Thầy Mỹ (Ptm0412) và Kết nối giữa các file Excel bằng ADODC. của anh Sealand em viết bài này về việc kết nối và truy vấn với file excel dữ liệu khác trên userform, mong các anh chị hướng dẫn thêm.

Chuẩn bị:

References.jpg

Tạo 1 Userform và các control như hình:

form.jpg

Code trong module:

Kết nối với dữ liệu nguồn là file Excel:

Mã:
Public cnn As New ADODB.Connection
Sub Moketnoi()
Dim i, r As Integer
Set cnn = New ADODB.Connection
  With cnn
    .ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & ThisWorkbook.Path & _
                        "\Database.xls;Extended Properties=Excel 8.0;"
    .CursorLocation = adUseClient
    .Open
  End With

    
End Sub

Code trong form:

Mã:
Dim rst As ADODB.Recordset

Private Sub FillcbOrder()
On Error Resume Next
Dim lsSQL As String
Dim lrs As New ADODB.Recordset
        lsSQL = "select distinct [ORDER] " & _
                        "From [Dulieu$] " & _
                       "ORDER BY [ORDER]"
       lrs.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
       cbOrder.Clear
       Do Until lrs.EOF
       cbOrder.AddItem lrs![Order]
       lrs.MoveNext
       Loop
      Set lrs = Nothing

End Sub




Private Sub cmdExcel_Click()
On Error GoTo ErrHandle
    Dim iNumCols, i As Integer
    Dim lsSQL As String
    Dim lrs As New ADODB.Recordset
       lsSQL = "SELECT * FROM [Dulieu$] where [ORDER] like '" & cbOrder.Text & "' order by id"
       lrs.Open lsSQL, cnn, 1, 3
    If lrs.EOF Then
      MsgBox "Could not find your data, Please try again", vbCritical
    Else
    Cells.ClearContents
    iNumCols = lrs.Fields.Count
    For i = 1 To iNumCols
        With Sheet1
            .Cells(3, i).Value = lrs.Fields(i - 1).Name
            .Cells(3, i).Font.Bold = True
            .Cells(3, i).Font.ColorIndex = 5
            With .Cells(3, i).Interior
                .ColorIndex = 34
            End With
        End With
    Next
    Range("A4").CopyFromRecordset lrs
    
    End If
    Set lrs = Nothing
    Exit Sub
ErrHandle:
    MsgBox Err.Description

End Sub


Private Sub cmdFillList_Click()
On Error GoTo ErrHandle
    Dim iNumCols, i As Integer
    Dim lsSQL As String
    Dim lrs As New ADODB.Recordset
       lsSQL = "SELECT * FROM [Dulieu$] where [ORDER] like '" & cbOrder.Text & "' order by id"
       lrs.Open lsSQL, cnn, 1, 3
    If lrs.EOF Then
      MsgBox "Could not find your data, Please try again", vbCritical
    Else
        
    Set msgInfo.DataSource = lrs
    
    End If
    Set lrs = Nothing
    Exit Sub
ErrHandle:
    MsgBox Err.Description

End Sub


Private Sub UserForm_Initialize()
Moketnoi
On Error Resume Next
FillcbOrder
Dim rs As New ADODB.Recordset
Set rs = Nothing
rs.Open "Select * from [Dulieu$] order by id", cnn, 1, 3

Set msgInfo.DataSource = rs

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
cnn.Close
Set cnn = Nothing

End Sub
 

File đính kèm

Vấn đề sống còn của 1 Data Excel file là tốc độ. Với 1 file có dữ liệu nhỏ thì không sao, nhưng khi số lượng các bản ghi tăng lên thì công thức tuy là thế mạnh của Excel nhưng là 1 gánh quá sức của Hệ thống.Do vậy, trước đây mình còn làm kế toán, kho hàng trên file Exc thì một điều luôn thúc ép là tìm kiếm phương pháp ly khai công thức đơn thuần kết nối các bảng tính. ADO là 1 hướng giải quyết hoàn toàn khả thi.Nhưng có 1 điều mình chưa Test được là tốc độ sử lý dữ liệu trên Recordset và trên Array thì cái nào hơn. Cách trao đổi dữ liệu từ Recordset sang Array có thể sử dụng GetRow, nhưng ngược lại thì chưa thấy cách nào hay cả.
Vậy Domfootwear trong quá trình viết bài cũng nên lưu ý giùm.Thanks
 
Cũng dữ liệu trên ta truy vấn lọc dữ liệu theo ngày = DTPicker, các bạn thử nhé.
 
Vấn đề sống còn của 1 Data Excel file là tốc độ. Với 1 file có dữ liệu nhỏ thì không sao, nhưng khi số lượng các bản ghi tăng lên thì công thức tuy là thế mạnh của Excel nhưng là 1 gánh quá sức của Hệ thống.Do vậy, trước đây mình còn làm kế toán, kho hàng trên file Exc thì một điều luôn thúc ép là tìm kiếm phương pháp ly khai công thức đơn thuần kết nối các bảng tính. ADO là 1 hướng giải quyết hoàn toàn khả thi.Nhưng có 1 điều mình chưa Test được là tốc độ sử lý dữ liệu trên Recordset và trên Array thì cái nào hơn. Cách trao đổi dữ liệu từ Recordset sang Array có thể sử dụng GetRow, nhưng ngược lại thì chưa thấy cách nào hay cả.
Vậy Domfootwear trong quá trình viết bài cũng nên lưu ý giùm.Thanks

Tốc độ trên rec sẽ cao hơn Arr anh Việt à, cũng dữ liệu trên anh thử so sánh như sau:

1./ Recordset:

Mã:
Private Sub cmdExcel_Click()
On Error GoTo ErrHandle
    Dim iNumCols, i As Integer
    Dim lsSQL As String
    Dim lrs As New ADODB.Recordset
       lsSQL = "SELECT * FROM [Dulieu$] where [ORDER] like '" & cbOrder.Text & "' order by id"
       lrs.Open lsSQL, cnn, 1, 3
    If lrs.EOF Then
      MsgBox "Could not find your data, Please try again", vbCritical
    Else
    Cells.ClearContents
    iNumCols = lrs.Fields.Count
    For i = 1 To iNumCols
        With Sheet1
            .Cells(3, i).Value = lrs.Fields(i - 1).Name
            .Cells(3, i).Font.Bold = True
            .Cells(3, i).Font.ColorIndex = 5
            With .Cells(3, i).Interior
                .ColorIndex = 34
            End With
        End With
    Next
    Range("A4").CopyFromRecordset lrs
    End If
    Set lrs = Nothing
    Exit Sub
ErrHandle:
    MsgBox Err.Description

End Sub

2./ Arr

Mã:
Private Sub cmdExByGetRow_Click()
    Dim i As Integer
    Dim lsSQL As String
    Dim lrs As New ADODB.Recordset
    Dim arr, r, c
       lsSQL = "SELECT * FROM [Dulieu$] where [ORDER] like '" & cbOrder.Text & "' order by id"
       lrs.Open lsSQL, cnn, 1, 3
       
       arr = lrs.GetRows(-1, 1)
       
       For c = LBound(arr, 1) To UBound(arr, 1)
          Cells(3, c + 1).Value = lrs.Fields(c).Name
       Next

       For r = LBound(arr, 2) To UBound(arr, 2)
          For c = LBound(arr, 1) To UBound(arr, 1)
             Cells(r + 4, c + 1).Value = arr(c, r)
          Next c
       Next r

End Sub
 
Lần chỉnh sửa cuối:
Tốc độ trên rec sẽ cao hơn Arr anh Việt à, cũng dữ liệu trên anh thử so sánh như sau:

2./ Arr

Mã:
...
       For r = LBound(arr, 2) To UBound(arr, 2)
          For c = LBound(arr, 1) To UBound(arr, 1)
             Cells(r + 4, c + 1).Value = arr(c, r)
          Next c
       Next r

...
Đoạn này hình như là kg cần for next mà.
Gán thẳng vào.
PHP:
Cells(4,1).resize(UBound(arr, 2),UBound(arr, 1))=Arr
 
Tốc độ trên rec sẽ cao hơn Arr anh Việt à, cũng dữ liệu trên anh thử so sánh như sau:

2./ Arr

Mã:
Private Sub cmdExByGetRow_Click()
    Dim iNumCols, i As Integer
    Dim lsSQL As String
    Dim lrs As New ADODB.Recordset
    Dim arr, r, c
       lsSQL = "SELECT * FROM [Dulieu$] where [ORDER] like '" & cbOrder.Text & "' order by id"
       lrs.Open lsSQL, cnn, 1, 3
       
       arr = lrs.GetRows(-1, 1)
       
       For c = LBound(arr, 1) To UBound(arr, 1)
          Cells(3, c + 1).Value = lrs.Fields(c).Name
       Next

       For r = LBound(arr, 2) To UBound(arr, 2)
          For c = LBound(arr, 1) To UBound(arr, 1)
             Cells(r + 4, c + 1).Value = arr(c, r)
          Next c
       Next r

End Sub
Làm vầy đâu phải là Array đâu trời ---> Có đụng tới CELLS thì xem như... THUA
 
Em đang mong Thầy và các anh chị hướng dẫn để học hỏi thêm. Theo Thầy thì nên chỉnh lại như thế nào cho nó tối ưu.
Thì như ThuNghi làm ở trên đó, 1 khi bạn đã có Array thì cứ việc gán toàn bộ Array này xuống vùng dữ liệu mà không cần bất cứ vòng lập nào!
Code ở trên vì phải "xoay 90 độ" cho Array nên nếu cần 1 vòng lập thì ta sẽ chạy For.. Next gán các giá trị từ Array1 nguồn sang Array2, xong việc sẽ gán Array2 xuống Range (chứ đừng gán từng phần tử của Array vào từng cell như thế)
 
Lần chỉnh sửa cuối:
Thì như ThuNghi làm ở trên đó, 1 khi bạn đã có Array thì cứ việc gán toàn bộ Array này xuống vùng dữ liệu mà không cần bất cứ vòng lập nào!
Code ở trên vì phải "xoay 90 độ" cho Array nên nếu cần 1 vòng lập thì ta sẽ chạy For.. Next gán các giá trị từ Array1 nguồn sang Array2, xong việc sẽ gán Array2 xuống Range (chứ đừng gán từng phần tử của Array vào từng cell như thế)
Cho em hỏi thêm là 2 cách trên cách nào tối ưu hơn, ưu và khuyết của từng cách ?
 
Cho em hỏi thêm là 2 cách trên cách nào tối ưu hơn, ưu và khuyết của từng cách ?
Để công bằng khi so sánh 2 phương pháp, ta clear dữ liệu khi form load nhé:
Mã:
Private Sub UserForm_Initialize()
  Moketnoi
  On Error Resume Next
  FillcbOrder
  Dim rs As New ADODB.Recordset
  Set rs = Nothing
  rs.Open "Select * from [Dulieu$] order by id", cnn, 1, 3
  Set msgInfo.DataSource = rs
  [COLOR=#ff0000][B]Sheet1.UsedRange.Clear[/B][/COLOR]
End Sub
Code của bạn ta đặt thêm bộ đếm thời gian:
PHP:
Private Sub cmdExcel_Click()
  On Error GoTo ErrHandle
  Dim iNumCols, i As Integer, TG As Double
  Dim lsSQL As String
  Dim lrs As New ADODB.Recordset
  TG = Timer
  lsSQL = "SELECT * FROM [Dulieu$] where [ORDER] like '" & cbOrder.Text & "' order by id"
  lrs.Open lsSQL, cnn, 1, 3
  If lrs.EOF Then
    MsgBox "Could not find your data, Please try again", vbCritical
  Else
    Cells.ClearContents
    iNumCols = lrs.Fields.Count
    For i = 1 To iNumCols
      With Sheet1
        .Cells(3, i).Value = lrs.Fields(i - 1).Name
        .Cells(3, i).Font.Bold = True
        .Cells(3, i).Font.ColorIndex = 5
        .Cells(3, i).Interior.ColorIndex = 34
      End With
    Next
    Range("A4").CopyFromRecordset lrs
    MsgBox Format(Timer - TG, "0.000000")
  End If
  Set lrs = Nothing: Exit Sub
ErrHandle:
    MsgBox Err.Description
End Sub
Trên UserForm, tạo thêm 1 nút, đặt tên là cmdExcel2, chèn code dùng Array vào:
PHP:
Private Sub cmdExcel2_Click()
  Dim lsSQL As String, TG As Double
  Dim lrs As New ADODB.Recordset
  Dim sArray, Arr, r As Long, c As Long
  On Error GoTo ErrHandle
  TG = Timer
  lsSQL = "SELECT * FROM [Dulieu$] where [ORDER] like '" & cbOrder.Text & "' order by id"
  lrs.Open lsSQL, cnn, 1, 3
  If lrs.EOF Then
    MsgBox "Could not find your data, Please try again", vbCritical
  Else
    sArray = lrs.GetRows(-1, 1)
    ReDim Arr(UBound(sArray, 2) + 1, UBound(sArray, 1))
    For c = LBound(sArray, 1) To UBound(sArray, 1)
      Arr(0, c) = CStr(lrs.Fields(c).Name)
    Next
    For r = LBound(sArray, 2) To UBound(sArray, 2)
      For c = LBound(sArray, 1) To UBound(sArray, 1)
        Arr(r + 1, c) = sArray(c, r)
      Next c
    Next r
    With Range("A3").Resize(UBound(Arr, 1) + 1, UBound(Arr, 2) + 1)
      .Value = Arr
      .Resize(1).Font.Bold = True
      .Resize(1).Font.ColorIndex = 5
    End With
    MsgBox Format(Timer - TG, "0.000000")
  End If
  Set lrs = Nothing: Exit Sub
ErrHandle:
    MsgBox Err.Description
End Sub
Chạy thử và so sánh xem thì biết liền chứ gì
 
Quả thật tốc độ khi sử dụng Arr rất đáng nể, tuy code có dài và khó hiểu hơn khi dùng Rec nhưng thay vào đó mình được cái tốc độ, vậy cũng đáng.
 
Lần chỉnh sửa cuối:
Quả thật tốc độ khi sử dụng Arr rất đáng nể, tuy code có dài và khó hiểu hơn khi dùng Rec nhưng thay vào đó mình được cái tốc độ, vậy cũng đáng.
Thật ra cũng không khó hiểu gì lắm
- Vòng lập đầu tiên dùng lấy tiêu đề cột là y chang như khi dùng recordset
- 2 vòng lập tiếp theo chuyển dòng thành cột, cột thành dòng từ Array 1 sang Array 2 (xoay array 90 độ)
Chỉ vậy thôi
 
Thật ra cũng không khó hiểu gì lắm
- Vòng lập đầu tiên dùng lấy tiêu đề cột là y chang như khi dùng recordset
- 2 vòng lập tiếp theo chuyển dòng thành cột, cột thành dòng từ Array 1 sang Array 2 (xoay array 90 độ)
Chỉ vậy thôi
Vậy còn đối với fill dữ liệu vào MSHFlexGrid = cách này thì như thế nào hả Thầy?
Trước kia em dùng vòng lặp để đưa dữ liệu vào MSHFlexGrid, sau này tìm đến Rec tốc độ được cải thiện đáng kể, những tưởng Rec là vô địch, hôm nay mới thấy được tốc độ khi sử dụng Arr hơn cả Rec.
Mong Thầy hướng dẫn thêm.
 
Vậy còn đối với fill dữ liệu vào MSHFlexGrid = cách này thì như thế nào hả Thầy?
Trước kia em dùng vòng lặp để đưa dữ liệu vào MSHFlexGrid, sau này tìm đến Rec tốc độ được cải thiện đáng kể, những tưởng Rec là vô địch, hôm nay mới thấy được tốc độ khi sử dụng Arr hơn cả Rec.
Mong Thầy hướng dẫn thêm.
Trước khi trả lời câu này, xin hỏi lại bạn: Vì sao lại dùng MSHFlexGrid mà không dùng SpreadSheet?
(vì tôi chưa dùng MSHFlexGrid bao giờ nên không biết nó có cho phép gán Array vào Range như Excel không?)
 
Mà sao khi lấy
PHP:
sArray = lrs.GetRows(-1, 1)
Mà lại không dùng được nhỉ.
PHP:
WorksheetFunction.Transpose(sArray)
Còn phần của Dom Private Sub FillcbOrder() sao không dùng Arr mà phải dùng EOF
PHP:
' '       cbOrder.Clear
''       Do Until lrs.EOF
''       cbOrder.AddItem lrs![Order]
''       lrs.MoveNext
''       Loop
Dùng thế này thấy OK.
PHP:
sArray = lrs.GetRows
    With cbOrder
      .List = WorksheetFunction.Transpose(sArray)
    End With
    Erase sArray
 
Mà sao khi lấy
PHP:
sArray = lrs.GetRows(-1, 1)
Mà lại không dùng được nhỉ.
PHP:
WorksheetFunction.Transpose(sArray)
Theo kinh nghiệm của tôi thì dùng Transpose không chắc ăn đâu, sẽ bị lỗi khi dữ liệu nhiều (nhiều bao nhiêu sẽ bị lỗi thì tôi không biết nhưng chắc chắn là sẽ có lỗi)
Vì thế, thà rằng cứ For... Next trên Array để xoay dữ liệu sang Array khác
 
Mà sao khi lấy
PHP:
sArray = lrs.GetRows(-1, 1)
Mà lại không dùng được nhỉ.
PHP:
WorksheetFunction.Transpose(sArray)
Còn phần của Dom Private Sub FillcbOrder() sao không dùng Arr mà phải dùng EOF
PHP:
' '       cbOrder.Clear
 ''       Do Until lrs.EOF
 ''       cbOrder.AddItem lrs![Order]
 ''       lrs.MoveNext
 ''       Loop
Dùng thế này thấy OK.
PHP:
sArray = lrs.GetRows
     With cbOrder
       .List = WorksheetFunction.Transpose(sArray)
     End With
     Erase sArray

Em dùng vòng lặp cho trường hợp này chắc ăn hơn vì có thể dùng code này cho Access, VB mà không cần tham chiếu đến Excel.

Trước khi trả lời câu này, xin hỏi lại bạn: Vì sao lại dùng MSHFlexGrid mà không dùng SpreadSheet?
(vì tôi chưa dùng MSHFlexGrid bao giờ nên không biết nó có cho phép gán Array vào Range như Excel không?)
Em dùng MSHFlexGrid với lí do là nó đẹp, khi ta trộn cell thì cái dòng trộn đó nó sẽ luôn hiển thị và nằm giữa khoảng cách giữa trên và dưới của MSHFlexGrid cho dù số dòng chứa các dòng đó nhiều hơn số dòng MSHFlexGrid được hiển thị.
 
Em dùng MSHFlexGrid với lí do là nó đẹp, khi ta trộn cell thì cái dòng trộn đó nó sẽ luôn hiển thị và nằm giữa khoảng cách giữa trên và dưới của MSHFlexGrid cho dù số dòng chứa các dòng đó nhiều hơn số dòng MSHFlexGrid được hiển thị.
Vụ này nghe lạ à nha! Cho tôi 1 file có cái thằng MSHFlexGrid này được không (máy tôi chẳng có)
(Ý tôi muốn nhìn xem cái vụ hiển thị khi trộn cell như bạn vừa nói ấy)
 
Vụ này nghe lạ à nha! Cho tôi 1 file có cái thằng MSHFlexGrid này được không (máy tôi chẳng có)
(Ý tôi muốn nhìn xem cái vụ hiển thị khi trộn cell như bạn vừa nói ấy)
Bài #1 em có cái MSHFlexGrid rồi Thầy thêm đoạn sau là trộn được.

Mã:
Private Sub cmdFillList_Click()
On Error GoTo ErrHandle
    Dim i As Integer
    Dim lsSQL As String
    Dim lrs As New ADODB.Recordset
       lsSQL = "SELECT * FROM [Dulieu$] where [ORDER] like '" & cbOrder.Text & "' order by id"
       lrs.Open lsSQL, cnn, 1, 3
    If lrs.EOF Then
      MsgBox "Could not find your data, Please try again", vbCritical
      Set msgInfo.DataSource = lrs
    Else
        
    Set msgInfo.DataSource = lrs
    
[B][COLOR=#0000ff]       With msgInfo
        For i = 2 To 5
            .MergeCol(i) = True
            .Col = i
            .Row = .FixedRows
            .RowSel = .Rows - 1
            .FillStyle = flexFillRepeat
            .CellBackColor = &HC0FFFF
        Next

      End With
[/COLOR][/B]
    
    
    End If
    Set lrs = Nothing
    Exit Sub
ErrHandle:
    MsgBox Err.Description

End Sub

Lưu ý phải chọn thuộc tính MergeCells của nó là 1
 
Còn đây là hình ảnh của nó.

[video=youtube;9LRy2TpbA1U]http://www.youtube.com/watch?v=9LRy2TpbA1U[/video]
 
Trời! Gì kỳ vậy ta? File của bạn tôi mở trên máy tôi chẳng hình thấy thằng MSHFlexGrid nào cả (chỉ có 2 CommandButton, 1 ComboBox và 1 Label... Hết)
Có thể máy Thầy không có cái MSHFlexGrid, các bạn khác giúp mình kiểm tra xem nhé.
 
Có thể máy Thầy không có cái MSHFlexGrid, các bạn khác giúp mình kiểm tra xem nhé.
Cũng dữ liệu trên ta truy vấn lọc dữ liệu theo ngày = DTPicker, các bạn thử nhé.
Sao chưa thấy ai tham gia hết vậy ta. Có lẽ cái này thường và dể quá nên mọi người không quan tâm đến.
Thôi thì nhờ BQT Box này đóng topic này lại.
 
Sao chưa thấy ai tham gia hết vậy ta. Có lẽ cái này thường và dể quá nên mọi người không quan tâm đến.
Thôi thì nhờ BQT Box này đóng topic này lại.
Không phải đâu từ hổm nay em tìm trên mạng mà cũng không biết nữa máy em cũng đâu có cái MSHFlexGrid đâu hiện lên chỉ có máy cái nút thôi, không biết máy anh làm sao có cái đó nữa, tiếp tục đi em rất thích cái này. Thanks
 
Mình cũng bị lỗi như mhung, xem trang của anh Duyệt thì cũng thua, toàn tiếng Anh mà phức tạp nữa. Dom giúp cho cụ thể hơn giúp.
Xong phần này mới tiếp chớ, chưa gì đòi đóng topic rồi.

Trước hết anh tải Download the cumulative update rollup for the Visual Basic 6.0 Service Pack 6 Runtime Extended Files package now. rồi cài đặt vào máy, khởi động lại máy, tìm những file có cái đuôi ".exd" xóa hết, khởi động máy lại 1 lần nữa. rồi anh thử nhé.
 
Mình cũng bị lỗi như mhung, xem trang của anh Duyệt thì cũng thua, toàn tiếng Anh mà phức tạp nữa. Dom giúp cho cụ thể hơn giúp.
Xong phần này mới tiếp chớ, chưa gì đòi đóng topic rồi.
Cái vấn đề của MsFlexgrid hơi phức tạp như tôi đã làm ở thread #8 thì mới giải quyết được. Không biết có cách giải quyết nào khác không?
Nếu vậy thì domfootwear thử cái này xem sao. Đây là ocx nhẹ và rất hay dùng trong VBA ngon lành. (Cái thằng grid của ComponentOne không hổ trợ VBA)
Tài liệu thì em xem tại đây: http://www.10tec.com/Products/ActiveX/iGrid/
Xin đừng public cái này. Tôi sẽ xóa tập tin sau 2 ngày.

Lê Văn Duyệt
 
Cái vấn đề của MsFlexgrid hơi phức tạp như tôi đã làm ở thread #8 thì mới giải quyết được. Không biết có cách giải quyết nào khác không?
Nếu vậy thì domfootwear thử cái này xem sao. Đây là ocx nhẹ và rất hay dùng trong VBA ngon lành. (Cái thằng grid của ComponentOne không hổ trợ VBA)
Tài liệu thì em xem tại đây: http://www.10tec.com/Products/ActiveX/iGrid/
Xin đừng public cái này. Tôi sẽ xóa tập tin sau 2 ngày.

Lê Văn Duyệt
Sao em cài bị báo lỗi phải cần có VB 6.0 mới cái được, vậy là nó không hỗ trợ VBA phải không anh
loi.jpg
 
Sao em cài bị báo lỗi phải cần có VB 6.0 mới cái được, vậy là nó không hỗ trợ VBA phải không anh
View attachment 66617
Chỉ cần đăng ký cái ocx trong đó mà thôi.
Các bước thực hiện:
_ Copy tập tin iGrid470_10Tec.ocx vào thư mục C:\Windows\System32\ hoặc bất kỳ thư mục nào bạn muốn.
_ Đăng ký ocx này bằng cách, bấm tổ hợp phím: Window + R
Nhập vào regsvr32 "C:\Windows\System32\iGrid470_10Tec.ocx" Sau đó nhấn Enter để đăng ký ocx này với hệ thống.
_ Muốn sử dụng vào VBE, Add control như thông thường.

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Chỉ cần đăng ký cái ocx trong đó mà thôi.
Các bước thực hiện:
_ Copy tập tin iGrid470_10Tec.ocx vào thư mục C:\Windows\System32\ hoặc bất kỳ thư mục nào bạn muốn.
_ Đăng ký ocx này bằng cách, bấm tổ hợp phím: Window + R
Nhập vào segsvr32 "C:\Windows\System32\iGrid470_10Tec.ocx"
Sau đó nhấn Enter để đăng ký ocx này với hệ thống.
_ Muốn sử dụng vào VBE, Add control như thông thường.

Lê Văn Duyệt
Regsvr32 thay vì segsvr32
 
Vẫn không được vậy anh mặc dù đã đăng ký thành công, không hiểu
thanhcong.jpg
baoloi.jpg
baoloi2.jpg
 
To: mnhung49,
Sao kỳ vậy nhỉ. Domfootwear, bác ThuNghi có bị không? Dùng cái iGrid này đã lắm. Download các ví dụ trên trang của 10 Tech.

Lê Văn Duyệt
 
Vẫn không được vậy anh mặc dù đã đăng ký thành công, không hiểu
Với file của Dom, tôi nghĩ vấn đề không những là MSHFlexGrid mà còn liên quan đến Microsoft ActiveX Data Object Library
Thử vào Tools\References xem có cái nào MISSING.. nữa không?
 
Em mò tìm hoài mà không ra, anh Ndu tìm ra được chưa vậy?
Tôi cũng chưa làm được vì không có cái control MSHFlexGrid
Néu có thể được, Dom vui lòng thiết kế giùm 1 UserForm chỉ có 1 control MSHFlexGrid rồi gữi lên đây để tôi thí nghiệm xem
 
Tôi cũng chưa làm được vì không có cái control MSHFlexGrid
Néu có thể được, Dom vui lòng thiết kế giùm 1 UserForm chỉ có 1 control MSHFlexGrid rồi gữi lên đây để tôi thí nghiệm xem

Em gửi cái MSHFlexGrid trên Userform, Thầy thí nghiệm giúp.
 

File đính kèm

Em gửi cái MSHFlexGrid trên Userform, Thầy thí nghiệm giúp.
Ôi thôi rồi ---> Đúng là thằng này bị lỗi. Mở file, bấm Alt + F11 thì nhận ngay thông báo này:

untitled.JPG

Chẳng biết làm cái gì nữa (Trong References chẳng thấy em nào MISSING.. cả)
Xin nói thêm: Nếu tôi thay MSHFlexGrid bằng vsFlexArray thì hết lỗi, code chạy bình thường, có điều chẳng có thứ gì được nạp vào vsFlexArray cả
 
Ôi thôi rồi ---> Đúng là thằng này bị lỗi. Mở file, bấm Alt + F11 thì nhận ngay thông báo này:

View attachment 66791

Chẳng biết làm cái gì nữa (Trong References chẳng thấy em nào MISSING.. cả)
Xin nói thêm: Nếu tôi thay MSHFlexGrid bằng vsFlexArray thì hết lỗi, code chạy bình thường, có điều chẳng có thứ gì được nạp vào vsFlexArray cả
Thầy thử cách của anh Duyệt ở bài sau thử hết lỗi không
http://www.giaiphapexcel.com/forum/...o-các-control-ở-Userform.&p=326373#post326373
 
Để tôi gữi file dùng vsFlexArray lên, Dom xem có thể điều khiển được không nha
 

File đính kèm

Để tôi gữi file dùng vsFlexArray lên, Dom xem có thể điều khiển được không nha
Nó đòi em phải đăng ký và trả tiền, em chưa sử dụng cái này nên chưa biết cách đưa dữ liệu vào, chắc phải dùng vòng lặp ?
Máy Thầy có sử dụng được thằng DataGrid không ?
 
Nó đòi em phải đăng ký và trả tiền, em chưa sử dụng cái này nên chưa biết cách đưa dữ liệu vào, chắc phải dùng vòng lặp ?
Máy Thầy có sử dụng được thằng DataGrid không ?
Hổng có trả tiền gì đâu! Nó hiện thông báo, cứ bấm OK là được rồi. Có điều mấy cái Grid này tôi chưa dùng bao giờ nên chẳng rành lắm
 
Ah... hôm trước đọc không kỹ, giờ áp dụng theo bài số #27 đã thành công
Cảm ơn Dom nhiều.. Mọi thứ đều chạy ngon lành (chỉ phải chỉnh lại tí về version của Microsoft ActiveX Data Objects mà thôi)
 
Ah... hôm trước đọc không kỹ, giờ áp dụng theo bài số #27 đã thành công
Cảm ơn Dom nhiều.. Mọi thứ đều chạy ngon lành (chỉ phải chỉnh lại tí về version của Microsoft ActiveX Data Objects mà thôi)
Anh ThuNghi Nmhung49 và các bạn đã khắc phục được giống như Thầy Tuấn chưa ?
 
Khi em cài vô thì nó bảo phải cài VB6 mới được không hiểu luôn, nếu vậy học chay luôn cũng được, anh Dom cứ tiếp đi
Bạn đang học VBA, tôi khuyên bạn nên cài VB6 và nghiên cứu nó đi ---> VB6 và VBA gần như giống nhau về cú pháp (chỉ khác nhau về các đối tượng mà thôi)
Tôi chẳng được học VB6 ngày nào nhưng từ ngày học VBA, tự nhiên cũng biết luôn VB6 đấy
 
Bạn đang học VBA, tôi khuyên bạn nên cài VB6 và nghiên cứu nó đi ---> VB6 và VBA gần như giống nhau về cú pháp (chỉ khác nhau về các đối tượng mà thôi)
Tôi chẳng được học VB6 ngày nào nhưng từ ngày học VBA, tự nhiên cũng biết luôn VB6 đấy
Để em về máy nhà em cài vô, chứ hiện giờ đang ở cty mà bước từng bước 1 cho nó chắc em cũng đang cố gắng học từ các anh chị nè. Thanks
 
Để em về máy nhà em cài vô, chứ hiện giờ đang ở cty mà bước từng bước 1 cho nó chắc em cũng đang cố gắng học từ các anh chị nè. Thanks
Bạn cứ cài đi rồi nghiên cứu nhé
Tôi tặng bạn file Thu thuat VB6 bằng tiếng Việt (của www.caulacbovb.com). Thú vị lắm đấy!
(Ngoài ra còn 1 số tài liệu khác, lúc nào thích thì tôi gữi tiếp)
 

File đính kèm

Anh ThuNghi Nmhung49 và các bạn đã khắc phục được giống như Thầy Tuấn chưa ?
Down về VB6 nhưng cài nó báo lỗi tùm lum, chưa có time để kiểm tra win bị gì.
Bữa nào cài VB6 xong sẽ nghiên cứu tiếp, thấy nghề "code" này cũng lắm công phu.
 
VB6 mà dung lượng chỉ có 134 MB thì e rằng thiếu phần Help (MSDN Library). Mà cái này mới là thứ mà dân lập trình cần nhất.
Thôi thì ra tiệm mua cái đĩa VB6 Full cho nó chắc (dung lượng chắc phải cở 1GB)

a xài VB.NET đi 1 DVD , cùng công mua - nghe nói nó mạnh hơn
 
a xài VB.NET đi 1 DVD , cùng công mua - nghe nói nó mạnh hơn
Xin lỗi! Vì tôi là dân không chuyên nghiệp. VBA và VB6 xài còn chưa xong thì khỏi cần nghĩ đến mấy thứ cao cấp khác làm gì cho mệt
Quan điểm của tôi: Giải thuật quan trọng hơn công cụ
 
Để công bằng khi so sánh 2 phương pháp, ta clear dữ liệu khi form load nhé:
Code:
Private Sub UserForm_Initialize()
Moketnoi
On Error Resume Next
FillcbOrder
Dim rs As New ADODB.Recordset
Set rs = Nothing
rs.Open "Select * from [Dulieu$] order by id", cnn, 1, 3
Set msgInfo.DataSource = rs
Sheet1.UsedRange.Clear
End Sub

Code của bạn ta đặt thêm bộ đếm thời gian:
PHP Code:....
=> Bạn ơi làm theo cai Range("A4").CopyFromRecordset lrs thi dc nhung theo minh no bị hạn chế về dung lượng ram minh làm thử một bảng có 247 trường thì nó chỉ load được 100 bản ghỉ thôi load nhiều hơn thì nó lại bị lỗi . Có cách nào khắc phục được không ?


 

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

Back
Top Bottom