Bài tập về ADO căn bản.

Liên hệ QC
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
 
Web KT
Back
Top Bottom