ADO căn bản: Kết nối truy vấn CSDL từ file Excel đến file Access. (1 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.
Mình rất đắng đo khi quyết định mở topic này, do kiến thức chấp vá, cách diễn đạt cũng như khả năng hiểu biết về ADO có hạn. Mong nhận được sự góp ý của các anh chị nhiều hơn.

Chuẩn bị môi trường làm việc: Vào cửa sổ code click chọn Tools>Refrences, xong chọn Microsoft ActiveX Data Objects x.x Library (ADO)

[video=youtube;9g8izYUQrnE]


Lưu ý: Để bài viết được liên tục, các bạn nếu có góp ý hay thảo luận về đề tài này, vui lòng ghé sang topic sau:
[h=3]Thảo luận về bài: ADO căn bản Kết nối truy vấn CSDL từ file Excel đến file Access.[/h]
 
Lần chỉnh sửa cuối:
Code kết nối với CSDL ví dụ file Access có tên là CSDL.mdb với Pass là 1234 , code kết nối sẽ như sau:

Mã:
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
strCNString = "Data Source=" & ThisWorkbook.Path & "\CSDL.mdb"
With cnn
    .Provider = "Microsoft Jet 4.0 OLE DB Provider"
    .ConnectionString = strCNString
    .Properties("Jet OLEDB:Database Password") = "1234"
    .CursorLocation = adUseClient
    .Open

End With

End Sub

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


Mình xin gửi Data mẫu để các bạn tiện thực hành.
Lưu ý các bạn chép file này vào chung với folder file excel truy vấn của các bạn nhé.
 

File đính kèm

Lần chỉnh sửa cuối:
Phát biểu SQL SELECT

Phát biểu SQL SELECT: Chọn các cột theo ý muốn từ 1 cơ sở dữ liệu, ở đây là tên file cần kết nối là CSDL.mdb:
Dùng phát biểu này để chọn (SELECT) thông tin từ (FROM) một bảng như sau:

Mã:
SELECT TenCotCanLay FROM TenBang

Ví dụ hình bên dưới là bảng dữ liệu có tên là tblData, trong bảng này có đầy đủ các trường (Cột) như sau:

ADO1.jpg

Bây giờ tôi lấy ví dụ là chỉ lấy 3 cột (TP, [MATERIAL NAME],[COLOR NAME]) Lưu ý đối với những cột có tên đặc biệt và có cách trắng chúng ta nên thêm [] vào tên cột đó.

SELECT TP, [MATERIAL NAME],[COLOR NAME]
FROM tblData;

Kết quả sẽ như sau:

ADO2.jpg

Lưu ý nếu muốn chọn tất cả các cột thì chỉ cần Select * from TenBang là đủ.
 
Bây giờ bắt đầu ta lấy dữ liệu từ bảng tblData ra Excel cell bắt đầu là A5.

1./ Lấy tất cả các cột có trong bảng:

Mã:
Sub LayDuLieuTatCaCot()
On Error GoTo loi


Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi


    lsSQL = "SELECT * " & _
            "FROM tblData"
            
    rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
    Cells.ClearContents
    Range("A5").CopyFromRecordset rst
    
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

2./ Lấy 3 cột (SUPPLIER, [MATERIAL NAME], [COLOR NAME]) lưu ý nếu ta select cột nào trước thì nó sẽ ra cột đó trước, ví dụ tôi lấy cột Supplier trước thì nó sẽ hiển thị cột này trước, mặc dù vị trí thực của nó nằm trong bảng ở sau các cột kia.

Mã:
Sub LayDuLieu3Cot()
On Error GoTo loi


Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi


    lsSQL = "SELECT SUPPLIER, [MATERIAL NAME], [COLOR NAME] " & _
            "FROM tblData"


            
    rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
    Cells.ClearContents
    Range("E5").CopyFromRecordset rst
    
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

[video=youtube;MH2-fAElpXw]http://www.youtube.com/watch?v=MH2-fAElpXw&amp;feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Mệnh đề SQL WHERE

Để bóc dữ liệu trong 1 bảng dữ liệu theo ý muốn ta có mệnh đề WHERE vào sau phát biểu SELECT với cú pháp như sau:
*./ Cú pháp:


Mã:
Select TenCot.....
         From TenBang
         Where  Điều kiện của TenCot cần lọc


PHÉP TOÁN | MÔ TẢ
=|So sánh bằng
<>|So sánh không bằng, khác
>|Lớn hơn
<|Nhỏ hơn
>=|Lớn hơn hoặc bằng
<=|Nhỏ hơn hoặc bằng
BETWEEN|Nằm giữa một khoảng
LIKE|So sánh mẫu chuỗi

*./ Lưu ý: - Đối với các điều kiện lọc dữ liệu là chuổi ta nên bao quanh chúng bằng dấu nháy đơn ví dụ ta cần lọc cột [COLOR NAME] là màu BLACK thì ta phải ghi 'BLACK' còn nếu là số thì không cần thêm gì hết.
- Nếu ta muốn lọc theo điều kiện 1 phần của chuổi thì ta thêm dấu % vào điều kiện lọc, ví dụ ta muốn lọc những loại vật tư có tên đầu tiên là POLY thì ta thêm như sau 'POLY%', thì nó sẽ cho ra kết quả là chỉ lọc những loại vật tư bắt đầu là chữ POLY

Ví dụ: Cũng CSDL trên ta có câu lệnh truy vấn so sánh chuổi của cột [ORIGIN] nào có dữ liệu thõa điều kiện là 'KOREA' thì bóc ra: TA DÙNG PHÉP TOÁN LIKE như sau:

Mã:
Sub LayDuLieuDK()
On Error GoTo loi
Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi

[B][COLOR=#ff0000]    lsSQL = "SELECT * " & _[/COLOR][/B]
[B][COLOR=#ff0000]            "FROM tblData " & _[/COLOR][/B]
[B][COLOR=#ff0000]            "Where [ORIGIN] [/COLOR][COLOR=#0000ff]like [/COLOR][COLOR=#ff0000]'KOREA'"[/COLOR][/B]
            
    rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
    Cells.ClearContents
    Range("A5").CopyFromRecordset rst
    
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

[video=youtube;-mrG5xcUXus]http://www.youtube.com/watch?v=-mrG5xcUXus&amp;feature=youtu.be[/video]
 
Lần chỉnh sửa cuối:
Xin được góp ý thêm 1 chút:

SQL WHERE Clause:

The WHERE clause is used to filter records.

Mệnh đề WHERE được sử dụng để lọc records

The WHERE clause is used to extract only those records that fulfill a specified criterion.

Mệnh đề WHERE được sử dụng để trích xuất các records đáp ứng một tiêu chí xác định.

Cú pháp SQL WHERE:
Mã:
SELECT column_name(s)
FROM table_name
WHERE column_name operator value

LƯU Ý:

SQL sử dụng dấu nháy đơn (') bao quanh các giá trị chuỗi (hầu hết các hệ thống cơ sở dữ liệu cũng sẽ chấp nhận dấu ngoặc kép).

Tuy nhiên, giá trị số không được kèm theo trong dấu nháy đơn!


1) Với giá trị chuỗi (text values):


Đúng:

Mã:
SELECT * FROM Persons WHERE FirstName='NGHIA'

Sai:

Mã:
SELECT * FROM Persons WHERE FirstName=NGHIA



2) Với giá trị số (numeric values):


Đúng:

Mã:
SELECT * FROM Persons WHERE Year=1965

Sai:

Mã:
SELECT * FROM Persons WHERE Year='1965'
 
Lần chỉnh sửa cuối:
Update

Đợi đã lâu mà anh HTN không viết tiếp, thôi thì mình viết tiếp cho xong phần dang dỡ này vậy:

*) Mệnh đề SQL UPDATE: Dùng để chỉnh sửa hay cập nhật nội dung vào CSDL
*) Cú Pháp:

[TIP]UPDATE TenBangCanDuocCapNhat
SET TenCot1CanCapNhat=NoiDungCapNhatChoCot1,TenCot2CanCapNhat=NoiDungCapNhatChoCot2,...
WHERE TenCotLamDK=DKDeCapNhat
[/TIP]

*) Ví dụ: Cũng với CSDL ở bài 2 mình xin cập nhật cột Supplier = nội dung mới là 'Thu Test Cai coi cap nhat duoc khong?' và cột TP là 'hic hic', với điều kiện cập nhật là ID của dòng cần được cập nhật là 2. Vậy tôi sẽ viết như sau:


