Tổng hợp dữ liệu từ các Sheet nhỏ vào 1 Sheet - Tên các sheet nhỏ tăng dần

Liên hệ QC

hadoan-pap

Thành viên tiêu biểu
Tham gia
8/7/15
Bài viết
461
Được thích
20
Em chào mọi người!

Em có 1 file như đính kèm… tên các Sheet nhỏ theo định dạng A-1, A-2.... nó cứ tang dần theo định dạng A-*

Em muốn tại Sheet 'main' … khi click thì dữ lieu tại các sheet con sẽ tự động copy sang... khi copy nó sẽ kiểm tra tại cột A của Sheet 'main', ô nào rỗng thì sẽ paste vào đó ạ. Ví dụ nó chạy từ trên xuống dưới ở cột A để kiểm tra, nếu tại vị trí A5 mà rỗng thì sẽ paste vào đó

Em xin cảm ơn!
 

File đính kèm

Em chào mọi người!

Em có 1 file như đính kèm… tên các Sheet nhỏ theo định dạng A-1, A-2.... nó cứ tang dần theo định dạng A-*

Em muốn tại Sheet 'main' … khi click thì dữ lieu tại các sheet con sẽ tự động copy sang... khi copy nó sẽ kiểm tra tại cột A của Sheet 'main', ô nào rỗng thì sẽ paste vào đó ạ. Ví dụ nó chạy từ trên xuống dưới ở cột A để kiểm tra, nếu tại vị trí A5 mà rỗng thì sẽ paste vào đó

Em xin cảm ơn!
Chỉ đơn giản là copy/paste nối đuôi thôi sao? Nếu gặp item trùng thì có cộng dồn quantity lại không?
 
Upvote 0
Nếu tác giả xác nhận có công dồn thì tôi dùng Consolidate chứ không dic

Thầy ơi em muốn nối đuôi ạ... Từ nãy giờ e cũng mới làm được đoạn code như bên dưới ạ :

Dim i As Integer
Dim myWs As Worksheet
Dim lastrow As Long

For i = 2 To 3

For Each myWs In ThisWorkbook.Sheets
If myWs.Name = "A-" & i Then
lastrow = Sheets(myWs.Name).Range("B" & Rows.Count).End(xlUp).Row - 1
Sheets(myWs.Name).Range("A2:B" & lastrow).Copy
Sheets("main").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
End If
Next

Next I

Em có 1 câu hỏi nhỏ cho bài toán này ạ... em có các Sheet tang dần A1, A2, A3... làm sao để xác định được Sheet lớn nhất để mình vào sheet ó copy dữ liệu ạ.

Ví dụ các Sheet từ A1 đến A100... Làm thế nào để biết được A100 là Sheet lớn nhất ?

E cảm ơn Thầy!
 
Upvote 0
Thầy ơi em muốn nối đuôi ạ... Từ nãy giờ e cũng mới làm được đoạn code như bên dưới ạ :

Dim i As Integer
Dim myWs As Worksheet
Dim lastrow As Long

For i = 2 To 3

For Each myWs In ThisWorkbook.Sheets
If myWs.Name = "A-" & i Then
lastrow = Sheets(myWs.Name).Range("B" & Rows.Count).End(xlUp).Row - 1
Sheets(myWs.Name).Range("A2:B" & lastrow).Copy
Sheets("main").Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
End If
Next

Next I
Không nên copy/paste. Nên dùng mảng code sẽ mượt hơn
Mã:
Sub Test()
  Dim wks As Worksheet
  Dim arr
  For Each wks In ThisWorkbook.Worksheets
    If wks.Name <> "main" Then
      arr = wks.Range("A2:B1000").Value
      Worksheets("Main").Range("A60000").End(xlUp).Offset(1).Resize(999, 2).Value = arr
    End If
  Next
End Sub
----------------------------------
Em có 1 câu hỏi nhỏ cho bài toán này ạ... em có các Sheet tang dần A1, A2, A3... làm sao để xác định được Sheet lớn nhất để mình vào sheet ó copy dữ liệu ạ.
Ví dụ các Sheet từ A1 đến A100... Làm thế nào để biết được A100 là Sheet lớn nhất ?
E cảm ơn Thầy!
So sánh bình thường như số vậy đó. Ví dụ
Mã:
Sub Test2()
  Dim wks As Worksheet
  Dim sTmp As String
  For Each wks In ThisWorkbook.Worksheets
    If wks.Name <> "main" Then
      If sTmp < wks.Name Then sTmp = wks.Name
    End If
  Next
  MsgBox sTmp
End Sub
sTmp chính là sheet "lớn" nhất
 
