Bài tập về ADO căn bản. (1 người xem)

Liên hệ QC

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

Như bác batman1 nói tập tin có định dạng UTF-8 (từ web) nên bạn Mạnh chỉ có thể dùng ADODB. Stream để đọc và ghi nó được thôi. ADODB Stream có thể đọc tên file có dấu chấm than (!) luôn nhé.
Ví dụ:
Mã:
sFilePath = ThisWorkbook.Path & "\SIM BANKING!.CSV"
Dim oStream As Object
   Set oStream = CreateObject("ADODB.Stream")
   With oStream
        .Open
        .Type = 1  ' adTypeBinary
        .LoadFromFile sFilePath
        .Type = 2  ' adTypeText
        .Charset = "utf-8"
        strText = .ReadText(-1)  ' adReadAll
    End With
    ...
    'Code đưa strText vào Sheet'
mạnh mới thử code này trên Google thấy chạy Ok
Mã:
Sub GetCSV()
    Dim strText As String, intRow
    Dim file As String, strLine
    file = "E:\Downloads\VBA_ADO_CSV\SIM BANKING!.csv"
    With CreateObject("ADODB.Stream")
         .Open
         .Type = 1                  ' Private Const adTypeBinary = 1
         .LoadFromFile file
         .Type = 2                  ' Private Const adTypeText = 2
         .Charset = "utf-8"
         strText = .ReadText(-1)    ' Private Const adReadAll = -1
     End With
    intRow = 1
    Cells.Clear
    For Each strLine In Split(strText, Chr(10))
        If strLine <> "" Then
            With Sheet1
                .Cells(intRow, 1) = strLine
                .Cells(intRow, 1).TextToColumns Destination:=Cells(intRow, 1), DataType:=xlDelimited, _
                    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
                    Semicolon:=False, Comma:=True, Space:=False, Other:=False
            End With
            intRow = intRow + 1
        End If
    Next strLine
End Sub
Tuy nhiên mạnh muốn tách cái khúc For Each đó thành một cái hàm riêng và chạy trên Mảng mà chưa hiểu lắm .... nếu Bạn Or thành viên nào biết chỉ dùm !!??? :p:p
 
Mò diết cuối cùng cũng xong .... rồi ngộ ra 1 vài điều hay ... Nếu ngồi đó ko Mò thì sẻ không bao giờ thấy cái hay và thú vị của nó :p :p
Quả thực ko leo núi mà cứ keo núi cao thì đó là 1 cái chi chi đó -0-0-0-===\.
Cảm ơn Các Bạn !OK.gif
 
1. Hàm GetRows() của RecordSet lấy dữ liệu vào mảng. Nếu không có tham số thì nó đổ cả RecordSet vào 1 mảng 2 chiều. Từ đó, mò đến dòng cuối cùng của mảng.
2. Hàm MoveLast đi đến dòng cuối của RecordSet. Hàm GetRows(1, 0) đọc dòng này
Thực ra thì GetRows(1, 2) cũng đọc được dòng cuối của RecordSet mà không cần MoveLast.
Anh ơi, có một nhược điểm là dòng database đang là ngang, khi đổ dữ liệu xuống sheeet lại thành dọc. Em dùng Application.WorksheetFunction.Transpose thì báo lỗi ạ. Có cách nào đổ dữ liệu xuống sheet đúng dạng ngang như Database không ạ. Em cảm ơn
 
Hàm transpose của Excel có rất nhiều giới hạn, chỉ có thể dùng trong các CSDL nhỏ.
Tôi nhớ không lầm thì Recordset vốn lấy từ DAO, công cụ cũ của Access. Nên nhớ rằng kỹ thuật CSDL LH (relational database) không hẳn phù hợp với cấu trúc chuyên về bộ nhớ và tốc độ của Array.
Muón đổ xuống. tôi nghĩ là bạn nên tìm cách chuyển dữ liệu từ Recordset sang Array.
 