[GPECODE=sql]Sub CapNhat()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "UPDATE tblData " & _
"SET Supplier='Thu Test Cai coi cap nhat duoc khong?', TP='hic hic'" & _
"WHERE [ID]=2"
rst.Open lsSQL, cnn
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]
 
Lần chỉnh sửa cuối:
Select distinct

*) Mệnh đề SQL SELECT DISTINCT: Dùng để lọc duy nhất
*) Cú Pháp:

[TIP]SELECT DISTINCT TenCot1, TenCot2...
FROM TenBang
[/TIP]

*) Ví dụ: Cũng với CSDL ở bài 2 tôi xin lấy dữ liệu duy nhất của cột Supplier và Origin thì tôi sẽ viết như sau:

[GPECODE=sql]Sub LocDuyNhat()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "SELECT DISTINCT SUPPLIER, ORIGIN " & _
"FROM tblData"
rst.Open lsSQL, cnn
[A2].CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]
 
Order by

*) Mệnh đề SQL ORDER BY: Nằm ở cuối câu lệnh, dùng để sắp xếp lại dữ liệu các cột.
*) Cú Pháp:

[TIP]SELECT COT1, COT2...
FROM TENBANG
ORDER BY COT1
ASC|DESC, COT2 ASC|DESC ...[/TIP]

