Sửa lại code của bạn.Chào các bác. Các bác bổ xung cho em thêm code để điền ô ngày tháng ở sheets"Main" giống trong sheet "Tổng hợp" với
Ngày tháng này lấy ở ô A7 của các sheets cần gộp.
Public Sub GPE()
Dim sArr(), dArr(1 To 65000, 1 To 250), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
sArr = Ws.Range("A17:A" & Ws.[B65000].End(xlUp).Row).Resize(, Ws.[L17].End(xlToLeft).Column)
If Ws.[L17].End(xlToLeft).Column > Col Then Col = Ws.[L17].End(xlToLeft).Column
For I = 1 To UBound(sArr, 1)
K = K + 1
dArr(K, 1) = Ws.Range("A7")
For J = 2 To UBound(sArr, 2)
dArr(K, J) = sArr(I, J)
Next J
Next I
End If
Next
With Sheets("MAIN")
.[A4:IV65000].ClearContents
If K Then .[A4].Resize(K, Col).Value = dArr
End With
End Sub
Cảm ơn anh nhiều nha.Sửa lại code của bạn.
Bạn đổi tên Sheets("Tổng hợp") thành "Tong hop" rồi chạy code nhé!
PHP:Public Sub GPE() Dim sArr(), dArr(1 To 65000, 1 To 250), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet For Each Ws In ThisWorkbook.Worksheets If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then sArr = Ws.Range("A17:A" & Ws.[B65000].End(xlUp).Row).Resize(, Ws.[L17].End(xlToLeft).Column) If Ws.[L17].End(xlToLeft).Column > Col Then Col = Ws.[L17].End(xlToLeft).Column For I = 1 To UBound(sArr, 1) K = K + 1 dArr(K, 1) = Ws.Range("A7") For J = 2 To UBound(sArr, 2) dArr(K, J) = sArr(I, J) Next J Next I End If Next With Sheets("MAIN") .[A4:IV65000].ClearContents If K Then .[A4].Resize(K, Col).Value = dArr End With End Sub
Chào anh.Sửa lại code của bạn.
Bạn đổi tên Sheets("Tổng hợp") thành "Tong hop" rồi chạy code nhé!
PHP:Public Sub GPE() Dim sArr(), dArr(1 To 65000, 1 To 250), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet For Each Ws In ThisWorkbook.Worksheets If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then sArr = Ws.Range("A17:A" & Ws.[B65000].End(xlUp).Row).Resize(, Ws.[L17].End(xlToLeft).Column) If Ws.[L17].End(xlToLeft).Column > Col Then Col = Ws.[L17].End(xlToLeft).Column For I = 1 To UBound(sArr, 1) K = K + 1 dArr(K, 1) = Ws.Range("A7") For J = 2 To UBound(sArr, 2) dArr(K, J) = sArr(I, J) Next J Next I End If Next With Sheets("MAIN") .[A4:IV65000].ClearContents If K Then .[A4].Resize(K, Col).Value = dArr End With End Sub
Gửi lại bạn.Cảm ơn anh nhiều nha.
Bài đã được tự động gộp:
Chào anh.
Anh có thể add thêm tên sheets vào thêm một cột nữa được không ạ?
Public Sub GPE()
Dim sArr(), dArr(1 To 65000, 1 To 250), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
sArr = Ws.Range("A17:A" & Ws.[B65000].End(xlUp).Row).Resize(, Ws.[L17].End(xlToLeft).Column)
If Ws.[L17].End(xlToLeft).Column > Col Then Col = Ws.[L17].End(xlToLeft).Column
For I = 1 To UBound(sArr, 1)
K = K + 1
dArr(K, 1) = Ws.Range("A7")
For J = 2 To UBound(sArr, 2)
dArr(K, J) = sArr(I, J)
Next J
dArr(K, Col + 1) = Ws.Name
Next I
End If
Next
With Sheets("MAIN")
.[A4:IV65000].ClearContents
If K Then .[A4].Resize(K, Col + 1).Value = dArr
End With
End Sub
Gửi lại bạn.
Thêm cột tên sheets vào cuối cùng.
PHP:Public Sub GPE() Dim sArr(), dArr(1 To 65000, 1 To 250), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet For Each Ws In ThisWorkbook.Worksheets If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then sArr = Ws.Range("A17:A" & Ws.[B65000].End(xlUp).Row).Resize(, Ws.[L17].End(xlToLeft).Column) If Ws.[L17].End(xlToLeft).Column > Col Then Col = Ws.[L17].End(xlToLeft).Column For I = 1 To UBound(sArr, 1) K = K + 1 dArr(K, 1) = Ws.Range("A7") For J = 2 To UBound(sArr, 2) dArr(K, J) = sArr(I, J) Next J dArr(K, Col + 1) = Ws.Name Next I End If Next With Sheets("MAIN") .[A4:IV65000].ClearContents If K Then .[A4].Resize(K, Col + 1).Value = dArr End With End Sub
Gửi bạn Oanh Thơ,Xin chào @vanthinh3101
Bạn có thể thay thế cái phần dArr(1 To 65000, 1 To 250) bằng cách sử dụng ReDim để Oanh Thơ học hỏi thêm được không ạ.
@Nguyễn Hoàng Oanh ThơXin chào @vanthinh3101
Bạn có thể thay thế cái phần dArr(1 To 65000, 1 To 250) bằng cách sử dụng ReDim để Oanh Thơ học hỏi thêm được không ạ.
@Nguyễn Hoàng Oanh Thơ
"Học hỏi thêm" - là hỏi thêm cái gì đó. Chỉ là số 65000 > 250 . 65000 / 250 = 260.
Muốn động thì cứ Chạy từng Sheet thôi, dArr sẽ được ReDim cho từng sheet (theo UBound(sArr))Xin chào HeSanbi,
OT muốn học hỏi xem có cách khai báo động nào mà không phải khai báo các con số cụ thể 65000 và 250 trong mảng dArr đó ạ.
Nếu cứ muốn biết cần bao nhiêu dòng thì trước tiên duyệtXin chào HeSanbi,
OT muốn học hỏi xem có cách khai báo động nào mà không phải khai báo các con số cụ thể 65000 và 250 trong mảng dArr đó ạ.
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
...
End If
Next
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
...
End If
Next
Cái bạn cần biết ở đây là.Xem cái mảng kết quả của mình dữ liệu lớn nhất có thể sảy ra.Rồi chọn con số lơn nhất đó để khai báo là được.Xin chào @vanthinh3101
Bạn có thể thay thế cái phần dArr(1 To 65000, 1 To 250) bằng cách sử dụng ReDim để Oanh Thơ học hỏi thêm được không ạ.
Nếu cứ muốn biết cần bao nhiêu dòng thì trước tiên duyệt
Chỗ ... thì xác định dòng cuối của sheet hiện hành. Biết dòng đầu là 17 thì tính ra số dòng có dữ liệu. Rồi cộng dồn các số dòng của từng sheet thì có số dòng cần "quan tâm". Như thế trước khi vào cụmMã:For Each Ws In ThisWorkbook.Worksheets If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then ... End If Next
chính thì Redim thôi.Mã:For Each Ws In ThisWorkbook.Worksheets If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then ... End If Next
Mà chỉ lấy 7 giá trị mỗi dòng thì cần gì 1 To 250?
Cái bạn cần biết ở đây là.Xem cái mảng kết quả của mình dữ liệu lớn nhất có thể sảy ra.Rồi chọn con số lơn nhất đó để khai báo là được.
Vd.Con chào bác,
Con cũng nghĩ là ReDim ạ nhưng con vẫn lơ mơ về cái này.
Bác cho con ví dụ chi tiết cụ thể hơn khi áp dụng vào code bài #4 được không ạ.
Sub test()
Dim r As Long, c As Long, sodong As Long, Arr()
' trong truong hop cu the thi tinh toan sodong
sodong = 1234
ReDim Arr(1 To sodong, 1 To 10)
For r = 1 To UBound(Arr)
For c = 1 To UBound(Arr, 2)
Arr(r, c) = r & c
Next c
Next r
Sheet1.Range("B7").Resize(sodong, 7).Value = Arr
End Sub
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
...
End If
Next
Dim dArr()
Dim sodong As Long
...
' chỗ này đã có sodong
' tiếp theo trước khi vào "cụm" chính thì Redim
Redim dArr(1 to sodong, 1 to 7)
' cụm chính
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
...
End If
Next
Vd.
---------------------------Mã:Sub test() Dim r As Long, c As Long, sodong As Long, Arr() ' trong truong hop cu the thi tinh toan sodong sodong = 1234 ReDim Arr(1 To sodong, 1 To 10) For r = 1 To UBound(Arr) For c = 1 To UBound(Arr, 2) Arr(r, c) = r & c Next c Next r Sheet1.Range("B7").Resize(sodong, 7).Value = Arr End Sub
Sau khi duyêt
thì có số dòng cần thiết - sodongMã:For Each Ws In ThisWorkbook.Worksheets If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then ... End If Next
Thì Redim thôi, hay bạn hỏi gì?
Mã:Dim dArr() Dim sodong As Long ... ' chỗ này đã có sodong ' tiếp theo trước khi vào "cụm" chính thì Redim Redim dArr(1 to sodong, 1 to 7) ' cụm chính For Each Ws In ThisWorkbook.Worksheets If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then ... End If Next
Mà bạn có tủ sách ngay bên phía tay phải mà. Trong VBE gõ Redim ở trường trên cùng bên phải rồi chọn vd. Redim statement. Rồi đọc thôi. Nói cho cùng tôi hơn bạn chủ yếu ở chỗ tôi chịu khó đọc tài liệu thôi.
Thực ra tôi trả lời bạn thôi chứ nếu chỉ là sao chép thì cũng có thể trong "cụm" chính với mỗi sheet hiện hành thì copy luôn nó vào "TongHop". Tất nhiên vị trí paste phải cập nhật sau mỗi lần paste để lần sau paste đúng chỗ.
Bạn đừng nói với tôi là bạn không biết xác định dòng cuối có dữ liệu nhé. Vì tôi biết bạn đã từng đọc nhiều code với lastRow rồi.
Con chưa thử nhưng con nghĩ làm việc với range thì con có thể giải quyết được theo cách này nhưng con muốn học hỏi phương pháp đưa hết vào mảng xong mới chuyển xuống range.Thực ra tôi trả lời bạn thôi chứ nếu chỉ là sao chép thì cũng có thể trong "cụm" chính với mỗi sheet hiện hành thì copy luôn nó vào "TongHop". Tất nhiên vị trí paste phải cập nhật sau mỗi lần paste để lần sau paste đúng chỗ.
Bạn hiểu vậy là không đúng lắm.Khai báo ở đây là số lớn nhất có thể sảy ra với mảng đó trong mọi trường hợp.Vì nêu bạn khai báo nhỏ hơn số đó thì có trường hợp nó chạy được.Có trường hợp nó báo lỗi.Nếu trong trường hợp mà không sác định được số lớn nhất thì bạn nên khai báo lớn nhất.Dạ,sau khi đọc các chỉ dẫn của bác con đã hiểu thêm được một chút rồi ạ.
Như vậy có nghĩa là khai báo một biến sau đó tính toán gia trị cho biến đó rồi gán và gán biến này vào mảng Redim.
Vấn đề của con hỏi làm sao để tính toán vừa đủ các phần tử trong mảng dArr(1 To 65000, 1 To 250) vì con đang nghĩ rằng
con số 65000 và 250 đang là khai báo thừa ra (dư ra), còn muốn cụ thể phần tử là bao nhiêu thì cần phải tính toán.
Nếu để tính toán số dòng cuối và cột cuôí thì con biết nếu đơn giản chỉ là tính toán ngay từ đầu trước khi For thì @vanthinh3101 cũng đã tính toán được luôn mà không cần phải khai báo thừa như vậy.
Nhưng ý con muốn hỏi là có cách nào để tính toán qua 3 vòng for ở bài 4 ra kết quả số phần tử vừa đủ để gán vào mảng dArr đó ạ.
Hic có thể con chưa biết cách diễn đạt vấn đề.
Để con tìm hiểu thêm ạ.
Cách này:
Con chưa thử nhưng con nghĩ làm việc với range thì con có thể giải quyết được theo cách này nhưng con muốn học hỏi phương pháp đưa hết vào mảng xong mới chuyển xuống range.
Cảm ơn bác ạ.
Bạn hiểu vậy là không đúng lắm.Khai báo ở đây là số lớn nhất có thể sảy ra với mảng đó trong mọi trường hợp.Vì nêu bạn khai báo nhỏ hơn số đó thì có trường hợp nó chạy được.Có trường hợp nó báo lỗi.Nếu trong trường hợp mà không sác định được số lớn nhất thì bạn nên khai báo lớn nhất.
Bạn nghĩ lôgíc đi. Vòng For ngoài sẽ có số vòng bằng số sheet. Nếu sheet hiện hành hợp lệ thì đã cần phải "nhồi" dữ liệu vào dArr rồi. Nếu số dòng cần có chưa được tính trước thì dArr (khi chỉ có dArr()) đã xác định đâu để mà "nhồi" dữ liệu vào nó? Số dòng dữ liệu chỉ biết rõ khi duyệt hết các sheet. Trong trường hợp này sodong khác gì bát nước chấm sau cuộc nhậu? Bát nước chấm cần khi nhậu chứ nhậu xong rồi mới bưng nước chấm ra thì bát nước chấm đó đâu còn cần thiết?Dạ,sau khi đọc các chỉ dẫn của bác con đã hiểu thêm được một chút rồi ạ.
Như vậy có nghĩa là khai báo một biến sau đó tính toán gia trị cho biến đó rồi gán và gán biến này vào mảng Redim.
Vấn đề của con hỏi làm sao để tính toán vừa đủ các phần tử trong mảng dArr(1 To 65000, 1 To 250) vì con đang nghĩ rằng
con số 65000 và 250 đang là khai báo thừa ra (dư ra), còn muốn cụ thể phần tử là bao nhiêu thì cần phải tính toán.
Nếu để tính toán số dòng cuối và cột cuôí thì con biết nếu đơn giản chỉ là tính toán ngay từ đầu trước khi For thì @vanthinh3101 cũng đã tính toán được luôn mà không cần phải khai báo thừa như vậy.
Nhưng ý con muốn hỏi là có cách nào để tính toán qua 3 vòng for ở bài 4 ra kết quả số phần tử vừa đủ để gán vào mảng dArr đó ạ.
Hic có thể con chưa biết cách diễn đạt vấn đề.
Để con tìm hiểu thêm ạ.
Cách này:
Con chưa thử nhưng con nghĩ làm việc với range thì con có thể giải quyết được theo cách này nhưng con muốn học hỏi phương pháp đưa hết vào mảng xong mới chuyển xuống range.
Cảm ơn bác ạ.
Cảm ơn snow25, vì thế mà OT mới thắc mắc xem có cách nào có thể xác định được số lớn nhất không ạ. Nhưng bạn @vanthinh3101 cũng bảo chưa biết cách nên OT nghĩ có thể nó rất khó nên tìm hiểu sau ạ. OT nghĩ chủ đề này có hình như sai box nên đã không tiếp tục, nhưng thế nào hôm nay chủ đề này lại tiếp tục nên OT cũng muốn tiếp tục ạ
Đây mượn code bài 4, và xác định theo ý tưởng batman1 (cám ơn mọi người) thì như sau:Dạ,sau khi đọc các chỉ dẫn của bác con đã hiểu thêm được một chút rồi ạ.
Như vậy có nghĩa là khai báo một biến sau đó tính toán gia trị cho biến đó rồi gán và gán biến này vào mảng Redim.
Vấn đề của con hỏi làm sao để tính toán vừa đủ các phần tử trong mảng dArr(1 To 65000, 1 To 250) vì con đang nghĩ rằng
con số 65000 và 250 đang là khai báo thừa ra (dư ra), còn muốn cụ thể phần tử là bao nhiêu thì cần phải tính toán.
Nếu để tính toán số dòng cuối và cột cuôí thì con biết nếu đơn giản chỉ là tính toán ngay từ đầu trước khi For thì @vanthinh3101 cũng đã tính toán được luôn mà không cần phải khai báo thừa như vậy.
Nhưng ý con muốn hỏi là có cách nào để tính toán qua 3 vòng for ở bài 4 ra kết quả số phần tử vừa đủ để gán vào mảng dArr đó ạ.
Hic có thể con chưa biết cách diễn đạt vấn đề.
Để con tìm hiểu thêm ạ.
Cách này:
Con chưa thử nhưng con nghĩ làm việc với range thì con có thể giải quyết được theo cách này nhưng con muốn học hỏi phương pháp đưa hết vào mảng xong mới chuyển xuống range.
Cảm ơn bác ạ.
Public Sub GPE()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, Ws As Worksheet
Dim nRows As Long, nCols As Long
nCols = 7 + 1
nRows =0
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then nRows = nRows + Ws.[B65000].End(xlUp).Row - 17 + 1
Next Ws
ReDim dArr(1 To nRows, 1 To nCols)
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
sArr = Ws.Range("A17:A" & Ws.[B65000].End(xlUp).Row).Resize(, 7)
For I = 1 To UBound(sArr, 1)
K = K + 1
dArr(K, 1) = Ws.Range("A7")
For J = 2 To UBound(sArr, 2)
dArr(K, J) = sArr(I, J)
Next J
dArr(K, nCols) = Ws.Name
Next I
End If
Next
With Sheets("MAIN")
.[A4:IV65000].ClearContents
If K Then .[A4].Resize(K, Col + 1).Value = dArr
End With
End Sub
Số dòng cần thiết? Có cách. Đó là niềm tin. Làm sao chưa xét hết các sheet mà biết được từng sheet có bao nhiêu dòng để tính tổng? Chỉ có bằng niềm tin.Cảm ơn snow25, vì thế mà OT mới thắc mắc xem có cách nào có thể xác định được số lớn nhất không ạ.
Sub SoDongSuDungTrongCacTrang()
Dim Sh As Worksheet, Rng As Range, sRng As Range
Dim DongSD As Long, HangDL As Long, DongCuoi As Long
For Each Sh In ThisWorkbook.Worksheets
If IsNumeric(Sh.Name) Then
DongSD = DongSD + Sh.UsedRange.Rows.Count
MsgBox DongSD, , "Cong Dòn Sô Dòng Su Dung Dên Trang: " & Sh.Name
HangDL = HangDL + Sh.[b16].CurrentRegion.Rows.Count
MsgBox HangDL, , "Cong Dòn Só Hàng Du Liêu Dén Trang: " & Sh.Name
Set sRng = Sh.Columns("A:A").Find("*", , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
DongCuoi = DongCuoi + sRng.Row
MsgBox DongCuoi, , "Tông Dòng Có 'Ghi Chú' Dên Trang: '" & Sh.Name
End If
End If
Next Sh
End Sub
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2