Form kết nối, truy vấn, lọc từ Excel đến CSDL Access bằn ADO căn bản. (7 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,310
Được thích
15,867
Giới tính
Nam
Nghề nghiệp
Làm ruộng.
Chào các anh chị, form bên dưới là form mình tạo ra nhằm giúp cho các thành viên mới tiếp cân ado hiểu thêm về nó mà áp dụng, dĩ nhiên đây là file còn sơ đẳng và chỉ thực hiện duy nhất là select, còn nhiều cái để phát triển thêm, ví dụ như thêm câu lệnh, thêm phần chọn bảng, trường...

[video=youtube;fT7A9-p59NI]http://www.youtube.com/watch?v=fT7A9-p59NI&feature=youtu.be[/video]


P/S: Với kiến thức ado còn giới hạn, chắc chắn sẽ có nhiều sai sót, nhưng mục đích chính để post bài này là học hỏi, mong các anh chị góp ý.
 

File đính kèm

Bạn ơi, nếu mình thay file database của bạn thành file data khác ví dụ như CSDL. Nhưng file CSDL của mình có mật khẩu thì mình sửa code ở chỗ nào vậy bạn.
 
Bài viết hai lúa hay thế này mà ko có ai like sao =))
 
Như hôm Mạnh có trình bày ở bài #21 link sau...và trả lời Của HLMT bài #22

http://www.giaiphapexcel.com/forum/...u-sang-file-đóng-bằng-ADO&p=770453#post770453

1/ Thay vì Mình phải Lập một đề tài mới... Nhưng thấy đề tài này rất hay và có nhiều vấn đề liên quan về truy vấn ...Mình sẻ nhờ sự chỉ dẫn trong nhưng loạt bài sau ...Vì vậy nên Mình xin phép Úp luôn vào đây cho tiện theo dõi cũng như học tập ...

2/ Lần đầu tiên Mình tiếp cận với Access Kết hợp với Excel nên hoàn toàn chưa biết gì hết về Access ... Vì vậy mình úp bài ở đây Nhờ HLMT cùng các Bạn GPE chỉ dẫn và hổ trợ cho Mạnh từng bước học Access Kết hợp với Excel bằng việc làm cụ thể để mình hình dung và từng bước xây dựng cho Mình một Database ...sử dụng cho QLBH được hiệu quả hơn

3/ Mình có một Vùng dữ liệu trên Excel File QLBHPN.xlsb Sheets("PhieuXuat").Range("A6:G86")...Mình muốn nếu [C6:C82] Mà có dữ liệu thì Ghi vào File QLBHPN.accdb table DataNhap Nối tiếp lần lượt xuống

mà chưa hình dung được cách viết code như thế nào Mong Các Bạn trợ giúp cho 1 code mẫu

Pass File Access là: 123

4/ Cách lấy dữ liệu từ table DataNhap ra Sheet trên Excel

Xin cảm Ơn
 

File đính kèm

2/ Lần đầu tiên Mình tiếp cận với Access Kết hợp với Excel nên hoàn toàn chưa biết gì hết về Access ... Vì vậy mình úp bài ở đây Nhờ HLMT cùng các Bạn GPE chỉ dẫn và hổ trợ cho Mạnh từng bước học Access Kết hợp với Excel bằng việc làm cụ thể để mình hình dung và từng bước xây dựng cho Mình một Database ...sử dụng cho QLBH được hiệu quả hơn

Bạn cần học ADO với Excel hay học xây dựng CSDL?
2 cái xanh đỏ ở trên gần như hoàn toàn khác nhau.
Cái xanh là chủ yếu học code. Cái đỏ thì phải học lý thuyết CSDL Liên Hệ trước, quan trọng nhất là luật chuẩn 3 bậc (3rd normal form)
 
Bạn cần học ADO với Excel hay học xây dựng CSDL?
2 cái xanh đỏ ở trên gần như hoàn toàn khác nhau.
Cái xanh là chủ yếu học code. Cái đỏ thì phải học lý thuyết CSDL Liên Hệ trước, quan trọng nhất là luật chuẩn 3 bậc (3rd normal form)