Upvote 0
Không nên copy/paste. Nên dùng mảng code sẽ mượt hơn
Mã:
Sub Test()
  Dim wks As Worksheet
  Dim arr
  For Each wks In ThisWorkbook.Worksheets
    If wks.Name <> "main" Then
      arr = wks.Range("A2:B1000").Value
      Worksheets("Main").Range("A60000").End(xlUp).Offset(1).Resize(999, 2).Value = arr
    End If
  Next
End Sub
----------------------------------

So sánh bình thường như số vậy đó. Ví dụ
Mã:
Sub Test2()
  Dim wks As Worksheet
  Dim sTmp As String
  For Each wks In ThisWorkbook.Worksheets
    If wks.Name <> "main" Then
      If sTmp < wks.Name Then sTmp = wks.Name
    End If
  Next
  MsgBox sTmp
End Sub
sTmp chính là sheet "lớn" nhất
Em cảm ơn Thầy rất nhiều ạ.
 
Upvote 0
sTmp chính là sheet "lớn" nhất
Thầy ơi. Cho em hỏi 1 chút ạ. sTmp ở dạng chuỗi. Logic thế nào mà nó lại là tên sheet lớn nhất ạ? Tại em test thử. nếu thêm sheet A-11 đằng sau sheet main thì nó vẫn báo là sheet A-3 là sheet lớn nhất.

Nhân tiện nếu cộng dồn số lượng có item trùng. Thầy có thể code tạm cho em coi với được không ạ. để mai mốt em có ứng dụng được gì thì em sẽ học theo ạ

Cám ơn thầy nhiều
 
Upvote 0
Thầy ơi. Cho em hỏi 1 chút ạ. sTmp ở dạng chuỗi. Logic thế nào mà nó lại là tên sheet lớn nhất ạ? Tại em test thử. nếu thêm sheet A-11 đằng sau sheet main thì nó vẫn báo là sheet A-3 là sheet lớn nhất.

Nhân tiện nếu cộng dồn số lượng có item trùng. Thầy có thể code tạm cho em coi với được không ạ. để mai mốt em có ứng dụng được gì thì em sẽ học theo ạ

Cám ơn thầy nhiều
Theo nguyên tắc sort của Excel, nếu ta có "A-1", "A-2", "A-3" và "A11" thì Excel sẽ xếp theo thứ tự tăng dần như sau "A-1", "A-11", "A-2", "A-3" nên "A-3" sẽ được xem là lớn nhất. Nếu bạn muốn "A-11" lớn nhất thì có 2 cách:
1> Tách chuỗi lấy số rồi so sánh
2> Thay đổi định dạng tên sheet, thay vì "A-1", "A-2"... bạn sửa thành "A-01", "A-02"....
--------------------------------------------------------
Cộng dồn item trùng dùng consolidate:
Mã:
Sub Consol()
  Dim wks As Worksheet
  ReDim arr(1 To 1)
  Dim idx As Long
   For Each wks In ThisWorkbook.Worksheets
    If wks.Name <> "main" Then
      idx = idx + 1
      ReDim Preserve arr(1 To idx)
      arr(idx) = "'" & wks.Name & "'!R1C1:R1000C2"
    End If
  Next
  If idx Then
    Worksheets("Main").Range("A1:B1000").Clear
    Worksheets("Main").Range("A1").Consolidate arr, xlSum, True, True
  End If
End Sub
 
Upvote 0
arr(idx) = "'" & wks.Name & "'!R1C1:R1000C2"
Thầy ơi. lúc đầu em thấy thầy khai báo arr( 1 to 1) - Cái này là mảng 1 chiều đúng không ạ
Sau đó thầy lại
Mã:
ReDim Preserve arr(1 To idx)
- cái này vẫn là 1 chiều phải không thầy?
Mã:
"'!R1C1:R1000C2"
- Cái này với mục đích gì thế thầy?
Nếu vùng dữ liệu >1000 dòng thì chỉ cần mở rộng RxxxxC2 thôi ạ
 
Upvote 0
Thầy ơi. lúc đầu em thấy thầy khai báo arr( 1 to 1) - Cái này là mảng 1 chiều đúng không ạ
Đúng rồi bạn!
................................................................
Mã:
"'!R1C1:R1000C2"
- Cái này với mục đích gì thế thầy?
Code consolidate chỉ chấp nhận địa chỉ cells dạng R1C1 nha bạn (có thể thí nghiệm chứng minh)
................................................................
Nếu vùng dữ liệu >1000 dòng thì chỉ cần mở rộng RxxxxC2 thôi ạn!
Đúng rồi bạn!
 
Upvote 0
Web KT

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

Back
Top Bottom