Gộp dữ liệu từ nhiều sheets

Tham gia ngày
31 Tháng mười 2018
Bài viết
20
Thích
3
Điểm
15
#1
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.
 

File đính kèm

vanthinh3101

Thành viên tích cực
Tham gia ngày
24 Tháng một 2015
Bài viết
811
Thích
867
Điểm
360
Tuổi
31
#2
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.
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
 
Tham gia ngày
31 Tháng mười 2018
Bài viết
20
Thích
3
Điểm
15
#3
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
Cảm ơn anh nhiều nha.
Bài đã được tự động gộp:

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.
Anh có thể add thêm tên sheets vào thêm một cột nữa được không ạ?
 
Lần chỉnh sửa cuối:

vanthinh3101

Thành viên tích cực
Tham gia ngày
24 Tháng một 2015
Bài viết
811
Thích
867
Điểm
360
Tuổi
31
#4
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 ạ?
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
 
Tham gia ngày
5 Tháng mười một 2015
Bài viết
808
Thích
263
Điểm
235
#5
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
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 ạ.
 

vanthinh3101

Thành viên tích cực
Tham gia ngày
24 Tháng một 2015
Bài viết
811
Thích
867
Điểm
360
Tuổi
31
#6
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 ạ.
Gửi bạn Oanh Thơ,
- dArr() là tổng hợp của nhiều sArr()
- Không thể biết trước được kích thước của chiều thứ nhất của các sArr()
- Nếu không khai báo kích thước của dArr() thì chưa thể gán giá trị được
--> Cần khai báo sẵn kích thước của dArr() ngay từ ban đầu và nên chọn 1 số lớn để bảo đảm dArr() có thể tổng hợp đầy đủ từ sArr()

P/s: Nếu xử lý được cách khác thì tôi chưa biết nhé! Tôi cũng chỉ là học "mò" trên diễn đàn thôi ;)
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
656
Thích
398
Điểm
435
#7
Lần chỉnh sửa cuối:
Tham gia ngày
5 Tháng mười một 2015
Bài viết
808
Thích
263
Điểm
235
#8

tam888

Thành viên tích cực
Tham gia ngày
22 Tháng tám 2013
Bài viết
599
Thích
349
Điểm
435
#9
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 đó ạ.
Muốn động thì cứ Chạy từng Sheet thôi, dArr sẽ được ReDim cho từng sheet (theo UBound(sArr))

Nhưng bài này thì sao không gán luốn sArr vào sheet Main, và gán thêm date là xong (có thể dùng Range đơn giản cho nhanh)
 

batman1

Thành viên tích cực
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,471
Thích
2,349
Điểm
360
#10
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ệt
Mã:
For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
            ...
        End If
Next
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ụm
Mã:
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à chỉ lấy 7 giá trị mỗi dòng thì cần gì 1 To 250?
 

snow25

Thành viên tích cực
Tham gia ngày
24 Tháng bảy 2018
Bài viết
1,139
Thích
833
Điểm
210
#11
Tham gia ngày
5 Tháng mười một 2015
Bài viết
808
Thích
263
Điểm
235
#12
Nếu cứ muốn biết cần bao nhiêu dòng thì trước tiên duyệt
Mã:
For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
            ...
        End If
Next
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ụm
Mã:
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à chỉ lấy 7 giá trị mỗi dòng thì cần gì 1 To 250?
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 ạ.
Cảm ơn bác ạ.
Oanh Thơ
Bài đã được tự động gộp:

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.
Hi @snow25,
Hôm trước OT cũng có gửi bài liên quan đến ReDim cũng thấy gượng gạo thiếu tự tin,nên cũng muốn nhờ mọi người góp ý :D
https://www.giaiphapexcel.com/diend...-chuỗi-trong-1-vùng.139542/page-2#post-895865
 

batman1

Thành viên tích cực
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,471
Thích
2,349
Điểm
360
#13
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 ạ.
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
Mã:
For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
            ...
        End If
Next
thì có số dòng cần thiết - sodong
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.
 
Lần chỉnh sửa cuối:
Tham gia ngày
5 Tháng mười một 2015
Bài viết
808
Thích
263
Điểm
235
#14
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
Mã:
For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Main" And Ws.Name <> "Tong hop" Then
            ...
        End If
Next
thì có số dòng cần thiết - sodong
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.
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:
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ỗ.
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 ạ.
 

snow25

Thành viên tích cực
Tham gia ngày
24 Tháng bảy 2018
Bài viết
1,139
Thích
833
Điểm
210
#15
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.
 
Tham gia ngày
5 Tháng mười một 2015
Bài viết
808
Thích
263
Điểm
235
#16
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.
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 ạ :)
 

batman1

Thành viên tích cực
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,471
Thích
2,349
Điểm
360
#17
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 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?

Nếu là mảng 1 chiều (tình huống giả dụ khi cần tính những thứ khác) thì khi gặp sheet hợp lệ đầu tiên thì Redim cho nó bằng số dòng của sheet hiện hành. Với những sheet sau thì phải Redim Preserve bằng số dòng cộng dồn hiện hành. Lúc đó không cần tính sodong. Nhưng với mảng 2 chiều thì không làm đơn giản thế được. Vì nếu coi chỉ số 1 là chỉ số dòng thì Redim Preserve chỉ được phép với chỉ số 2 (chỉ số cột). Mà ta muốn thay đổi số dòng chứ không phải số cột.

Cũng có thể làm được bằng cách: với sheet hợp lệ đầu tiên thì Redim dArr(1 to 7, 1 to số_dòng_trong_sheet_đầu). Tức hoán vị hàng với cột. Lúc này chỉ số thứ 2 sẽ là dòng - mảng sẽ là mảng xoay 90 độ so với mảng cần có. Với các sheet sau thì tính được số dòng cộng dồn cần có để Redim Preserve (được phép vì ta chỉ thay đổi kích thước chiều thứ 2). Cuối cùng thì phải xoay mảng dArr 90 độ để có mảng cần có.

Bạn muốn làm thao tác cuối cùng này (xoay mảng) hay duyệt vòng For trước để tính sodong? Tùy ý thích thôi.
 

tam888

Thành viên tích cực
Tham gia ngày
22 Tháng tám 2013
Bài viết
599
Thích
349
Điểm
435
#18
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 ạ :)
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 ạ.
Đâ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:
Mã:
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
ở đây các sheet dữ liệu có số cột dữ liệu là 7
 
Lần chỉnh sửa cuối:

batman1

Thành viên tích cực
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,471
Thích
2,349
Điểm
360
#19
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 ạ.
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òn nếu không muốn tính trước số dòng cần thiết thì chỉ còn nước Redim mảng xoay so với mảng sẽ cần khi gặp sheet hợp lệ đầu tiên -> Redim Preserve với các sheet sau -> cuối cùng thì "xoay mảng" hiện hành 90 độ để có mảng cần có. Với cách này thì ở mọi thời điểm, trừ thời điểm xét sheet hợp lệ cuối cùng, cả thánh lẫn người trần tục đều không thể biết số dòng tổng cộng sẽ là bao nhiêu.
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
5,213
Thích
8,880
Điểm
860
#20
PHP:
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
 
Top