Lưu ý: Sắp xếp tăng dần thì ta thêm ASC, ngược lại muốn sắp xếp theo cách giảm dần thì ta thêm DESC ở sau tên cột cần muốn sắp xếp.
(Nếu không ghi ASC hoặc DESC gì hết thì nó sẽ tự sắp xếp theo cách tăng dần)

*) Ví dụ: Cũng với CSDL ở bài 2 tôi xin sắp xếp lại cột TP tăng dần, ID giảm dần thì tôi sẽ viết như sau:

[GPECODE=sql]Sub SapXep()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "SELECT * " & _
"FROM tblData " & _
"ORDER BY TP, ID DESC"
rst.Open lsSQL, cnn
[A2].CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub[/GPECODE]
 
Insert into

*) Mệnh đề SQL INSERT INTO: Là dùng để thêm mới dữ liệu.
*) Cú Pháp:

Cách 1: Chèn thêm dòng không theo tên cột, dữ liệu sẽ được chèn vào CSDL theo thứ tự của cột.
Lưu ý: Cách này phải chèn toàn bộ cột theo thứ tự cột trong CSDL

[TIP]INSERT INTO TênBảngCầnChèn
VALUES (GiáTrị1,
GiáTrị2, GiáTrị3,...)[/TIP]

Cách 2:
Chèn thêm dòng theo tên cột, dữ liệu sẽ được chèn vào CSDL theo tên cột.

[TIP]INSERT INTO TênBảngCầnChèn (Cột1, Cột2, Cột3,...)
VALUES (
GiáTrị1, GiáTrị2, GiáTrị3,...)[/TIP]

*) Ví dụ: Cũng với CSDL ở bài 2 tôi xin minh họa chèn dữ liệu theo từng cách ở trên như sau:

Cách 1:
Tôi chèn dòng sau vào bảng:

ID | PONO | W_HDATE | TP | MATERIAL NAME | SPEC 2 | COLOR NAME | POQTY | INPUTQTY | BALANCE | UNIT | PRICE | M_UNIT | AMOUNT | ORIGIN | SUPPLIER | REMARK
500​
|DW13GW019|
01/06/2013​
|AA|MESH 192|44|BLACK|
1000​
|
0​
|
-1000​
|YDS|
1.9​
|USD.|
1900​
|VIETNAM|YOO SUNG MESH|

