Thử code này coiGửi anhc hị và các bạnAnh chị và các bạn có thể giúp mình mã VBA để biết dữ liệu là mình đã gộp từ sheet nào được không ah.
Ví dụ ở sheet tổng có dữ liệu và thông tin của sheet lấy dữ liệu/ mình có thể đặt tên bất kỳ khi dữ liệu đó được gộp vào sheet tổng.
Cám ơn anh chị em
View attachment 272670
Sub ABC()
Dim ws As Worksheet, iR&
For Each ws In Worksheets
If ws.Name <> "Combined" Then
iR = Sheets("Combined").Range("A" & Rows.Count).End(3).Row + 1
ws.Range("A2").Resize(ws.Range("A" & Rows.Count).End(3).Row, 2).Copy Sheets("Combined").Range("A" & iR)
Sheets("Combined").Range("C" & iR).Resize(ws.Range("A" & Rows.Count).End(3).Row - 1) = ws.Name
End If
Next
End Sub
Cám ơn anh Thuận rất nhiều. Bin đã chạy được đúng như ý.Thử code này coi
Mã:Sub ABC() Dim ws As Worksheet, iR& For Each ws In Worksheets If ws.Name <> "Combined" Then iR = Sheets("Combined").Range("A" & Rows.Count).End(3).Row + 1 ws.Range("A2").Resize(ws.Range("A" & Rows.Count).End(3).Row, 2).Copy Sheets("Combined").Range("A" & iR) Sheets("Combined").Range("C" & iR).Resize(ws.Range("A" & Rows.Count).End(3).Row - 1) = ws.Name End If Next End Sub
Thử code này coiGửi anh @BuiQuangThuan
Phiền anh giúp đỡ một chút xíu nữa về VBA.
Giả sử bây giờ trong tệp có nhiều Sheet và mình chỉ lấy một số Sheet không lấy hết, sau đó đặt lại tên của Sheet.
Ví dụ:
Trong tệp mẫu có 3 Sheet, nhưng chỉ lấy dữ liệu hai sheet có tên là "Clearance" và "Operration", phần nguồn trong Sheet "Combined" sẽ là "CLR" và "OPS".
Cám ơn anh Thuần nhiều.
Sub ABC()
Dim ws As Worksheet, iR&, x
Set ws = Sheets("Combined")
For Each x In Array("Clearance", "Operration")
iR = ws.Range("A" & Rows.Count).End(3).Row + 1
Sheets(x).Range("A2").Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row, 2).Copy ws.Range("A" & iR)
'Chinh vi tri luu ten sheet o day
If x = "Clearance" Then
ws.Range("C" & iR).Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row - 1) = "CLR"
Else
ws.Range("C" & iR).Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row - 1) = "OPS"
End If
Next
End Sub
Nên làm trường hợp tổng quát cho nhiều sheets hơn là chỉ có 2 sheets.Thử code này coi
Mã:Sub ABC() Dim ws As Worksheet, iR&, x Set ws = Sheets("Combined") For Each x In Array("Clearance", "Operration") iR = ws.Range("A" & Rows.Count).End(3).Row + 1 Sheets(x).Range("A2").Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row, 2).Copy ws.Range("A" & iR) 'Chinh vi tri luu ten sheet o day If x = "Clearance" Then ws.Range("C" & iR).Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row - 1) = "CLR" Else ws.Range("C" & iR).Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row - 1) = "OPS" End If Next End Sub
Bạn gõ trên sheet như sau:Gửi anh @BuiQuangThuan
Phiền anh giúp đỡ một chút xíu nữa về VBA.
Giả sử bây giờ trong tệp có nhiều Sheet và mình chỉ lấy một số Sheet không lấy hết, sau đó đặt lại tên của Sheet.
Ví dụ:
Trong tệp mẫu có 3 Sheet, nhưng chỉ lấy dữ liệu hai sheet có tên là "Clearance" và "Operration", phần nguồn trong Sheet "Combined" sẽ là "CLR" và "OPS".
Cám ơn anh Thuần nhiều.
Sub GopDL_HLMT()
Dim strSht() As String, strShtName() As String, i As Integer, strSQL As String
strSht = Split(Sheet5.Range("G2"), ",")
strShtName = Split(Sheet5.Range("H2"), ",")
For i = LBound(strSht) To UBound(strSht)
strSQL = strSQL & " Union All Select [Name], [Age], '" & strShtName(i) & "'" & " From [" & strSht(i) & "$]"
Next
With CreateObject("ADODB.Recordset")
.Open (Right(strSQL, Len(strSQL) - 10)), "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0 Xml;"
Sheet5.Range("A10").CopyFromRecordset .DataSource
End With
End Sub
Cám ơn bác @BuiQuangThuan rất nhiều. Bin đã chạy được tệp.Thử code này coi
Mã:Sub ABC() Dim ws As Worksheet, iR&, x Set ws = Sheets("Combined") For Each x In Array("Clearance", "Operration") iR = ws.Range("A" & Rows.Count).End(3).Row + 1 Sheets(x).Range("A2").Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row, 2).Copy ws.Range("A" & iR) 'Chinh vi tri luu ten sheet o day If x = "Clearance" Then ws.Range("C" & iR).Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row - 1) = "CLR" Else ws.Range("C" & iR).Resize(Sheets(x).Range("A" & Rows.Count).End(3).Row - 1) = "OPS" End If Next End Sub
Bỏ chung 2 files vào chung thư mục rồi chạy code sau:Cám ơn @BuiQuangThuan; @Hai Lúa Miền Tây; @Hoàng Tuấn 868 đã quan tâm và hỗ trợ.
Bin xin phép các anh chị và các bạn giúp đỡ thêm chút xíu.
Bây giờ trong trường hợp khác nữa, dữ liệu cần gộp nằm ở một tệp khác thì mình phải làm như thế nào.
Từ tệp "combine_Sheets_New" mở tệp "raw_Sheets" và lấy 3 thẻ và gộp nối dữ liệu lại.
Xin cám ơn anh chị và các bạn rất nhiều. Mong nhận được chỉ dẫn để học hỏi thêm kiến thức.
View attachment 273137
Sub GopDL_HLMT()
Dim strSht() As String, strShtName() As String, i As Integer, strSQL As String
strSht = Split(Sheet5.Range("E9"), ",")
strShtName = Split(Sheet5.Range("F9"), ",")
For i = LBound(strSht) To UBound(strSht)
strSQL = strSQL & " Union All Select [Name], [Age], '" & strShtName(i) & "'" & " From [" & strSht(i) & "$]"
Next
With CreateObject("ADODB.Recordset")
.Open (Right(strSQL, Len(strSQL) - 10)), "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "/raw_Sheets.xlsm;Extended Properties=Excel 12.0 Xml;"
Sheet5.Range("A14").CopyFromRecordset .DataSource
End With
End Sub