tại cũng ko được học hành gì về lập trình nên thuật ngữ nhiều lúc phát biểu lung tung linh tinh đó mà --=0

cũng chưa biết bắt đầu từ đâu...chỉ biết nêu ra cái mình muốn như trình bày và file đính kèm đó ...xong rồi từng bước nghiên cứu tiếp chứ giờ biết nói sao +-+-+-+
 
tại cũng ko được học hành gì về lập trình nên thuật ngữ nhiều lúc phát biểu lung tung linh tinh đó mà --=0

cũng chưa biết bắt đầu từ đâu...chỉ biết nêu ra cái mình muốn như trình bày và file đính kèm đó ...xong rồi từng bước nghiên cứu tiếp chứ giờ biết nói sao +-+-+-+

Trước tiên tạo 2 bảng như hình sau:

1. Bảng tên Vt

TenHang.jpg

2. Bảng phát sinh (N + X):

ps.jpg

3. Mối quan hệ giữa các bảng:

Re.jpg
 
Mạnh thấy mục 3. Mối quan hệ giữa các bảng: ...chưa hiểu lắm
Còn File Access Mình làm theo mô hình giống như trên Excel vậy có đúng không ...
Nếu tập làm trên CSDL quan hệ mà bạn chưa biết tạo mối quan hệ cũng như tại sao phải tạo mối quan hệ thì là một thiếu sót lớn. Tuy nhiên nếu chưa biết thì nên tìm hiểu ngay trước khi thiết kế CSDL nhé: https://support.office.com/en-us/ar...a32-aa99-e06c4e272c45?ui=en-US&rs=en-US&ad=US
 
Mạnh thấy mục 3. Mối quan hệ giữa các bảng: ...chưa hiểu lắm
Còn File Access Mình làm theo mô hình giống như trên Excel vậy có đúng không ...

Cái đó nằm trong lý thuyết CSDL LH.
Bởi thế ở trên tôi có hỏi bạn muốn học CSDL hay là học ADO.

Thực tế ADO chỉ là mọt công cụ dùng để truy vấn dữ liệu. KHi sử dụng bạn cần 2 điều kiện:
1. Ngôn ngữ có mọt cái giao diện để gọi ADO.
2. File dữ liệu nằm ở dạng cho phép ADO truy vấn.
Điều kiện 1 đạt vì VBA là một trong những ngon ngữ có thể gọi ADO.
Điều kiện 2 cũng đạt vì cái bạn muốn truy vấn, CSDL Access nằm ở dạng cho phép ADO truy vấn. (Thường thì bạn thấy các đề tài khác ở GPE truy vấn file Excel, cũng là dạng cho phép)

Trở lại câu hỏi của bạn là bạn muốn tạo một CSDL trên Access. Điều này chả liên quan gì đến ADO cả.
Bất kỳ bạn tạo CSDL như thế nào đều truy vấn được. Các dạng bảng, các cấu trúc liên hệ chỉ là vấn đề gúp cho truy vấn nhanh và hợp lý là thôi.
Cũng tương tự như trong Excel, nếu bạn thiết kế các bảng dữ liệu đúng đắn thì các công thức tham chiếu sẽ dễ dàng đơn giản. Không đúng đắn thì dùng công thức mảng ì ạch, và không pivot được, vv...