[GPECODE=sql]Sub ChenDong1()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "INSERT INTO tblData " & _
"VALUES (500,'DW13GW019', #6/1/2013#,'AA','MESH 192','44','BLACK',1000,0,-1000,'YDS',1.9,'USD.',1900,'VIETNAM','YOO SUNG MESH', NULL)"
rst.Open lsSQL, cnn
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub[/GPECODE]

Cách 2: Ví dụ tôi chèn ID=501,W_HDate=30/01/2013,Supplier=YOO SUNG MESH thì tôi sẽ viết như sau:

[GPECODE=sql]Sub ChenDong2()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "INSERT INTO tblData (ID,W_HDate,Supplier) " & _
"VALUES(501,#01/30/2013#,'YOO SUNG MESH')"
rst.Open lsSQL, cnn
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]

Thì chỉ duy nhất 3 giá trị trên được chèn vào các cột tương ứng với nó, các cột khác sẽ bị trống.
 
Delete

*) Mệnh đề SQL DELETE: Là dùng để xóa dữ liệu.
*) Cú Pháp:

- Xóa toàn bộ bảng dữ liệu:


[TIP]DELETE
FROM TênBảngCầnXóa
[/TIP]

Hoặc:

[TIP]DELETE *
FROM TênBảngCầnXóa
[/TIP]

- Xóa dữ liệu theo điều kiện:

[TIP]DELETE
FROM TênBảngCầnXóa
WHERE ĐiềuKiệnXóa
[/TIP]

Hoặc:

[TIP]
DELETE *
FROM TênBảngCầnXóa
WHERE ĐiềuKiệnXóa
[/TIP]

*) Ví dụ:
Cũng với CSDL ở bài 2 tôi xin xóa dòng dữ liệu có ID=2 thì tôi sẽ viết như sau:


[GPECODE=sql]Sub XoaDong()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "DELETE * " & _
"FROM tblData " & _
"WHERE ID=2"
rst.Open lsSQL, cnn
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub[/GPECODE]
 
And & Or

*) AND & OR: Là dùng để kết hợp điều kiện truy vấn dữ liệu.

- AND: Là sự kết hợp 1 điều kiện thứ nhất và thứ 2 (Đk n). Dữ liệu sẽ xuất hiện nếu cả 2 (Đk n) điều kiện đều được thỏa mãn.
- OR: Dữ liệu sẽ xuất hiện khi thỏa mãn 1 trong nhiều điều kiện.
*) Ví dụ:
- AND: Cũng với CSDL ở bài 2 tôi lọc ra những mặc hàng có điều kiện cột TP='A' ORIGIN='KOREA' thì tôi sẽ viết như sau:

[GPECODE=sql]Sub Dk_And()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "SELECT * " & _
"FROM tblData " & _
"WHERE TP='A' AND ORIGIN='KOREA'"
rst.Open lsSQL, cnn
Cells.ClearContents
[A2].CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]

==> Dữ liệu sẽ được xuất hiện 7 dòng với cột TP=A và ORIGIN=KOREA

- OR: Cũng với CSDL ở bài 2 tôi lọc ra những mặc hàng có điều kiện cột TP='A' hoặc ORIGIN='KOREA' thì tôi sẽ viết như sau:

[GPECODE=sql]Sub Dk_Or()
Dim cnn As Object: Dim rst As Object
Dim lsSQL As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
With cnn
.Provider = "Microsoft Jet 4.0 OLE DB Provider"
.ConnectionString = ThisWorkbook.Path & "\CSDL.mdb"
.Properties("Jet OLEDB:Database Password") = "1234"
.Open
End With
lsSQL = "SELECT * " & _
"FROM tblData " & _
"WHERE TP='A' OR ORIGIN='KOREA'"
rst.Open lsSQL, cnn
Cells.ClearContents
[A2].CopyFromRecordset rst
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing

End Sub

[/GPECODE]