Hàm transpose của Excel có rất nhiều giới hạn, chỉ có thể dùng trong các CSDL nhỏ.
Tôi nhớ không lầm thì Recordset vốn lấy từ DAO, công cụ cũ của Access. Nên nhớ rằng kỹ thuật CSDL LH (relational database) không hẳn phù hợp với cấu trúc chuyên về bộ nhớ và tốc độ của Array.
Muón đổ xuống. tôi nghĩ là bạn nên tìm cách chuyển dữ liệu từ Recordset sang Array.
Vâng, em hiểu rồi. Vẫn cần phải có mảng trung gian để chuyển đổi. Em cảm ơn ạ
 
1/ duyệt từng Recordset tới đâu tính toán tới đó sẻ rất nhanh hơn mục số 2
2/ lấy vào Arr = Rs.GetRows xong chạy 2 vòng For rất chậm
 
Anh ơi, có một nhược điểm là dòng database đang là ngang, khi đổ dữ liệu xuống sheeet lại thành dọc. Em dùng Application.WorksheetFunction.Transpose thì báo lỗi ạ. Có cách nào đổ dữ liệu xuống sheet đúng dạng ngang như Database không ạ. Em cảm ơn
bạn có thể sử dụng hàm này
Mã:
Function TransposeArray2D(arr2D As Variant) As Variant
Dim X As Long, Y As Long
Dim arrTemp As Variant
    ReDim arrTemp(LBound(arr2D, 2) To UBound(arr2D, 2) - LBound(arr2D, 2) + 1, LBound(arr2D, 1) To UBound(arr2D, 1) - LBound(arr2D, 1) + 1)
    For X = LBound(arr2D, 2) To UBound(arr2D, 2)
        For Y = LBound(arr2D, 1) To UBound(arr2D, 1)
            arrTemp(X, Y) = arr2D(Y, X)
        Next Y
    Next X
    TransposeArray2D = arrTemp
End Function
để chuyển dữ liệu lấy bằng ADO về đúng như dạng gốc trong Database: TransposeArray2D(objRecordSet.GetRows)
 
Lần chỉnh sửa cuối:
bạn có thể sử dụng hàm này
Mã:
Function TransposeArray2D(arr2D As Variant) As Variant
Dim X As Long, Y As Long
Dim arrTemp As Variant
    ReDim arrTemp(UBound(arr2D, 2), UBound(arr2D, 1))
    For X = LBound(arr2D, 2) To UBound(arr2D, 2)
        For Y = LBound(arr2D, 1) To UBound(arr2D, 1)
            arrTemp(X, Y) = arr2D(Y, X)
        Next Y
    Next X
    TransposeArray2D = arrTemp
End Function
để chuyển dữ liệu lấy bằng ADO về đúng như dạng gốc trong Database: TransposeArray2D(objRecordSet.GetRows)
Bạn hãy thử kiểu nhà quê vầy xem sao nha
dùng hàm của Bạn Copy từ vùng màu xanh gán sang vùng màu vàng .... Xong làm ngược lại Copy vùng màu vàng gán qua màu xanh xem sao ???
nếu dữ liệu nằm trong Vùng vừa khít trong vùng vừa gán đó thì nên xài hàm đó ... còn nếu nó xóa mất cái chữ kk thì nên Viết lại cho đúng he

1600307912685.png

Thông cảm mình ko có được học hành code két bài vở nên toàn chơi kiểu nhà quê vậy :p
 
Bạn hãy thử kiểu nhà quê vầy xem sao nha
dùng hàm của Bạn Copy từ vùng màu xanh gán sang vùng màu vàng .... Xong làm ngược lại Copy vùng màu vàng gán qua màu xanh xem sao ???
nếu dữ liệu nằm trong Vùng vừa khít trong vùng vừa gán đó thì nên xài hàm đó ... còn nếu nó xóa mất cái chữ kk thì nên Viết lại cho đúng he

View attachment 245660

