Lấy dữ liệu từ access vào excel bằng VBA

Liên hệ QC

nguyenhoang_gpe

Thành viên mới
Tham gia
22/3/12
Bài viết
18
Được thích
0
Em có file này muốn nhờ các bác viết code để lấy dữ liệu từ access điền vào file excel. Chi tiết em ghi trong file đính kèm. Cám ơn các bác!
 

File đính kèm

  • hoi gpe.rar
    184.1 KB · Đọc: 138
Em có file này muốn nhờ các bác viết code để lấy dữ liệu từ access điền vào file excel. Chi tiết em ghi trong file đính kèm. Cám ơn các bác!
Nếu Lấy nguyên 1 TableName lên Sheet thì đơn giản lắm ... Bạn có Thể sử dụng ADO Or DAO để lấy lên Sheet ...

Mình xài cả 2 cái như nhau ...trong trường hợp này Mình Viết DAO cho Bạn vì theo mình áp dụng cho Access code nó sẻ đơn giản nhất

1/ Mình viết tặng Bạn Một cái Hàm DAO đơn giản nhất sau này bạn sẻ sử dụng nó cho nhiều trường hợp khác ... vv
2/ Code lấy dữ liệu từ 1 TableName lên từ đó tham khảo mà viết thêm
Mã:
Public Function MyDAO(ByVal AccPath As String)
    Dim Db As Object, Ws As Object
    Rem Neu Office 2003 - 2007 Use 36 Or 2010 To 2016 Use 120
    Set Db = CreateObject("DAO.DBEngine.120")
    Set Ws = Db.Workspaces(0)
    Set MyDAO = Ws.OpenDatabase(AccPath)
End Function
 
Public Sub GetDataBase()
    Dim Db As Object
    Dim Rs As Object
    Dim AccPath As String
    AccPath = ThisWorkbook.Path & "\dam2.mdb"
    Set Db = MyDAO(AccPath)
    Set Rs = Db.OpenRecordset("Beam Forces")
    Range("A10").CopyFromRecordset Rs
End Sub
 
Lần chỉnh sửa cuối:
Em có file này muốn nhờ các bác viết code để lấy dữ liệu từ access điền vào file excel. Chi tiết em ghi trong file đính kèm. Cám ơn các bác!
Dùng code sau nhé:

Mã:
Sub LayDLAccess_HLMT()
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\dam2.mdb"
    Sheet7.Range("A10").CopyFromRecordset cn.Execute("Select Story,Beam,CaseCombo,Station,P,V2,V3,T,M2,M3 From [Beam Forces]")
    Sheet7.Range("Z10").CopyFromRecordset cn.Execute("SELECT Story, Label, UniqueName, Type, Length, AnalysisSect, DesignSect, MaxStaSpcg, MinNumSta FROM [Frame Assignments - Summary]")
End Sub
 
Rất cám ơn bác kieu manh, em mới tìm hiểu vba, code nên còn lơ mơ lắm,
Em muốn lấy giữ liệu kiểu như chọn đường dẫn đến file access (code em để ở sheet 1), còn trong bảng Beam force em không lấy cột "UniqeName , Element, Elemstation, Location"
( không phải lấy hết dữ liệu bảng). Cám ơn bác
 
Dùng code sau nhé:

Mã:
Sub LayDLAccess_HLMT()
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\dam2.mdb"
    Sheet7.Range("A10").CopyFromRecordset cn.Execute("Select Story,Beam,CaseCombo,Station,P,V2,V3,T,M2,M3 From [Beam Forces]")
    Sheet7.Range("Z10").CopyFromRecordset cn.Execute("SELECT Story, Label, UniqueName, Type, Length, AnalysisSect, DesignSect, MaxStaSpcg, MinNumSta FROM [Frame Assignments - Summary]")
End Sub
Đến bây giờ Mạnh thấy code viết thuần ADO đầu vẫn U lên vài cục .... Mạnh đang suy nghĩ giữa copy Nguyên 1 cục từ Table lên và SELECT nó khác nhau cơ bản chỗ Nào Nhỉ .... Tiện đây Bạn chỉ cho Mạnh học thêm một chút

Theo Mạnh nếu không tùy chọn Các Cột [Mạnh tạm keo Vậy cho dễ nhớ] thì copy nguyên cục lên có phải gọn hơn không ... nếu Mạnh nói sai Bỏ qua câu này :D
Xin cảm ơn
 
Lần chỉnh sửa cuối:
Dùng code sau nhé:

Mã:
Sub LayDLAccess_HLMT()
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\dam2.mdb"
    Sheet7.Range("A10").CopyFromRecordset cn.Execute("Select Story,Beam,CaseCombo,Station,P,V2,V3,T,M2,M3 From [Beam Forces]")
    Sheet7.Range("Z10").CopyFromRecordset cn.Execute("SELECT Story, Label, UniqueName, Type, Length, AnalysisSect, DesignSect, MaxStaSpcg, MinNumSta FROM [Frame Assignments - Summary]")
End Sub
Cám ơn bác nhiều, bác chỉnh giúp em cái đường dẫn file access là mình tự chọn kiểu như OPEN ấy đc không ạ
 
Đến bây giờ Mạnh thấy code viết thuần ADO đầu vẫn U lên vài cục .... Mạnh đang suy nghĩ giữa copy Nguyên 1 cục từ Table lên và SELECT nó khác nhau cơ bản chỗ Nào Nhỉ .... Tiện đây Chuyên gia chỉ cho Mạnh học thêm một chút

Theo Mạnh nếu không tùy chọn Các Cột [Mạnh tạm keo Vậy cho dễ nhớ] thì copy nguyên cục lên có phải gọn hơn không ... nếu Mạnh nói sai Bỏ qua câu này :D
Xin cảm ơn

Nhìn là thấy khác liền chứ nhỉ.
1. Bác vào nhà người ta: bác dọn luôn cả nhà -> Bác tham quá
2. Người ta vào nhà bác: thôi lựa (select) vài cái có giá trị (dựa vào tiêu đề cột) lấy vài món -> ít tham hơn bác tí ....:D
 