==> Dữ liệu sẽ được xuất hiện 188 dòng với điều kiện dòng dữ liệu cột thỏa mãn 1 trong 2 điều kiện TP=A hoặc ORIGIN=KOREA.
 
Hai Lúa Miền Tây ơi cho mình hỏi tí.

ADO có toán tử LIKE để so sánh

VBA của Excel cũng có LIKE

Nếu VBA dùng LIKE, trong cấu trúc của LIKE có một thủ tục mà ít ai dùng đến đó là so sánh không phân biệt hoa thường đó là đặt thủ tục "Option Compare Text" trên cùng của Module (nếu không có thủ tục đó, mặc nhiên nó là "Option Compare Binary").

Nhưng khi dùng trong ADO vì mọi câu lệnh nó là dạng chuỗi nên không thể thực hiện được như trong VBA để chuyển hóa thuộc tính toán tử LIKE, vì thế, có đặt "Option Compare Text" đi chăng nữa nó cũng không có tác dụng gì!

Vậy câu lệnh nào có tác dụng như "Option Compare Text" trong ADO?

Cám ơn rất nhiều!

------------------------------------------------------
P/s: Mặc dù có thể ta chữa cháy bằng UCase hoặc LCase cho 2 vế, nhưng cứ tìm hiểu xem có hay không cái đã hen!
 
Lần chỉnh sửa cuối:
Anh thử dùng = thay vì dùng like.
 
Không biết anh test sao trên máy em vẫn là phân biệt được cho dù dùng like hoặc dùng =, đây là file em kiểm đã thử trên máy em
Không hiểu anh hỏi gì hả nmhung49, anh cần cái sự so sánh không phân biệt chữ hoa và chữ thường đấy mà, chứ ai chẳng biết "a" = "a" là True, nhưng "a" = "A" chắc chắn sẽ cho ra False rồi.

Thí dụ nè:

Mã:
Sub test()
    Dim DK As String
    Dim Arr(), ftrArr
    