Mối quan hệ giữa các bảng: bạn có thể tạm coi đó là cách Access dùng để VLookup (hoặc validation), dùng ID bên bảng con để tìm từ khoá bên bảng mẹ. Access cho bạn tuỳ chọn tạo mối quan hệ bắt buộc. Khi mói quan hệ là bắt buọc thì key bên bảng con phải có trước bên bảng mẹ.
Trong ví dụ trên, ID_Hang bên bảng tblPhatSinh được chọn là có quan hệ con-mẹ với ID bên bảng tblHang. Khi bạn thêm hoặc sửa một dòng trên tblPhatSinh thì Access sẽ lục tìm xem ID_Hang đã có trong bảng tblHang hay chưa. Nếu có thì mọi việc êm xuôi. Nếu chưa có thì 1 trong 2 việc sẽ xảy ra:
1. Access sẽ phản đối, giống như validation, không cho bạn thêm/sửa. Vì lý do con không thể hiện hữu nếu không có mẹ.
2. Nếu bạn có cài đặt CSDL để điều chỉnh thì Access sẽ tự động trigger (tương tự như event) thêm một dòng tạm bên bảng tblHang để liên hệ. Và bạn có thể code để nó đưa lên một form cho bạn ghi dữ liệu mặt hàng mới.
 
Nếu tập làm trên CSDL quan hệ mà bạn chưa biết tạo mối quan hệ cũng như tại sao phải tạo mối quan hệ thì là một thiếu sót lớn. Tuy nhiên nếu chưa biết thì nên tìm hiểu ngay trước khi thiết kế CSDL nhé: https://support.office.com/en-us/ar...a32-aa99-e06c4e272c45?ui=en-US&rs=en-US&ad=US

Đọc hết link đó Mạnh mà học được chắc chết ....

Giờ HLMT chỉ cho Mình thực tế vầy nè thì Mình sẻ tùy biến học rất nhanh ...chắc cú luôn ...còn vấn đề khác từ từ Mình quậy diết rồi đến một lúc nào đó ngộ ra à

1/ Bạn viết cho mình một code mẫu ghi vào file Access như yêu cầu bài #4

2/ Code xóa 1 Table trong Access

3/ Code lấy nguyên 1 Table trong Access ra Excel hay tùy chọn theo cột mình cần lấy

4/ Trước mắt mình chỉ Sử dụng File Access như 1 File mình chứa dữ liệu vào đó thôi để lấy và tổng hợp trên Excel xong ghi vào đó thay vì dùng Data.xlsb

5/ Để Mạnh tùy biến giống như ADO trên Excel ý dùng phương thức Rs.Getrows() lấy từ table Access ra nhét vào đó xong cho vào Mảng muốn làm gì thì làm ...xong mình lại ghi vào Access là Mạnh có thể làm được

Chứ ADO mà keo Mình viết thuần túy ADO là thua ...Nên phải chơi kiểu đó xong chỗ nào chưa làm được lại nhờ các thành viên chỉ dẫn thêm

6/ Học siêu tốc học vậy mình mới học được ....xong mỗi ngày nhét thêm một ít là ok mà...--=0

Xin cảm ơn các Bạn
 
Đọc hết link đó Mạnh mà học được chắc chết ....

Giờ HLMT chỉ cho Mình thực tế vầy nè thì Mình sẻ tùy biến học rất nhanh ...chắc cú luôn ...còn vấn đề khác từ từ Mình quậy diết rồi đến một lúc nào đó ngộ ra à

1/ Bạn viết cho mình một code mẫu ghi vào file Access như yêu cầu bài #4

2/ Code xóa 1 Table trong Access

3/ Code lấy nguyên 1 Table trong Access ra Excel hay tùy chọn theo cột mình cần lấy

4/ Trước mắt mình chỉ Sử dụng File Access như 1 File mình chứa dữ liệu vào đó thôi để lấy và tổng hợp trên Excel xong ghi vào đó thay vì dùng Data.xlsb

5/ Để Mạnh tùy biến giống như ADO trên Excel ý dùng phương thức Rs.Getrows() lấy từ table Access ra nhét vào đó xong cho vào Mảng muốn làm gì thì làm ...xong mình lại ghi vào Access là Mạnh có thể làm được

Chứ ADO mà keo Mình viết thuần túy ADO là thua ...Nên phải chơi kiểu đó xong chỗ nào chưa làm được lại nhờ các thành viên chỉ dẫn thêm

6/ Học siêu tốc học vậy mình mới học được ....xong mỗi ngày nhét thêm một ít là ok mà...--=0

