nguyenhoang_gpe
Thành viên mới

- Tham gia
- 22/3/12
- Bài viết
- 18
- Được thích
- 0
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 ...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!
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
Dùng code sau nhé: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!
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útDù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 ạ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
Ý là nếu ko lựa chọn cột thì bê nguyên con cho nó gọn đó mà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í ....![]()
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
Cảm ơn Bạn đã nhắc nhở ... Quen nhau quá mà nên vui 1 tẹo đó thôiMì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 độ)
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 10Dù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 !Bạn thay dòng:
ThànhMã:AccPath = ThisWorkbook.Path & "\dam2.mdb"
Mã:AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb")
cám ơn bácNế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
Nếu file "dam2.mdb" nằm ổ đĩa C thì code sẽ như thế nào vậy a?Bạn thay dòng:
ThànhMã:AccPath = ThisWorkbook.Path & "\dam2.mdb"
Mã:AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb")
thìNếu file "dam2.mdb" nằm ổ đĩa C thì code sẽ như thế nào vậy a?
AccPath = "C:\dam2.mdb"
Đường dẫn của e như này:thì
AccPath = "C:\dam2.mdb"
thì đơn giản thay cả đoạn nàyĐườ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.
"C:\DonGia.mdb"
e thay mà nó báo lỗi. compile error: syntax errorthì đơn giản thay cả đoạn này
ThisWorkbook.Path & "\DonGia.mdb"
thành
"C:\DonGia.mdb"
OK rồi a ơi.thì đơn giản thay cả đoạn này
ThisWorkbook.Path & "\DonGia.mdb"
thành
"C:\DonGia.mdb"
E chào bác! E cũng đang gặp trường hợp giống bạn đang thắc mắc, e có làm theo hướng dẫn của bác, thì việc lấy dữ liệu từ File Access vào Excel đã thực hiện được, nhưng có 1 chút vấn đề, đó là bảng dữ liệu bên Access khi e đưa sang Excel thì toàn bộ các bảng đều mất đi phần đầu danh mục trên cùng, mong bác giúp e với, thực sự e ko biết gì về VBA, e chỉ mò mẫm theo hướng dẫn của các bác trên này để tự làm. E chân thành cảm ơn!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
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.36")
Set Ws = Db.Workspaces(0)
Set MyDAO = Ws.OpenDatabase(AccPath)
End Function
Public Sub GetDataBase()
Dim Db As Object
Dim Rs As Object
Dim Rp As Object
Dim Rq As Object
Dim AccPath As String
AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb")
Set Db = MyDAO(AccPath)
Set Rs = Db.OpenRecordset("Frame Sections")
Sheets("Frame Sections").Select
Columns("A:V").Select
Selection.Delete
Range("A1").Select
Range("A1").CopyFromRecordset Rs
Set Rp = Db.OpenRecordset("Frame Assignments - Summary")
Sheets("Frame Assignments- Summary").Select
Columns("A:V").Select
Selection.Delete
Range("A1").Select
Range("A1").CopyFromRecordset Rp
Set Rq = Db.OpenRecordset("Column Forces")
Sheets("Column Forces").Select
Columns("A:V").Select
Selection.Delete
Range("A1").Select
Range("A1").CopyFromRecordset Rq
Sheets("ThepCot").Select
Range("A1").Select
End Sub
Bạn phải đổ dữ liệu bắt đầu vào Cell A2, Từ Cell A1 bạn phải thêm 1 động tác nữa là lấy tiêu đề cột của bảng ghi lên đó.E chào bác! E cũng đang gặp trường hợp giống bạn đang thắc mắc, e có làm theo hướng dẫn của bác, thì việc lấy dữ liệu từ File Access vào Excel đã thực hiện được, nhưng có 1 chút vấn đề, đó là bảng dữ liệu bên Access khi e đưa sang Excel thì toàn bộ các bảng đều mất đi phần đầu danh mục trên cùng, mong bác giúp e với, thực sự e ko biết gì về VBA, e chỉ mò mẫm theo hướng dẫn của các bác trên này để tự làm. E chân thành cảm ơn!
Đây là đoạn code e tự chế, bác xem giúp e xem e sai ở đâu ạ?
E có đính kèm ảnh, phần tiêu đề trên cùng mất hết!
Lưu ý là khi e dùng chức năng import external data của excel vào thì phần tiêu đề dòng trên cùng còn nguyên chứ ko bị mất!