Thông cảm mình ko có được học hành code két bài vở nên toàn chơi kiểu nhà quê vậy :p
Cám ơn anh @Kiều Mạnh nhiều, nhờ anh chỉ điểm em mới phát hiện ra!
Lâu nay cái này em chỉ làm cho cái dzụ lấy dữ liệu từ ADO thôi nên không để ý về LBound đi từ 0 hay đi từ 1.
em chỉnh lại:
Mã:
Function TransposeArray2D(arr2D As Variant) As Variant
Dim X As Long, Y As Long
Dim arrTemp As Variant
    ReDim arrTemp(LBound(arr2D, 2) To UBound(arr2D, 2) - LBound(arr2D, 2) + 1, LBound(arr2D, 1) To UBound(arr2D, 1) - LBound(arr2D, 1) + 1)
    For X = LBound(arr2D, 2) To UBound(arr2D, 2)
        For Y = LBound(arr2D, 1) To UBound(arr2D, 1)
            arrTemp(X, Y) = arr2D(Y, X)
        Next Y
    Next X
    TransposeArray2D = arrTemp
End Function
Không biết còn sai sót gì không nữa... hichic
 
Lần chỉnh sửa cuối:
Còn đây là chuẩn của Bill ... không tin thử quậy là biết
Copy qua xong Copy lại xem sao ????????????????????


1600309526241.png
 
Cám ơn anh @Kiều Mạnh nhiều, nhờ anh chỉ điểm em mới phát hiện ra!
Lâu nay cái này em chỉ làm cho cái dzụ lấy dữ liệu từ ADO thôi nên không để ý về LBound đi từ 0 hay đi từ 1.
em chỉnh lại:
Mã:
Function TransposeArray2D(arr2D As Variant) As Variant
Dim X As Long, Y As Long
Dim arrTemp As Variant
    ReDim arrTemp(1 To UBound(arr2D, 2) - LBound(arr2D, 2) + 1, 1 To UBound(arr2D, 1) - LBound(arr2D, 1) + 1)
    For X = LBound(arr2D, 2) To UBound(arr2D, 2)
        For Y = LBound(arr2D, 1) To UBound(arr2D, 1)
            arrTemp(X, Y) = arr2D(Y, X)
        Next Y
    Next X
    TransposeArray2D = arrTemp
End Function
Không biết còn sai sót gì không nữa... hichic
Trên GPE này họ ít khi để ý mấy thứ vặt vảnh đó nên hầu như sai tè le ra hình như có cái hàm của Anh có chữ cái là n là chính xác
Tuy nhiên cách chạy 2 vòng For và Viết thành Function đó chạy hơi chậm ... thử viết lại thành Sub xem tình hình sao ???
 
Em chưa hiểu ý anh lắm ạ,
1/ Viết thành Function bạn làm xong rồi
2/ Thử viết thành Sub xem sao như hàm đó nhưng truyền Tham số vào
VD Như sau:
Mã:
Private Sub Transpose_Array(ByRef InputArr() As Variant, ByRef ReturnArray() As Variant)
3/ xong thử cột sang dòng và ngược lại
4/ Thử chuyển cái Array khoãng trên 1 triệu dòng xem sao ( Lưu ý không tràn số cột của Excel Or dòng ... nếu quá là lỗi code )
5/ đo tốc độ chạy code xem sao ????

Cao cấp chút nè
1/ dùng hàm API của Bill CopyMemory cái Array ban đầu vào bộ nhớ RAM
2/ xong chuyển Array lấy nó ra gán lại Sheet

2 mục trên đó khoãng gần 10 năm trước đã có chiến sự trên GPE rồi mà các thành viên đó hàng ngày vẫn cứ lang thang đâu đó
nếu thích vào đó đào lại xem tình hình sao ?????????????????!!!!!!!!!!!!!!!!!!!!!!!!!
 
InputArr thì ByVal chứ anh.