Nhìn là thấy khác liền chứ nhỉ.
1. Bác vào nhà người ta: bác dọn luôn cả nhà -> Bác tham quá
2. Người ta vào nhà bác: thôi lựa (select) vài cái có giá trị (dựa vào tiêu đề cột) lấy vài món -> ít tham hơn bác tí ....:D
Ý là nếu ko lựa chọn cột thì bê nguyên con cho nó gọn đó mà """:::":\
 
Cám ơn bác nhiều, bác chỉnh giúp em cái đường dẫn file access là mình tự chọn kiểu như OPEN ấy đc không ạ
Bạn thay dòng:
Mã:
AccPath = ThisWorkbook.Path & "\dam2.mdb"
Thành
Mã:
AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb")
 
Mạnh đang suy nghĩ giữa copy Nguyên 1 cục từ Table lên và SELECT nó khác nhau cơ bản chỗ Nào Nhỉ .... Tiện đây Chuyên gia chỉ cho Mạnh học thêm một chút

Mình quen nhau quá rồi, bỏ tiếng chuyên gia đi bạn.

Đối với Access thì khác nhau rất ít. Tôi nghĩ Access chứa dữ liệu theo kiểu isam, dòng nào ra dòng nấy, trước sau gì cũng đọc hết dữ liệu một dòng mới đến dòng kế.

Đối với CSDL khác thì có thể khác nhau nhiều hơn vì mấy cái bự như SQL Server, Oracle có thể chứa dữ liệu ở nhiều chỗ. Đọc ít dữ liệu trong dòng hơn có thể nhanh hơn.

ADO còn vấn đề chuyển đổi dạng dữ liệu nữa. Ví dụ dữ liệu DateTime trong CSDL phải chuẩn hoá lại để Excel hiểu.

Thêm vấn đề nếu dữ liệu lấy qua mạng thì lấy dư có nghĩa là phí băng thông -> chậm hơn 1 chút.

(Đối với toi thì ba cái "chậm" này không quan trọng lắm, nhưng tôi nhớ khong lầm thì bạn rất trọng tốc độ)
 
Mình quen nhau quá rồi, bỏ tiếng chuyên gia đi bạn.

Đối với Access thì khác nhau rất ít. Tôi nghĩ Access chứa dữ liệu theo kiểu isam, dòng nào ra dòng nấy, trước sau gì cũng đọc hết dữ liệu một dòng mới đến dòng kế.

Đối với CSDL khác thì có thể khác nhau nhiều hơn vì mấy cái bự như SQL Server, Oracle có thể chứa dữ liệu ở nhiều chỗ. Đọc ít dữ liệu trong dòng hơn có thể nhanh hơn.

ADO còn vấn đề chuyển đổi dạng dữ liệu nữa. Ví dụ dữ liệu DateTime trong CSDL phải chuẩn hoá lại để Excel hiểu.

Thêm vấn đề nếu dữ liệu lấy qua mạng thì lấy dư có nghĩa là phí băng thông -> chậm hơn 1 chút.

(Đối với toi thì ba cái "chậm" này không quan trọng lắm, nhưng tôi nhớ khong lầm thì bạn rất trọng tốc độ)
Cảm ơn Bạn đã nhắc nhở ... Quen nhau quá mà nên vui 1 tẹo đó thôi :D
 
cám ơn tất cả các bác, em đã đạt đc mục đích, thân ái !
 
Dùng code sau nhé:

Mã:
Sub LayDLAccess_HLMT()
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\dam2.mdb"
    Sheet7.Range("A10").CopyFromRecordset cn.Execute("Select Story,Beam,CaseCombo,Station,P,V2,V3,T,M2,M3 From [Beam Forces]")
    Sheet7.Range("Z10").CopyFromRecordset cn.Execute("SELECT Story, Label, UniqueName, Type, Length, AnalysisSect, DesignSect, MaxStaSpcg, MinNumSta FROM [Frame Assignments - Summary]")
End Sub
Bác 2LMT giúp em với. code của bác hoạt động trên máy bàn của em thì ổn rồi nhưng sang máy laptop của em thì báo lỗi '3706' mặc dù cả 2 máy đều chạy of 2010 và win 10
 
Nếu Lấy nguyên 1 TableName lên Sheet thì đơn giản lắm ... Bạn có Thể sử dụng ADO Or DAO để lấy lên Sheet ...

Mình xài cả 2 cái như nhau ...trong trường hợp này Mình Viết DAO cho Bạn vì theo mình áp dụng cho Access code nó sẻ đơn giản nhất

1/ Mình viết tặng Bạn Một cái Hàm DAO đơn giản nhất sau này bạn sẻ sử dụng nó cho nhiều trường hợp khác ... vv
2/ Code lấy dữ liệu từ 1 TableName lên từ đó tham khảo mà viết thêm
Mã:
Public Function MyDAO(ByVal AccPath As String)
    Dim Db As Object, Ws As Object
    Rem Neu Office 2003 - 2007 Use 36 Or 2010 To 2016 Use 120
    Set Db = CreateObject("DAO.DBEngine.120")
    Set Ws = Db.Workspaces(0)
    Set MyDAO = Ws.OpenDatabase(AccPath)
End Function
 
Public Sub GetDataBase()
    Dim Db As Object
    Dim Rs As Object
    Dim AccPath As String
    AccPath = ThisWorkbook.Path & "\dam2.mdb"
    Set Db = MyDAO(AccPath)
    Set Rs = Db.OpenRecordset("Beam Forces")
    Range("A10").CopyFromRecordset Rs
End Sub
cám ơn bác
 
Đường dẫn của e như này:
DbConDG.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.Path & "\DonGia.mdb"
hiện tại 2 file nằm cùng folder thì nó nhận. nhưng file DonGia nằm ổ C thì nó không nhận.
thì đơn giản thay cả đoạn này
ThisWorkbook.Path & "\DonGia.mdb"
thành
"C:\DonGia.mdb"
 
thì đơn giản thay cả đoạn này
ThisWorkbook.Path & "\DonGia.mdb"
thành
"C:\DonGia.mdb"
e thay mà nó báo lỗi. compile error: syntax error

Private Sub UserForm_Activate()
Sheets("DTCT").Select
TopRow = Cells.Find("DuToanChiTiet").Row
BotRow = Cells.Find("KetThucDuToan").Row
If DbConDG Is Nothing Then
Set DbConDG = CreateObject("ADODB.Connection")
DbConDG.Open "Provider = Microsoft.Jet.OLEDB.4.0;Data Source="C:\DonGia.mdb"
End If
Set RsDmcv = CreateObject("ADODB.RecordSet")
RsDmcv.Open "SELECT * FROM [DonGia]", DbConDG, adOpenKeyset, adLockPessimistic
UpdataToListBox

cThem = "Th" & ChrW(234) & "m"
cLuu = "L" & ChrW(432) & "u"
cSua = "S" & ChrW(7917) & "a"

CmdThem.Caption = cThem
CmdSua.Caption = cSua

OnOffTxt False
End Sub
Bài đã được tự động gộp:

thì đơn giản thay cả đoạn này
ThisWorkbook.Path & "\DonGia.mdb"
thành
"C:\DonGia.mdb"
OK rồi a ơi.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom