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!
E đã thay A1 thành A2, thì dữ liệu copy chuyển xuống 1 dòng được rồi ạ, e ko biết code để copy tiêu đề bên trên, bác giúp e đoạn code đó với, e cảm ơn!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 đó.
Chỉ cần tạo 1 biến mở Recordset là đủ. Tôi tạm chỉnh code của bạn như sau:E đã thay A1 thành A2, thì dữ liệu copy chuyển xuống 1 dòng được rồi ạ, e ko biết code để copy tiêu đề bên trên, bác giúp e đoạn code đó với, e cảm ơn!
Public Sub GetDataBase()
Dim Db As Object
Dim Rs As Object
Dim AccPath As String
Dim i As Integer
AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb")
Set Db = MyDAO(AccPath)
Set Rs = Db.OpenRecordset("Frame Sections")
With Sheets("Frame Sections")
.Columns("A:V").Delete
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next
.Range("A2").CopyFromRecordset Rs
End With
Rs.Close
Set Rs = Db.OpenRecordset("Frame Assignments - Summary")
With Sheets("Frame Assignments- Summary")
.Columns("A:V").Delete
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next
.Range("A2").CopyFromRecordset Rs
End With
Rs.Close
Set Rs = Db.OpenRecordset("Column Forces")
With Sheets("Column Forces")
.Columns("A:V").Delete
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next
.Range("A2").CopyFromRecordset Rs
End With
Sheets("ThepCot").Select
Range("A1").Select
End Sub
E đã test và thấy đoạn code bác thêm vào hoạt động tốt, toàn bộ phần tiêu đề giờ đã xuất hiện, e đang cố đọc code để hiểuChỉ cần tạo 1 biến mở Recordset là đủ. Tôi tạm chỉnh code của bạn như sau:
E chân thành cảm ơn bác nhé!For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next
Nôm na là khi đổ dữ liệu từ Recordset xuống sheet thì mặc định nó không có tiêu đề cột. Muốn có tiêu đề cột thì bạn phải đọc cái tiêu đề cột trong bảng và ghi xuống sheet. Những dòng code trên có ý nghĩa như thế.E đã test và thấy đoạn code bác thêm vào hoạt động tốt, toàn bộ phần tiêu đề giờ đã xuất hiện, e đang cố đọc code để hiểu
nguyên đoạn code này là để chừa lại dòng trên cùng nhập tên đúng ko bác:
E chân thành cảm ơn bác nhé!
Hic, có chút vấn đề bác ơi, giờ thì vấn đề nhập dữ liệu từ Access sang Excel ok rùi, nhưng khi e nhấn lệnh nhập dữ liệu xong, thì toàn bộ những công thức ở các sheet khác, mà e lấy số liệu từ sheet vừa nhập dữ liệu xong ý bị mất địa chỉ ô toàn bộ, kiểu như hình e gửi kèm ý ạ! Bác giúp e với! E cảm ơn!Nôm na là khi đổ dữ liệu từ Recordset xuống sheet thì mặc định nó không có tiêu đề cột. Muốn có tiêu đề cột thì bạn phải đọc cái tiêu đề cột trong bảng và ghi xuống sheet. Những dòng code trên có ý nghĩa như thế.
Tôi nghĩ bạn đã xóa cả cột A->V nên gặp vấn đề là đúng rồi màHic, có chút vấn đề bác ơi, giờ thì vấn đề nhập dữ liệu từ Access sang Excel ok rùi, nhưng khi e nhấn lệnh nhập dữ liệu xong, thì toàn bộ những công thức ở các sheet khác, mà e lấy số liệu từ sheet vừa nhập dữ liệu xong ý bị mất địa chỉ ô toàn bộ, kiểu như hình e gửi kèm ý ạ! Bác giúp e với! E cảm ơn!
Columns("A:V").Delete
E ko hiểu lắm, e chỉ nghĩ đơn giản là, File này e dùng chung cho nhiều số liệu khác nhau nhập từ 1 file access, nên mỗi lần nhập số liệu mới thì phải xóa số liệu cũ đi, e cứ nghĩ là nó ko ảnh hưởng đến các sheet công thức bên cạnh ??? vậy có cách nào giữ được công thức các sheet khác ko ạ?Tôi nghĩ bạn đã xóa cả cột A->V nên gặp vấn đề là đúng rồi mà
Đoạn sau:
Mã:Columns("A:V").Delete [/QUOTE]
E vừa xóa dòng đó đi và chạy lại, may quá ko bị lỗi gì ạ!Tôi nghĩ bạn đã xóa cả cột A->V nên gặp vấn đề là đúng rồi mà
Đoạn sau:
Mã:Columns("A:V").Delete
Bạn thử sửa:E ko hiểu lắm, e chỉ nghĩ đơn giản là, File này e dùng chung cho nhiều số liệu khác nhau nhập từ 1 file access, nên mỗi lần nhập số liệu mới thì phải xóa số liệu cũ đi, e cứ nghĩ là nó ko ảnh hưởng đến các sheet công thức bên cạnh ??? vậy có cách nào giữ được công thức các sheet khác ko ạ?
Bài đã được tự động gộp:
E vừa xóa dòng đó đi và chạy lại, may quá ko bị lỗi gì ạ!
.Columns("A:V").clearcontents
Nhân đây, bác giúp e chút vấn đề này nữa nhé! File excel e gửi bên trên, có sheet(BxH), sheet này là e nhặt số liệu từ các sheet vừa nhập dữ liệu ban đầu, bác viết giúp e đoạn code sao chép hàng loạt dòng xuống tương ứng với số dòng của bên sheet(Column forces) ý ạ, nghĩa là bên sheet(Column forces) có bao nhiêu dòng thì bên sheet(BxH) tự động copy xuống từng đó dòng ý ạ! E xin chân thành cảm ơn bác!Tôi nghĩ bạn đã xóa cả cột A->V nên gặp vấn đề là đúng rồi mà
Đoạn sau:
Mã:Columns("A:V").Delete
E sửa theo thế thì thì ok luôn rồi ạ! E cảm ơn bác!Bạn thử sửa:
Mã:.Columns("A:V").clearcontents
Đây là đoạn code trước e cóp nhặt và chế ra, nhưng là giới hạn số dòng copy, e ko biết cách để nó tự phát hiện xem sheet(column force) bao nhiêu dòng thì nó tự kéo xuống bấy nhiêu dòng ý ạ, bác sửa giúp e với!Bạn thử sửa:
Mã:.Columns("A:V").clearcontents
Sub ThepCotM22()
Sheets("ThepCot").Select
Range("A11").Select
ActiveCell.Formula = "='Column Forces'!A2"
Range("B11").Select
ActiveCell.Formula = "='Column Forces'!B2"
Range("C11").Select
ActiveCell.Formula = "='Column Forces'!D2"
Range("D11").Select
ActiveCell.Formula = "=abs('Column Forces'!J2)"
Range("E11").Select
ActiveCell.Formula = "=abs('Column Forces'!F2)"
Range("F11").Select
ActiveCell.Formula = "=VLOOKUP(H11,BxH!A:F,6,0)"
Range("I11").Select
ActiveCell.Formula = "=VLOOKUP(H11,BxH!A:F,2,0)"
Range("J11").Select
ActiveCell.Formula = "=VLOOKUP(H11,BxH!A:F,3,0)"
Range("A11:AP11").Select
Selection.AutoFill Destination:=Range("A11:AP37"), Type:=xlFillCopy
Range("A11:AP37").Select
Range("A11").Select
End Sub
Nhân đây, bác giúp e chút vấn đề này nữa nhé! File excel e gửi bên trên, có sheet(BxH), sheet này là e nhặt số liệu từ các sheet vừa nhập dữ liệu ban đầu, bác viết giúp e đoạn code sao chép hàng loạt dòng xuống tương ứng với số dòng của bên sheet(Column forces) ý ạ, nghĩa là bên sheet(Column forces) có bao nhiêu dòng thì bên sheet(BxH) tự động copy xuống từng đó dòng ý ạ! E xin chân thành cảm ơn bác!
Bài đã được tự động gộp:
E sửa theo thế thì thì ok luôn rồi ạ! E cảm ơn bác!
Bài đã được tự động gộp:
Đây là đoạn code trước e cóp nhặt và chế ra, nhưng là giới hạn số dòng copy, e ko biết cách để nó tự phát hiện xem sheet(column force) bao nhiêu dòng thì nó tự kéo xuống bấy nhiêu dòng ý ạ, bác sửa giúp e với!
Selection.AutoFill Destination:=Range("A11:AP37"), Type:=xlFillCopy
Dạ, ý e là sheet(Column Force) có thể có nhiều hơn số hàng đó (hiện giờ file e đang làm là có từng ấy hàng ạ), nghĩa là số hàng là ko biết trước, trường hợp sheet(Column Force) có tầm 123 hàng (chẳng hạn), thì việc để cho code tự phát hiện có bao nhiêu hàng để nó tự động copy xuống hàng cuối cùng của sheet(Column Force) liệu có khả thi ko ạ? E cảm ơn!Bạn thay số tôi tô đỏ bằng số tương ứng của bạn nhé. Hiện tại nó chỉ fill xuống đến dòng 37Rich (BB code):Selection.AutoFill Destination:=Range("A11:AP37"), Type:=xlFillCopy
Bạn phải xác định được số dòng của sheet đó trước rồi tra nó vào. Có rất là nhiều cách nhưng tôi chỉ nói cách sau:Dạ, ý e là sheet(Column Force) có thể có nhiều hơn số hàng đó (hiện giờ file e đang làm là có từng ấy hàng ạ), nghĩa là số hàng là ko biết trước, trường hợp sheet(Column Force) có tầm 123 hàng (chẳng hạn), thì việc để cho code tự phát hiện có bao nhiêu hàng để nó tự động copy xuống hàng cuối cùng của sheet(Column Force) liệu có khả thi ko ạ? E cảm ơn!
Sub test()
dim i as integer
i=Sheets("Column Forces").Range("A1").SpecialCells(xlCellTypeLastCell).Row
MsgBox i
End Sub
Dạ, nghĩa là muốn copy xuống, kiểu gì vẫn phải qua bước đếm xem Sheets("Column Forces") có bao nhiêu hàng đã ạ?Bạn phải xác định được số dòng của sheet đó trước rồi tra nó vào. Có rất là nhiều cách nhưng tôi chỉ nói cách sau:
Tra biến i vào chỗ tôi tô đỏ ở bài trước nhéMã:Sub test() dim i as integer i=Sheets("Column Forces").Range("A1").SpecialCells(xlCellTypeLastCell).Row MsgBox i End Sub
Đúng rồi bạn, mình phải xác định được số dòng tương ứng trước chứ. Bạn có thể xác định nó khi lấy dữ liệuDạ, nghĩa là muốn copy xuống, kiểu gì vẫn phải qua bước đếm xem Sheets("Column Forces") có bao nhiêu hàng đã ạ?
Sau đó ứng với từng File cụ thể thì mình sẽ sửa code để máy tự động chạy xuống từng đó dòng ạ?
E cảm ơn bác!
Public Sub GetDataBase()
Dim Db As Object
Dim Rs As Object
Dim AccPath As String
Dim i As Integer
Dim sodong As Integer
AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb")
Set Db = MyDAO(AccPath)
Set Rs = Db.OpenRecordset("Frame Sections")
With Sheets("Frame Sections")
.Columns("A:V").ClearContents
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next
sodong = Rs.RecordCount + 1
MsgBox "So dong cua sheet [Frame Sections] la: " & sodong
.Range("A2").CopyFromRecordset Rs
End With
Rs.Close
Set Rs = Db.OpenRecordset("Frame Assignments - Summary")
With Sheets("Frame Assignments- Summary")
.Columns("A:V").ClearContents
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next
sodong = Rs.RecordCount + 1
MsgBox "So dong cua sheet [Frame Assignments- Summary] la: " & sodong
.Range("A2").CopyFromRecordset Rs
End With
Rs.Close
Set Rs = Db.OpenRecordset("Column Forces")
With Sheets("Column Forces")
.Columns("A:V").ClearContents
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next
sodong = Rs.RecordCount + 1
MsgBox "So dong cua sheet [Column Forces] la: " & sodong
.Range("A2").CopyFromRecordset Rs
End With
Sheets("ThepCot").Select
Range("A1").Select
End Sub
Public Sub GetDataBase()
Dim Db As Object, Rs As Object
Dim AccPath As String, TenSheet As String
Dim i As Integer, SoDong As Integer, iSht As Integer
Dim arrTenSheet As Variant
arrTenSheet = Array("Frame Sections", "Frame Assignments - Summary", "Column Forces")
AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb")
Set Db = MyDAO(AccPath)
For iSht = 0 To 2
TenSheet = arrTenSheet(iSht)
Set Rs = Db.OpenRecordset(TenSheet)
With Sheets(TenSheet)
.Columns("A:V").ClearContents
For i = 0 To Rs.Fields.Count - 1
.Cells(1, i + 1) = Rs.Fields(i).Name
Next
SoDong = Rs.RecordCount + 1
MsgBox "So dong cua sheet " & TenSheet & " la: " & SoDong
.Range("A2").CopyFromRecordset Rs
End With
Rs.Close
Next
Sheets("ThepCot").Select
Range("A1").Select
End Sub
E cảm ơn bác nhiều!Đúng rồi bạn, mình phải xác định được số dòng tương ứng trước chứ. Bạn có thể xác định nó khi lấy dữ liệu
Mã:Public Sub GetDataBase() Dim Db As Object Dim Rs As Object Dim AccPath As String Dim i As Integer Dim sodong As Integer AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb") Set Db = MyDAO(AccPath) Set Rs = Db.OpenRecordset("Frame Sections") With Sheets("Frame Sections") .Columns("A:V").ClearContents For i = 0 To Rs.Fields.Count - 1 .Cells(1, i + 1) = Rs.Fields(i).Name Next sodong = Rs.RecordCount + 1 MsgBox "So dong cua sheet [Frame Sections] la: " & sodong .Range("A2").CopyFromRecordset Rs End With Rs.Close Set Rs = Db.OpenRecordset("Frame Assignments - Summary") With Sheets("Frame Assignments- Summary") .Columns("A:V").ClearContents For i = 0 To Rs.Fields.Count - 1 .Cells(1, i + 1) = Rs.Fields(i).Name Next sodong = Rs.RecordCount + 1 MsgBox "So dong cua sheet [Frame Assignments- Summary] la: " & sodong .Range("A2").CopyFromRecordset Rs End With Rs.Close Set Rs = Db.OpenRecordset("Column Forces") With Sheets("Column Forces") .Columns("A:V").ClearContents For i = 0 To Rs.Fields.Count - 1 .Cells(1, i + 1) = Rs.Fields(i).Name Next sodong = Rs.RecordCount + 1 MsgBox "So dong cua sheet [Column Forces] la: " & sodong .Range("A2").CopyFromRecordset Rs End With Sheets("ThepCot").Select Range("A1").Select End Sub
E giờ mới để ý thấy bác giúp e rút gọn lại code!Rút gọn code trên lại một chút. Lưu ý tên bảng phải giống tên sheet nhé.
Mã:Public Sub GetDataBase() Dim Db As Object, Rs As Object Dim AccPath As String, TenSheet As String Dim i As Integer, SoDong As Integer, iSht As Integer Dim arrTenSheet As Variant arrTenSheet = Array("Frame Sections", "Frame Assignments - Summary", "Column Forces") AccPath = Application.GetOpenFilename("TEXT FILES(*.mdb),*.mdb") Set Db = MyDAO(AccPath) For iSht = 0 To 2 TenSheet = arrTenSheet(iSht) Set Rs = Db.OpenRecordset(TenSheet) With Sheets(TenSheet) .Columns("A:V").ClearContents For i = 0 To Rs.Fields.Count - 1 .Cells(1, i + 1) = Rs.Fields(i).Name Next SoDong = Rs.RecordCount + 1 MsgBox "So dong cua sheet " & TenSheet & " la: " & SoDong .Range("A2").CopyFromRecordset Rs End With Rs.Close Next Sheets("ThepCot").Select Range("A1").Select End Sub
E xin chân thành cảm ơn sự nhiệt tình của bác!Rows("11:11").Select
Selection.Copy
Range(Selection, Selection.End(xlDown)).Select
ActiveSheet.Paste
Application.CutCopyMode = False
Dùng xlDown bạn lưu ý là dữ liệu của bạn phải liên tục, không có ô nào bị trống nhé.E giờ mới để ý thấy bác giúp e rút gọn lại code!
E vừa chạy thử, code báo cho số dòng, nhưng bị lỗi như trong ảnh ạ!
Với lại bác ko cần sửa lỗi này nữa đâu ạ, trước khi chạy code e để ý số dòng cũng được!
Có điều, e nhớ cũng lâu rồi, cách đây 3, 4 năm gì đó, có lần e xem trên mạng có đoạn code cho phép copy (thay cho thao tác bôi đen hàng trên (như bảng của e là bôi đen row(11:11), sau đó đặt chuột vào dấu cộng màu đen rồi kéo xuống, đến khi nào đến dòng cuối của sheet("Column Forces") thì dừng lại), kiểu như có code để tự động phát hiện ra dòng cuối của sheet("Column Forces") ý ạ!
E có tìm trong File hồi xưa, có đoạn code thế này, bác xem giúp e ko biết có phải là nó ko?
E xin chân thành cảm ơn sự nhiệt tình của bác!