Vụ này nói rồi mà anh. Kích thước Array không liên quan gì kích thước bảng tính. :)
cái tô đậm đó biết mà .... nhưng khi chuyển mảng nó tràn số dòng gán xuống Sheet thì sao đây ???!!!
VD: Excel 2010 to 2019 có 1048576 dòng mà cái Array đó có tỷ tỷ dòng thì sao ??? ===> lỗi chứ còn gì ???
 
cái tô đậm đó biết mà .... nhưng khi chuyển mảng nó tràn số dòng gán xuống Sheet thì sao đây ???!!!
VD: Excel 2010 to 2019 có 1048576 dòng mà cái Array đó có tỷ tỷ dòng thì sao ??? ===> lỗi chứ còn gì ???
Híc. Anh lại máy móc rồi. Anh chưa gặp bài chuyển thành nhiều cột, hết cột chuyển tiếp sang sheet(s) khác...
 
Híc. Anh lại máy móc rồi. Anh chưa gặp bài chuyển thành nhiều cột, hết cột chuyển tiếp sang sheet(s) khác...
thì đó là sự thật mà Nếu cái Array gán xuống Sheet mà lớn hơn số dòng Or cột của Excel hiện có thì lỗi chắc luôn chứ gì ???!!!
Còn kích thước của Array phụ thuộc vào RAM To hay Nhỏ trên GPE nay nói rồi ( ko nói lại nữa )
 
thì đó là sự thật mà Nếu cái Array gán xuống Sheet mà lớn hơn số dòng Or cột của Excel hiện có thì lỗi chắc luôn chứ gì ???!!!
Có lỗi gì đâu anh. Khi Range < kích thước Array thì Range có bao nhiêu cells nhận bấy nhiêu phần tử từ Array thôi.

PHP:
Option Explicit

Sub vidu()
    Const nums = 2000000
    Dim a As Variant, i As Long
    ReDim a(1 To nums, 1 To 1)
    For i = 1 To nums
        a(i, 1) = i
    Next i
    Sheet1.Range("A1:A1048576").Value = a
End Sub
 
Có lỗi gì đâu anh. Khi Range < kích thước Array thì Range có bao nhiêu cells nhận bấy nhiêu phần tử từ Array thôi.

PHP:
Option Explicit

Sub vidu()
    Const nums = 2000000
    Dim a As Variant, i As Long
    ReDim a(1 To nums, 1 To 1)
    For i = 1 To nums
        a(i, 1) = i
    Next i
    Sheet1.Range("A1:A1048576").Value = a
End Sub
Biết mà ............ Nhưng VD họ lấy cái Array đó từ Sever về có số dòng lớn hơn số dòng hiện có của bảng tính thì sao đây ... hay TableName Access
ý Mạnh nói cái đó đấy ... hay lấy nguyên cột = 1048576 xong chuyển gán qua dòng là thấy vì số dòng lớn hơn số cột mà
 
Biết mà ............ Nhưng VD họ lấy cái Array đó từ Sever về có số dòng lớn hơn số dòng hiện có của bảng tính thì sao đây ... hay TableName Access
ý Mạnh nói cái đó đấy ... hay lấy nguyên cột = 1048576 xong chuyển gán qua dòng là thấy vì số cột lớn hơn số dòng mà
Ở trên em nói rồi đó anh.
Tức là nếu xác định, hoặc nghi ngờ từ đầu, kết quả trả về lớn hơn kích thước chứa kết quả đó thì mình chia nhỏ ra ngay lúc xử lý (có thể tách luôn thành nhiều cột, hoặc tách thành nhiều mảng)..

1600316389541.png
 
thì đó là sự thật mà Nếu cái Array gán xuống Sheet mà lớn hơn số dòng Or cột của Excel hiện có thì lỗi chắc luôn chứ gì ???!!!
Còn kích thước của Array phụ thuộc vào RAM To hay Nhỏ trên GPE nay nói rồi ( ko nói lại nữa )
Khi gán xuống sheet cần tính lại số dòng dòng và số cột như
sRowMax= 1048576 'co the nho hon
sRow=ubound(Arr,1)
if sRow> sRowMax then sRow=sRowMax
Có lỗi gì đâu anh. Khi Range < kích thước Array thì Range có bao nhiêu cells nhận bấy nhiêu phần tử từ Array thôi.

PHP:
Option Explicit

Sub vidu()
    Const nums = 2000000
    Dim a As Variant, i As Long
    ReDim a(1 To nums, 1 To 1)
    For i = 1 To nums
        a(i, 1) = i
    Next i
    Sheet1.Range("A1:A1048576").Value = a
End Sub
Const nums < 1048576 bị lỗi các dòng cuối
 
đó nha ... tới bài 519 chắc quá hiều ròi he
1600316699935.png
 
Const nums < 1048576 bị lỗi các dòng cuối
Nhỏ hơn thì lại tốt quá rồi anh. :)

Ở bài Array em có nêu mấy ví dụ rồi. Ghi Array xuống Range có 3 trường hợp: Kích thước Range < = > Array


1600316843027.png

---------------- Toàn dính gộp bài - bực thật -------------------------


đó nha ... tới bài 519 chắc quá hiều ròi he
Chịu thua anh. Đó là KÍCH THƯỚC bảng tính MS Excel.
 
vậy là xong cái lỗi đó he

Ta chuyển qua nghiên cứu cái ý sau của bài 513 xem tình hình sao ... gần 10 năm trước họ vui rồi giờ mình vẻ lại xem sao ???!!!

1600317262496.png
 
Biết mà ............ Nhưng VD họ lấy cái Array đó từ Sever về có số dòng lớn hơn số dòng hiện có của bảng tính thì sao đây ... hay TableName Access
ý Mạnh nói cái đó đấy ... hay lấy nguyên cột = 1048576 xong chuyển gán qua dòng là thấy vì số dòng lớn hơn số cột mà
Nếu không có gì đặc biệt và phải bắt buộc xử lý qua mảng thì tôi chọn cách dễ dàng và đơn giản nhất đó là CopyFromRecordset
 
Có thể dùng CreateObject thay Cho API chuyển 1 mảng mà ko phải chạy 2 dòng For đấy
Còn thuần ADO thì Mạnh tịt

Mã:
CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")
 
Có thể dùng CreateObject thay Cho API chuyển 1 mảng mà ko phải chạy 2 dòng For đấy
Còn thuần ADO thì Mạnh tịt

Mã:
CreateObject("New:{8BD21D20-EC42-11CE-9E0D-00AA006002F3}")
Đó là cách "Ăn gian" cũng qua giai đoạn trung gian là đưa cái mảng sau khi lấy được vào listbox rồi từ đó lấy ra từ cái list của nó. Tuy nhiên nó chưa chắc nhanh bằng tôi lấy dữ liệu như bài #525. Với dữ liệu hơn 2,000,000 dòng tôi lấy và ghi xuống sheet cũng không lâu lắm, nhưng với cách trên thì với 1,000,000 dòng mà nó ngẩn tò te.
 
Mọi ng cho mình hỏi, mình kết nối excel để lấy dữ liệu từ access bằng ADO, nhưng khi dữ liệu tên field bên access có khoảng trống (ví dụ: thay vì "outputcase" thì tên là "Output Case") thì code bị lỗi.
Xin mọi người giúp đỡ giùm.

access.jpeg

Mã:
Sub FromAccess2(DBFullName As String, TargetRange As Range)

   Dim i, j, Cco

   Dim cn As ADODB.Connection, Rs As ADODB.Recordset, intColIndex As Integer

   Set TargetRange = TargetRange.Cells(1, 1)

   Set cn = New ADODB.Connection

   cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & DBFullName & ";"

   Set Rs = New ADODB.Recordset

   Dim Luc, Moment As Double



    With Rs

        .Open "SELECT [Element Forces - Beams].Output Case FROM [Element Forces - Beams]", cn, , , adCmdText      [COLOR=rgb(209, 72, 65)]'bi loi o vi tri nay[/COLOR]

        .MoveFirst

        

          i = 1

        Do

            TargetRange.Offset(i, 0).Value = .Fields(0).Value



            .MoveNext

            i = i + 1

        Loop Until .EOF

          

    End With

    Rs.Close

    Set Rs = Nothing

    cn.Close

    Set cn = Nothing

  

End Sub
 
Lần chỉnh sửa cuối:
Mọi ng cho mình hỏi, mình kết nối excel để lấy dữ liệu từ access bằng ADO, nhưng khi dữ liệu tên field bên access có khoảng trống (ví dụ: thay vì "outputcase" thì tên là "Output Case") thì code bị lỗi.
Xin mọi người giúp đỡ giùm.

View attachment 246165

Mã:
Sub FromAccess2(DBFullName As String, TargetRange As Range)

   Dim i, j, Cco

   Dim cn As ADODB.Connection, Rs As ADODB.Recordset, intColIndex As Integer

   Set TargetRange = TargetRange.Cells(1, 1)

   Set cn = New ADODB.Connection

   cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & DBFullName & ";"

   Set Rs = New ADODB.Recordset

   Dim Luc, Moment As Double



    With Rs

        .Open "SELECT [Element Forces - Beams].Output Case FROM [Element Forces - Beams]", cn, , , adCmdText      [COLOR=rgb(209, 72, 65)]'bi loi o vi tri nay[/COLOR]

        .MoveFirst

       

          i = 1

        Do

            TargetRange.Offset(i, 0).Value = .Fields(0).Value



            .MoveNext

            i = i + 1

        Loop Until .EOF

         

    End With

    Rs.Close

    Set Rs = Nothing

    cn.Close

    Set cn = Nothing

 

End Sub
Nhớ không rõ lắm hình như tên trường có khoảng trắng phải để trong ngoặc vuông thì phải.
 
Các bạn cho mình hỏi chút
thông Thường lâu nay mình xài ADO thì chủ yếu lấy dữ liệu theo 2 phương thức sau
1/ đưa dữ liệu vào Array xong tính toán ...
Mã:
Arr = Rs.GetRows()

2/ Copy nguyên Rs
Mã:
Range("A1").CopyFromRecordset Rs

3/ Mình có nghe đâu đó trên GPE này mà quên mất chỗ nào nói là duyệt từng Rs xong lấy dữ liệu nó cũng rất hay
Nói thật là có khi viết rồi mà cũng ko biết keo nó là chi ... nay muốn Ôn lại chút ... ai biết chỉ dùm mục số 3 này

Xin cảm ơn
 
Các bạn cho mình hỏi chút
thông Thường lâu nay mình xài ADO thì chủ yếu lấy dữ liệu theo 2 phương thức sau
1/ đưa dữ liệu vào Array xong tính toán ...
Mã:
Arr = Rs.GetRows()

2/ Copy nguyên Rs
Mã:
Range("A1").CopyFromRecordset Rs

3/ Mình có nghe đâu đó trên GPE này mà quên mất chỗ nào nói là duyệt từng Rs xong lấy dữ liệu nó cũng rất hay
Nói thật là có khi viết rồi mà cũng ko biết keo nó là chi ... nay muốn Ôn lại chút ... ai biết chỉ dùm mục số 3 này

Xin cảm ơn
Chào Anh,
Em đươc biết là khi cần đổ dữ liệu vào listbox thì anh cần dùng GetRows thì mới đổ dữ liệu vào listbox được (vì ngược nên cần hàm chuyển đổi cột thành hàng và hàng thành cột trước khi đổ dữ liệu vào listbox). Anh không thể đổ dữ liệu vào listbox bằng cách dùng CopyFromRecordSet.
Dùng GetRows (1,2) nếu anh muốn lấy dữ liệu cuối của Recordset vào mảng, hoặc dữ liệu đầu của RecordSet vào mảng thì GetRows (1,1). Có thể dùng MoveLast hoặc MoveFirst rồi GetRows(1,0) cho dữ liệu đầu tiên hoặc cuối cùng của RecordSet.
 