Xin cảm ơn các Bạn
Thấy bạn đọc đề tài này http://www.giaiphapexcel.com/forum/showthread.php?65492-Kết-nối-Thao-tác-giữa-Excel-và-Access rồi mà, trong đó có cái bạn cần đó.
 


Mỗi ngày Mạnh sẻ học một chút ...Nhờ các bạn xem dùm Hàm sau lấy dữ liệu từ Table Files Access [Code tham khảo từ GPE]
Xem cách viết vậy có ổn không hay cần điều chỉnh lại ...Mạnh thử File Access 2003 hay 2016 điều OK
Mình phải viết thành Hàm sử dụng chung cho nhiều trường hợp....
Mã:
Private Function Connection(ByVal AccessPath As String)
    Dim Cnn As Object
    Set Cnn = CreateObject("ADODB.Connection")
    Cnn.ConnectionString = "Provider= Microsoft.ACE.OLEDB.12.0; data source=" _
        & AccessPath & ";Persist Security Info=False"
    Cnn.CursorLocation = adUseClient
    Cnn.Open
    Set Connection = Cnn
End Function


Public Sub GetDatabaseAccess(ByVal AccessPath As String, ByVal tableName As String, ByVal Target As Range)
    Dim Cnn As Object, Rst As Object
    Set Cnn = Connection(AccessPath)
    Set Rst = Cnn.Execute("select * from [" & tableName & "]")
    Target.CopyFromRecordset Rst
    Set Cnn = Nothing: Set Rst = Nothing
End Sub


Public Sub Main()
    Dim Path As String, aTable  As String
    aTable = "TB_NhanVien" ''Tem Table trong Access
    Range("A2:B5000").ClearContents
    Path = ThisWorkbook.Path & "\CSDLfromExcel.accdb" ''File can lay
    Call GetDatabaseAccess(Path, aTable, [A2])
End Sub
 
Lần chỉnh sửa cuối:
Mình sử dụng code sau để lấy dữ liệu từ Access 2003 To 2016 Ok ...

Tuy nhiên Mình cho thêm tham số là Pass vào nữa là lỗi code không biết sai do cái gì mong các bạn chỉ dùm

xin cảm ơn
Mã:
Sub Excel_Access()
    Dim Cnn As Object, Rst As Object