[B]    DK = [COLOR=#ff0000]"a"[/COLOR][/B]
    Arr = Array([COLOR=#ff0000][B]"A"[/B][/COLOR], "B", "C")
    
[COLOR=#008000]    ''Buoc 1: Không phân biệt chữ hoa chữ thường[/COLOR]
    ftrArr = Filter(Arr, DK, True, [COLOR=#0000ff]vbTextCompare[/COLOR])
    MsgBox ftrArr(0)
    
[COLOR=#008000]    ''Buoc 2: Có phân biệt chữ hoa chữ thường:[/COLOR]
    ftrArr = Filter(Arr, DK, True, [COLOR=#ff0000]vbBinaryCompare[/COLOR])
    MsgBox ftrArr(0)
End Sub
 
Code kết nối với CSDL ví dụ file Access có tên là CSDL.mdb với Pass là 1234 , code kết nối sẽ như sau:

Mã:
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
strCNString = "Data Source=" & ThisWorkbook.Path & "\CSDL.mdb"
With cnn
    .Provider = "Microsoft Jet 4.0 OLE DB Provider"
    .ConnectionString = strCNString
    .Properties("Jet OLEDB:Database Password") = "1234"
    .CursorLocation = adUseClient
    .Open

End With

End Sub

[video=youtube;JicwsL8zrGY]http://www.youtube.com/watch?v=JicwsL8zrGY&amp;feature=youtu.be[/video]


Mình xin gửi Data mẫu để các bạn tiện thực hành.
Lưu ý các bạn chép file này vào chung với folder file excel truy vấn của các bạn nhé.
Chưa đọc hết topic không biết phía sau có cau trả lời của mình không? Nhưng mình cũng xin hỏi luôn
muốn kết nối tới access 2007 viết sao vay?. Mong sơm nhận được trả lời!
 
ACE cho mình hỏi, nếu lọc từ ngày tháng này đến ngày tháng khác thì cấu trúc như thế nào ạ. Thanks!
 
Lần chỉnh sửa cuối:
Cho mình hỏi lấy dữ liệu từ nhiều table trong 1 file access thì thực hiện như thế nào. cảm ơn!
 
Mã:
Public cnn As New ADODB.Connection
Sub Moketnoi()
Set cnn = New ADODB.Connection
Dim strCNString As String
strCNString = "Data Source=" & ThisWorkbook.Path & "\CSDL.mdb"
With cnn
    .Provider = "Microsoft Jet 4.0 OLE DB Provider"
    .ConnectionString = strCNString
    .Properties("Jet OLEDB:Database Password") = "1234"
    .CursorLocation = adUseClient
    .Open

End With

End Sub
Các bạn cho mình hỏi là kết nối với csdl accdb có pass như thế nào vây? như Sub trên mình thay csdl mdb thanh accdb thì chỉ có thể kết nối khi không có pass. file accdb có pass thì không kết nối được

cảm ơn mọi người nhiều!
 
1. accdb thì provider phải là ACE chứ. (Provider)

2. ACE hay Jet gì thì cũng mở password qua Jet. (Properties)
Tuy nhiên, vì nó là Jet cho nên nó không mở được những files được password encrypted theo kiểu của 2007 trở lên.
Muốn mở bằng connection string này thì phải encrypt nó lại theo kiểu cũ (2003).
- Vào Access, tháo password. Đóng lại.
- vào Access->File->Options->Client
Settings->Advanced, tích "use legacy encryption"
- Đặt password trở lại.
Encrypt kiểu cũ như vầy không an toàn bằng kiểu mới. Nhưng đó là cách duy nhất để kết nối với ADO.
 
các pro cho mình hỏi, ta có thể dùng excel để tạo hoặc xóa đi 1 trường dữ liệu của 1 bảng trong access được không, nếu có thì có thể cho em code ví dụ đc không. Rất mong câu trả lời của các pro, em cảm ơn./.
 
các pro cho mình hỏi, ta có thể dùng excel để tạo hoặc xóa đi 1 trường dữ liệu của 1 bảng trong access được không, nếu có thì có thể cho em code ví dụ đc không. Rất mong câu trả lời của các pro, em cảm ơn./.
Bạn hoàn toàn có thể thêm và xóa trường dữ liệu bình thường bằng ví dụ sau:

1. Xóa
Mã:
ALTER TABLE TenTable DROP COLUMN TenTruongDLCanXoa
2. Thêm
Mã:
ALTER TABLE TenTable ADD COLUMN TenTruongDLCanThem  KieuDuLieu
 
Xin được góp ý thêm 1 chút:

SQL WHERE Clause:

The WHERE clause is used to filter records.

Mệnh đề WHERE được sử dụng để lọc records

The WHERE clause is used to extract only those records that fulfill a specified criterion.

Mệnh đề WHERE được sử dụng để trích xuất các records đáp ứng một tiêu chí xác định.

Cú pháp SQL WHERE:
Mã:
SELECT column_name(s)
FROM table_name
WHERE column_name operator value

LƯU Ý:

SQL sử dụng dấu nháy đơn (') bao quanh các giá trị chuỗi (hầu hết các hệ thống cơ sở dữ liệu cũng sẽ chấp nhận dấu ngoặc kép).

Tuy nhiên, giá trị số không được kèm theo trong dấu nháy đơn!
Tks bác nhiều. Mình mới mò về vba nên k rành nhờ bác chỉ giúp như sau: mình muốn mệnh đề where nó = với giá trị 1 ô mình nhập thì khai báo như thế nào nhỉ?
Vd: mình có 1 nút và ô A1 với các giá trị cách nhau dấu , là 1990,1991,1992, khi bấm vào nút thì sẽ lọc năm sinh điều kiện này, nếu không nhập thì lấy tất cả thì làm sao bác
 
Lần chỉnh sửa cuối:
Tks bác nhiều. Mình mới mò về vba nên k rành nhờ bác chỉ giúp như sau: mình muốn mệnh đề where nó = với giá trị 1 ô mình nhập thì khai báo như thế nào nhỉ?
Vd: mình có 1 nút và ô A1 với các giá trị cách nhau dấu , là 1990,1991,1992, khi bấm vào nút thì sẽ lọc năm sinh điều kiện này, nếu không nhập thì lấy tất cả thì làm sao bác
Cột Năm Sinh trong CSDL của bạn dạng nào? yyyy hay dd/mm/yyyy?
 
Làm phiền các Bạn chút ... Bạn nào còn sử dụng Office 2003 nhờ tải 2 File Access sau về mở lên Save As sang Access 2003 dùm mình với
File đó hình như là Office 1997 Or 2000 gì đó mình mở trên Office 2016x64 không được
Xin cảm ơn
 

File đính kèm

Làm phiền các Bạn chút ... Bạn nào còn sử dụng Office 2003 nhờ tải 2 File Access sau về mở lên Save As sang Access 2003 dùm mình với
File đó hình như là Office 1997 Or 2000 gì đó mình mở trên Office 2016x64 không được
Xin cảm ơn
Thêm Table báo cáo error
 

File đính kèm

Nếu sau này dân chúng họ lên Windows10 hết ko cài được Office 2003 thì mấy file Access 1997 to 2000 trên các phần mềm củ muốn xem lại data thì sao ta ???!!! chắc bỏ quá ( Hiện tại thấy nhiều Cty to trà bá còn Xài Windows Server 2003 )
 
Bây giờ bắt đầu ta lấy dữ liệu từ bảng tblData ra Excel cell bắt đầu là A5.

1./ Lấy tất cả các cột có trong bảng:

Mã:
Sub LayDuLieuTatCaCot()
On Error GoTo loi


Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi


    lsSQL = "SELECT * " & _
            "FROM tblData"
          
    rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
    Cells.ClearContents
    Range("A5").CopyFromRecordset rst
  
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

2./ Lấy 3 cột (SUPPLIER, [MATERIAL NAME], [COLOR NAME]) lưu ý nếu ta select cột nào trước thì nó sẽ ra cột đó trước, ví dụ tôi lấy cột Supplier trước thì nó sẽ hiển thị cột này trước, mặc dù vị trí thực của nó nằm trong bảng ở sau các cột kia.

Mã:
Sub LayDuLieu3Cot()
On Error GoTo loi


Dim lsSQL As String: Dim rst As New ADODB.Recordset
If cnn.State <> 1 Then Moketnoi


    lsSQL = "SELECT SUPPLIER, [MATERIAL NAME], [COLOR NAME] " & _
            "FROM tblData"


          
    rst.Open lsSQL, cnn, adOpenStatic, adLockReadOnly
    Cells.ClearContents
    Range("E5").CopyFromRecordset rst
  
rst.Close
Set rst = Nothing
cnn.Close
Set cnn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

[video=youtube;MH2-fAElpXw]


Cho mình hỏi, ở code trên bạn sẽ copy dữ liệu trường SUPPLIER, [MATERIAL NAME], [COLOR NAME] liền nhau vào excel, bắt đầu từ ô A5. Nếu mình muốn trên excel A5 để dữ liệu SUPPLIER, C5 để dữ liệu MATERIAL NAME, T5 để COLOR NAME thì có cách nào nhanh không bạn?

Mình hỏi thêm hỏi thêm một vấn đề khác, giả sử trong CSDL của bạn có trường POQTY
1593228511209.png
Nếu ở excel mình có một dự liệu nhập hàng hôm đó, muốn: Cứ có hàng hóa mã ID là 1 thì sẽ cộng số excel vào số đã có trên POQTY thì cách cộng trực tiếp vào access không bạn? (mình chưa rành access, hiện thì mình phải dùng code copy dữ liệu POQTY của ID 1 ra ngoài excel, cộng rồi update lại vào excel)
 
Lần chỉnh sửa cuối:
Nếu sau này dân chúng họ lên Windows10 hết ko cài được Office 2003 thì mấy file Access 1997 to 2000 trên các phần mềm củ muốn xem lại data thì sao ta ???!!! chắc bỏ quá ( Hiện tại thấy nhiều Cty to trà bá còn Xài Windows Server 2003 )
office 2016, 365 đều có thể mở được file mdb của 2003 trở về trước. Một số thư viện (ocx) bản cũ khó tìm ảnh hưởng đến ActiveX controls khi mở lên, nhưng có thể thay thế bằng control phiên bản mới
 
office 2016, 365 đều có thể mở được file mdb của 2003 trở về trước. Một số thư viện (ocx) bản cũ khó tìm ảnh hưởng đến ActiveX controls khi mở lên, nhưng có thể thay thế bằng control phiên bản mới
Mấy file Access 1997 to 2000 em mở trên Office 2016 nó ko cho đó Anh
Anh thử file file sau trên Office 2016 xem sao ... Hình như nó là Access 1997 To 2000 gì đó
 

File đính kèm

Mấy file Access 1997 to 2000 em mở trên Office 2016 nó ko cho đó Anh
Anh thử file file sau trên Office 2016 xem sao ... Hình như nó là Access 1997 To 2000 gì đó
Tôi mới thử bằng 2016 thì không được thật vì file kiểu cũ quá (1997-2000, nếu 2003 thì có thể được). Tuy nhiên 2007 hay 2010 thì mở được 1997 vì có tính năng convert, 2013 trở về sau thì không:

1593237595358.png
 
1. Cho mình hỏi, ở code trên bạn sẽ copy dữ liệu trường SUPPLIER, [MATERIAL NAME], [COLOR NAME] liền nhau vào excel, bắt đầu từ ô A5. Nếu mình muốn trên excel A5 để dữ liệu SUPPLIER, C5 để dữ liệu MATERIAL NAME, T5 để COLOR NAME thì có cách nào nhanh không bạn?

2. Mình hỏi thêm hỏi thêm một vấn đề khác, giả sử trong CSDL của bạn có trường POQTY
View attachment 240107
Nếu ở excel mình có một dự liệu nhập hàng hôm đó, muốn: Cứ có hàng hóa mã ID là 1 thì sẽ cộng số excel vào số đã có trên POQTY thì cách cộng trực tiếp vào access không bạn? (mình chưa rành access, hiện thì mình phải dùng code copy dữ liệu POQTY của ID 1 ra ngoài excel, cộng rồi update lại vào excel)
1. Dùng câu lệnh truy vấn bỏ trống cột.

Mã:
Select Supplier,'',MaterialName,'','',.... From...
2. Tạo bảng mới, lấy ID làm mối quan hệ với bảng gốc. Rồi xử lý bằng câu lệnh SQL chứ ai lại cập nhật trực tiếp vào bảng gốc.
 
office 2016, 365 đều có thể mở được file mdb của 2003 trở về trước. Một số thư viện (ocx) bản cũ khó tìm ảnh hưởng đến ActiveX controls khi mở lên, nhưng có thể thay thế bằng control phiên bản mới
Thì trước khi úp hỏi em cũng có tìm hiểu hết rồi Access 1997 to 2000 chỉ mở trên Office 2003 xong Save As To 2003 xong từ 2003 muốn làm gì tiếp với các Build sau đó thì làm tiếp

Sau đó Em có quậy trên Delphi thì vô tình Em thấy Delphi nó xử được File Access 1997 to 2000 bằng cách Compact and Repair Database sau khi chạy xong mở lại file đó nó sẻ hỏi như hình sau thì chọn No xong thoát xong mở lại nó là OK

1.png

Khi nào rảnh Em sẻ viết nó thành 1 Hàm API sử dụng khi cần để cứu dữ liệu File Access 1997 to 2000 mà các máy Windows10 sau này ko còn hổ trợ cài Office 2003 nữa
 
1. Dùng câu lệnh truy vấn bỏ trống cột.

Mã:
Select Supplier,'',MaterialName,'','',.... From...
2. Tạo bảng mới, lấy ID làm mối quan hệ với bảng gốc. Rồi xử lý bằng câu lệnh SQL chứ ai lại cập nhật trực tiếp vào bảng gốc.

Mình hiểu rồi, vấn đề 2 mình có thấy qua vụ thiết lập quan hệ. Để mình nghâm cứu thêm nó. Cảm ơn bạn
 

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

Back
Top Bottom