Chào Anh,
Em đươc biết là khi cần đổ dữ liệu vào listbox thì anh cần dùng GetRows thì mới đổ dữ liệu vào listbox được (vì ngược nên cần hàm chuyển đổi cột thành hàng và hàng thành cột trước khi đổ dữ liệu vào listbox). Anh không thể đổ dữ liệu vào listbox bằng cách dùng CopyFromRecordSet.
Dùng GetRows (1,2) nếu anh muốn lấy dữ liệu cuối của Recordset vào mảng, hoặc dữ liệu đầu của RecordSet vào mảng thì GetRows (1,1). Có thể dùng MoveLast hoặc MoveFirst rồi GetRows(1,0) cho dữ liệu đầu tiên hoặc cuối cùng của RecordSet.
nếu gán vào listbox thì duyệt tới đâu gán vào tới đó theo mình là hay đó ... còn theo bạn như thế nào thì mình ko có biết
còn cho Vào Array chạy tới 2 dòng For chán lắm....============> bỏ cho lẹ
 
vì ngược nên cần hàm chuyển đổi cột thành hàng và hàng thành cột trước khi đổ dữ liệu vào listbox
Mảng được lấy từ Recordset thì có thể đẩy thẳng vào ListBox mà bạn, không cần phải chuyển đổi dòng thành cột.
 
Các bạn cho mình hỏi chút
thông Thường lâu nay mình xài ADO thì chủ yếu lấy dữ liệu theo 2 phương thức sau
1/ đưa dữ liệu vào Array xong tính toán ...
Mã:
Arr = Rs.GetRows()

2/ Copy nguyên Rs
Mã:
Range("A1").CopyFromRecordset Rs

3/ Mình có nghe đâu đó trên GPE này mà quên mất chỗ nào nói là duyệt từng Rs xong lấy dữ liệu nó cũng rất hay
Nói thật là có khi viết rồi mà cũng ko biết keo nó là chi ... nay muốn Ôn lại chút ... ai biết chỉ dùm mục số 3 này

Xin cảm ơn
1./ Các hàm sẵn có trong SQL chưa đủ để anh tính toán sao mà cần phải đưa vào mảng để tính toán.
3./ Duyệt qua từng recordset và ghi dữ liệu xuống sheet thì tốc độ của nó chậm lắm.
 
1./ Các hàm sẵn có trong SQL chưa đủ để anh tính toán sao mà cần phải đưa vào mảng để tính toán.
3./ Duyệt qua từng recordset và ghi dữ liệu xuống sheet thì tốc độ của nó chậm lắm.
thì rảnh mà cái tính cứ thích quậy bank các kiểu lên xem sao đó mà ???!!!! :p
Thực ra SQL thuần ADO biết chút chút thôi ... còn lại là tịt ... vì vậy kẹt quá cho vào Array xong tính cho dễ xài
 
vì ngược nên cần hàm chuyển đổi cột thành hàng và hàng thành cột trước khi đổ dữ liệu vào listbox
Trong bất cứ trường hợp nào nếu mảng "xuôi" (theo cách hiểu của bạn) thì khi nhập vào ListBox ta dùng LIST, còn nếu mảng "ngược" thì dùng COLUMN.
 
Chào anh HLMT.

Em đang bị vướng lỗi này khi truy vấn từ 1 file excel xuất từ phần mềm.

Nếu convert Table to Range thì truy vấn được. Nhưng giữ nguyên format ban đầu thì bị lỗi như thế.

Em không biết do đâu.

Cảm ơn anh.
1615270442251.png
 

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

Back
Top Bottom