[COLOR=#ff0000][B]    Dim MyPass As String: MyPass = "123"[/B][/COLOR]    
    Set Cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")
    Cnn.Open ("Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & ThisWorkbook.Path & "\database.accdb;Uid=Admin;[COLOR=#ff0000][B]Pwd=MyPass[/B][/COLOR];")
    Rst.Open ("select * from [Data]"), Cnn
    Range("A2:W5000").ClearContents
    Range("A2").CopyFromRecordset Rst
End Sub
 
Mình sử dụng code sau để lấy dữ liệu từ Access 2003 To 2016 Ok ...

Tuy nhiên Mình cho thêm tham số là Pass vào nữa là lỗi code không biết sai do cái gì mong các bạn chỉ dùm

xin cảm ơn
Mã:
Sub Excel_Access()
    Dim Cnn As Object, Rst As Object
[COLOR=#ff0000][B]    Dim MyPass As String: MyPass = "123"[/B][/COLOR]    
    Set Cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")
    Cnn.Open ("Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & ThisWorkbook.Path & "\database.accdb;Uid=Admin;[COLOR=#ff0000][B]Pwd=MyPass[/B][/COLOR];")
    Rst.Open ("select * from [Data]"), Cnn
    Range("A2:W5000").ClearContents
    Range("A2").CopyFromRecordset Rst
End Sub

Xem lại cái chuổi nhé

Mã:
Sub chuoi()

    Dim Mypass As String
    Mypass = 1234
    MsgBox ("Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & ThisWorkbook.Path & "\database.accdb;Uid=Admin;Pwd=" & Mypass & ";")


End Sub
 
Xem lại cái chuổi nhé

Mã:
Sub chuoi()

    Dim Mypass As String
    Mypass = 1234
    MsgBox ("Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & ThisWorkbook.Path & "\database.accdb;Uid=Admin;Pwd=" & Mypass & ";")


End Sub


Nó vẫn báo lỗi theo Hình ...Mình xài Windows10_x32 + Office 2016_x32
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    31.5 KB · Đọc: 43
Các Bạn cho Mình hỏi có cách nào sử dùng Code Từ Excel Mà Compact and Repair Database File Access đang đóng được không

Xin cảm ơn
 

Theo link Bạn chỉ Mạnh có copy và điều chỉnh viết lại áp dung cho Mình...vậy Mình úp lên nhờ Bạn cùng các thành Viên GPE tham gia Góp ý ...

1/ Chỉ dùm mình cách dịnh dạng cột % trong Access tại sao nó không ra đúng như trên Excel mà ra $0.05

2/ tại sao mình chuyển dữ liệu vào mãng xong gán lên sheet cột % nó khác với cách lấy thuần ADO

Rất mong các Bạn hổ trợ thêm ....Xin cảm ơn

Mã:
Option Explicit
Public Cnn As Object, Rst As Object
Rem ==========
Public Function MyRecordset() As Object
    Set MyRecordset = CreateObject("ADODB.Recordset")
End Function
Rem ==========
Public Function MyConnection() As Object
    Set MyConnection = CreateObject("ADODB.Connection")
End Function
Rem ==========
Private Function Connection(ByVal FilePath As String)
    Set Cnn = MyConnection()
    Cnn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=") & FilePath
    Set Connection = Cnn
End Function
Rem ==========
Private Function GetFilePath(ByVal AccPath As String)
    GetFilePath = ("Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=" & AccPath & ";Uid=Admin;Pwd=;")
End Function
Rem ==========
Public Sub GetDataBase(ByVal AccessPath As String, ByVal TableName As String, ByVal Target As Range)
    Set Cnn = MyConnection()
    Cnn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=") & AccessPath
    Set Rst = Cnn.Execute("select * from [" & TableName & "]")
    Target.CopyFromRecordset Rst
    Set Cnn = Nothing: Set Rst = Nothing
End Sub
Rem ==========
Public Function TransArr(ByVal sArr As Variant) As Variant
    Dim TmpArr As Variant, x As Long, y As Long
    ReDim TmpArr(UBound(sArr, 2), UBound(sArr, 1))
    For x = 0 To UBound(sArr, 2)
        For y = 0 To UBound(sArr, 1)
            TmpArr(x, y) = sArr(y, x)
        Next y
    Next x
    TransArr = TmpArr
End Function
Rem ==========
Private Sub GetDataArr(ByVal AccPath As String, ByVal TableName As String, Res())
    On Error GoTo Thoat ''xu ly loi khi du lieu Empty
    Set Cnn = MyConnection()
    Cnn.ConnectionString = GetFilePath(AccPath)
    Cnn.Open
    Set Rst = Cnn.Execute("select * from " & "[" & TableName & "]")
    Res = TransArr(Rst.GetRows())
Thoat: Set Cnn = Nothing: Set Rst = Nothing
End Sub
Rem ==========
Private Sub DeleteTableName(ByVal FilePath As String, ByVal TableName As String)
    Set Cnn = Connection(FilePath)
    Set Rst = Cnn.Execute("DELETE * FROM " & TableName)
    Set Cnn = Nothing: Set Rst = Nothing
End Sub
Rem ==========
Private Function GetConnectionData(ByVal aPath As String) As Long
    On Error GoTo ErrorHandle
    Set Cnn = MyConnection()
    With Cnn
        .Mode = 3
        .ConnectionTimeout = 30
        .CursorLocation = 3
        .ConnectionString = GetFilePath(aPath)
        .Open
    End With
    GetConnectionData = 1
    Cnn.Close
ErrorHandle: Err.Clear
End Function
Rem ==========
Private Sub InsertDataBase(ByVal AccPath$, ByVal TableName$, Res())
    Dim i As Long, ColFieldNames(), ExArr()
    If (GetConnectionData(AccPath)) Then
        Cnn.Open
        ColFieldNames = Array(1, 2, 3, 4, 5, 6)          ''Ban co the thay doi [Field] Tuy theo so truong cua ban
        Set Rst = MyRecordset()
        Rst.CursorLocation = 3                          ''adUseClient
        Rst.Open TableName, Cnn, 3, 4                   ''adOpenStatic, adLockBatchOptimistic
        
        For i = 1 To UBound(Res, 1)                     ''Tuy cho thay doi du lieu tren Excel cho phu Hop voi ColFieldNames
            If Len(Res(i, 2)) > 0 Then
                ExArr = Array(Res(i, 1), Res(i, 2), _
                              Res(i, 3), Res(i, 4), _
                              Res(i, 5), Res(i, 6))
                Rst.AddNew ColFieldNames, ExArr()
            End If
        Next i


        Rst.UpdateBatch
        Beep 'MsgBox "Ban da xuat du lieu thanh cong.", 64, "Thông Báo"
    Else
        MsgBox "Khong the ket noi voi CSDL...", 48, "Thông Báo"
    End If
    Set Rst = Nothing: Set Cnn = Nothing
End Sub
Rem ==========
Public Sub ExcelToAccess()
    Dim Arr(), Path As String, sTableName As String
    sTableName = ("DataNhap")
    Path = ThisWorkbook.Path & "\QLBHPN.accdb"
    Arr = Sheets("PhieuXuat").Range("B6:G86").Value
    Call InsertDataBase(Path, sTableName, Arr())
End Sub
Rem ========== Con Ham nay lay len Cot % dung theo luc ghi Vao ????!!!!
Public Sub AccessToExcel()
    Dim Path As String, Table As String
    Dim Sht As Worksheet
    Set Sht = ThisWorkbook.Worksheets("Data")
    Table = ("DataNhap")
    Call DeleteData
    Path = ThisWorkbook.Path & "\QLBHPN.accdb"
    Call GetDataBase(Path, Table, Sht.Range("A2"))
End Sub
Rem ========== tai sao dung code nay lay du lieu Len Cot % lai La $0.8 ???!!!!
Public Sub AccessToExcel_TransArr()
    Dim FilePath$, sTableName$, Arr()
    sTableName = ("DataNhap")
    FilePath = ThisWorkbook.Path & "\QLBHPN.accdb"
    Call DeleteData
    Call GetDataArr(FilePath, sTableName, Arr())
    Rem Se loi dong sau khi du lieu Empty
    Sheet2.Range("A2").Resize(UBound(Arr) + 1, UBound(Arr, 2) + 1) = Arr
End Sub
Rem ==========
Public Sub Delete_TableName()
    Dim sPath As String, Table As String
    Table = "DataNhap"                                           ''Ten Bang du lieu trong Access
    sPath = ThisWorkbook.Path & "\QLBHPN.accdb"
    Call DeleteTableName(sPath, Table)
End Sub
Rem ==========
Public Sub DeleteData()
    Sheet2.Cells.Clear
End Sub

Tại sao Mình gửi File kèm hoài Ko được ...để úp sau
 
Mạnh Úp File bài #19 nhờ các Bạn xem dùm

Sao GPE hôm nay sao ý Úp File kiểu này mới Ok
 

File đính kèm

Bạn nào biết cho Mình hỏi một chút 2 cái
Driver dưới mỗi cái sử dụng trong trường hợp nào và tại sao cái Tham số màu đỏ có cũng được mà bỏ cũng OK ...???!!!+-+-+-+
[h=3]1/ Workgroup
Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\mydatabase.accdb;
SystemDB=C:\mydatabase.mdw;


2/ Exclusive
Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\mydatabase.accdb;
Exclusive=1;Uid=admin;Pwd=;
[/h]
 
Web KT

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

Back
Top Bottom