Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Các anh/chị vui lòng xem giúp đoạn code báo lỗi: "Subcript out of range" tại dArr(K, J) = sArr(I, J) trong đoạn code sau:
Public Sub Noisheet()
Dim sArr(), dArr(1 To 65000, 1 To 100), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Sum" Then
If Ws.Name <> "Total" Then
sArr = Ws.Range(Ws.[A11], Ws.[A65000].End(xlUp)).Resize(, Ws.[AV11].End(2).Column)
If Ws.[A11].End(2).Column > Col Then Col = Ws.[AV11].End(2).Column
For I = 1 To UBound(sArr, 1)
K = K + 1
For J = 1 To UBound(sArr, 2)
dArr(K, J) = sArr(I, J)
Next J
Next I
End If
End If
Next
With Sheets("Total")
.[A7:AV65000].ClearContents
If K Then .[A7].Resize(K, Col).Value = dArr
End With
End Sub

Note: Mục đích gộp các sheet vào 1 sheet.
Bạn thử chưa test nhé.Nếu vẫn có lỗi thì đưa file lên nhé.
Mã:
Public Sub Noisheet()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet, tong As Long, max As Long, a As Long
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Sum" Then
If Ws.Name <> "Total" Then
   tong = tong + Ws.Range("A" & Rows.Count).End(xlUp).Row
   a = Ws.[AV11].End(2).Column
   If a > max Then max = a
End If
End If
Next
If tong > Rows.Count Then MsgBox "nhieu dong qua": Exit Sub
ReDim dArr(1 To tong, 1 To max)
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Sum" Then
If Ws.Name <> "Total" Then
sArr = Ws.Range(Ws.[A11], Ws.[A65000].End(xlUp)).Resize(, Ws.[AV11].End(2).Column)
If Ws.[A11].End(2).Column > Col Then Col = Ws.[AV11].End(2).Column
For I = 1 To UBound(sArr, 1)
K = K + 1

For J = 1 To UBound(sArr, 2)
dArr(K, J) = sArr(I, J)
Next J
Next I
End If
End If
Next
With Sheets("Total")
.[A7:AV65000].ClearContents
If K Then .[A7].Resize(K, Col).Value = dArr
End With
End sub
 
Lần chỉnh sửa cuối:
Upvote 0
Không phải bạn ơi. Để lên 1000 cũng vẫn báo lỗi vậy.
1000 thì đã là cái gì đâu.

Không có tập tin mà đoán mò thì mệt lắm.
Mã:
sArr = Ws.Range(Ws.[A11], Ws.[A65000].End(xlUp)).Resize(, Ws.[AV11].End(2).Column)
Giả sử code chạy trên Excel >= 2007, và sheet hiện hành chỉ có dữ liệu từ A11 tới AV11.

Lúc này Ws.[AV11].End(2).Column trả về 16384. Tức UBound(sArr, 2) = 16384

Vậy
Mã:
For J = 1 To UBound(sArr, 2)
dArr(K, J) = sArr(I, J)
Next J
sẽ có lỗi khi J > UBound(dArr, 2) (khi J > 100, khi J > 1000)

Ngoài ra nếu tổng các số dòng có dữ liệu trong tất cả các sheet > 65000 thì cũng có lỗi khi K > 65000 vì dArr chỉ có 65000 dòng. Nhưng không có tập tin thì chỉ là đoán mò, chỉ là "NẾU".

Cũng chả thấy mô tả dữ liệu. Tôi hiểu là các sheet có thể có cột cuối cùng có dữ liệu khác nhau ở dòng 11, vd. trong sheet đầu chỉ tới cột Z, trong sheet khác tới AV, trong sheet khác nữa tới AZ, rồi sau đó tới L ... Nhưng trong mỗi sheet ấy thì từ A11 tới <xyz>11 có ô trống không? Tức vd. A11<> rỗng, AV11 <> rỗng, nhưng liệu có vd. AA11 = rỗng.

Không có tập tin, không có mô tả dữ liệu thì chỉ mất thời gian vô ích của nhau.
 
Upvote 0
Bạn thử chưa test nhé.Nếu vẫn có lỗi thì đưa file lên nhé.
Mã:
Public Sub Noisheet()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet, tong As Long, max As Long, a As Long
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Sum" Then
If Ws.Name <> "Total" Then
   tong = tong + Ws.Range("A" & Rows.Count).End(xlUp).Row
   a = Ws.[AV11].End(2).Column
   If a > max Then max = a
End If
End If
Next
If tong > Rows.Count Then MsgBox "nhieu dong qua": Exit Sub
ReDim dArr(1 To tong, 1 To max)
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Sum" Then
If Ws.Name <> "Total" Then
sArr = Ws.Range(Ws.[A11], Ws.[A65000].End(xlUp)).Resize(, Ws.[AV11].End(2).Column)
If Ws.[A11].End(2).Column > Col Then Col = Ws.[AV11].End(2).Column
For I = 1 To UBound(sArr, 1)
K = K + 1

For J = 1 To UBound(sArr, 2)
dArr(K, J) = sArr(I, J)
Next J
Next I
End If
End If
Next
With Sheets("Total")
.[A7:AV65000].ClearContents
If K Then .[A7].Resize(K, Col).Value = dArr
End With
End sub
Cảm ơn bạn. Code đã chạy và không còn báo lỗi. Sau khi chạy xong data > 12000 dòng nên khá chậm
 
Upvote 0
Cảm ơn bạn. Code đã chạy và không còn báo lỗi. Sau khi chạy xong data > 12000 dòng nên khá chậm
Nếu có trường hợp tôi nói thì còn ngạc nhiên gì nữa? Vì lúc đó sArr và dArr luôn có 16384 cột và duyệt chúng, rồi đập mảng 12000 dòng và 16384 cột xuống sheet lâu là đương nhiên.

Nếu trong tất cả các sheet cột cuối cùng có dữ liệu ở dòng 11 KHÔNG BAO GIỜ vượt quá AV (AZ, BB ...) thì lấy luôn từ A tới AV chứ bầy trò Ws.[AV11].End(2).Column để làm gì?

Còn nếu cột cuối khó xác định từ đầu thì dùng End(xlToLeft)

Chỉ cần mô tả dữ liệu mà không chịu làm thì bó tay ..................... toàn tập.
 
Upvote 0
Chào các anh chị
Em có đoạn code cho chạy lặp đi lặp lại vô tận kiểu như sau:
Mã:
Sub VIDU()
My Code here
Application.OnTime Now + TimeValue("00:00:30"), "VIDU"
End Sub

Để dừng chạy Sub trên, em phải vào VBE để Break. Vậy các anh chị chỉ cách em tạo 1 Sub để Beak thay vì phải vào VBE.
Em xin cảm ơn
 
Upvote 0
Nếu có trường hợp tôi nói thì còn ngạc nhiên gì nữa? Vì lúc đó sArr và dArr luôn có 16384 cột và duyệt chúng, rồi đập mảng 12000 dòng và 16384 cột xuống sheet lâu là đương nhiên.

Nếu trong tất cả các sheet cột cuối cùng có dữ liệu ở dòng 11 KHÔNG BAO GIỜ vượt quá AV (AZ, BB ...) thì lấy luôn từ A tới AV chứ bầy trò Ws.[AV11].End(2).Column để làm gì?

Còn nếu cột cuối khó xác định từ đầu thì dùng End(xlToLeft)

Chỉ cần mô tả dữ liệu mà không chịu làm thì bó tay ..................... toàn tập.
Cảm ơn bạn. Mình đang tập tọe VBA nên không rõ.
Trong dữ liệu của từng sheet đều cố định cột từ A đến AV và đều bắt đầu từ dòng 11. Tuy nhiên đúng như bạn nói. Có 1 số cột nằm giữa A và AV trống không có dữ liệu và có 1 số dòng trống trong các sheet.
Để tối ưu hơn mình gửi file đính kèm. Bạn xem giúp mình nhé.
 

File đính kèm

  • Chill-Delivery report-082019.xlsb
    4.4 MB · Đọc: 11
Upvote 0
Trong dữ liệu của từng sheet đều cố định cột từ A đến AV và đều bắt đầu từ dòng 11. Tuy nhiên đúng như bạn nói. Có 1 số cột nằm giữa A và AV trống không có dữ liệu và có 1 số dòng trống trong các sheet.
Để tối ưu hơn mình gửi file đính kèm.
Mình chạy Code của bạn đang dính lỗi này: ReDim dArr(1 To Tong, 1 To Max)
Nếu rà chuột vô tham biếm 'Max' nó đang chứa trị 16.384
Nhưng các trang của bạn không quá 52 cột. Như vậy chúng tỏ macro còn lỗi trong việc xác định số cột trong từng trang tính.
Bạn nên tìm lỗi này & trừ khử đi
Còn nếu đúng trình độ VBA của bạn trung bình thì cách này không cần kiến thức mảng gì sất, tuy chậm hơn nhưng chắc không sai:

B1: Tạo vòng lặp duyệt qua các trang (Bạn đã làm)
B2 Xác dịnh vùng dữ liệu cần chép của trang đang duyệt (Rng)
B3: Copy sang 'Total':
B3.1 Xác định dòng cuối có dữ liệu của 'Total (ví dụ là lRow)
B3.2: Thực hiện Copy vùng dữ liệu cần chép sang 'Total': Rng.Copy Destination:=Sheets("Total")..Cells(lRow,"A")

Bạn đừng nghỉ là mình sẽ viết macro xử lý cho bạn nha: Vì dữ liệu của bạn như thể đống rác như vậy mình không dám đụng đâu!
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào mọi người !
Nhờ mọi người giúp đỡ vấn đề như sau :
Em gửi thư hàng loạt bằng VBA qua out look nhưng gặp vấn đề là văn bản em soạn thảo trên excel không thể soạn một cái mail đẹp đẹp xíu ( kiểu chữ, canh lề chuẩn, Tô màu các điểm cần chú ý, xuống dòng, và im đậm, in nghiêng ..)
Anh chị có thể cho em hướng giải quyết về vấn đề này được ko ?
 
Upvote 0
Cảm ơn bạn. Mình đang tập tọe VBA nên không rõ.
Trong dữ liệu của từng sheet đều cố định cột từ A đến AV và đều bắt đầu từ dòng 11. Tuy nhiên đúng như bạn nói. Có 1 số cột nằm giữa A và AV trống không có dữ liệu và có 1 số dòng trống trong các sheet.
Để tối ưu hơn mình gửi file đính kèm. Bạn xem giúp mình nhé.

Công nhận là máy bạn khủng thật. Tôi chạy code của bạn snow thì không chạy được vì mảng dArr quá lớn. Cũng phải thôi vì mảng dArr có 10329 dòng và 16384 cột, tức có 10329*16384 = 169230336 phần tử. Mà mỗi phần tử ngốn 16 bai (Variant) nên mảng dArr chiếm 2 707 685 376 bai > 2 GB. Trong khi đó 2 máy tôi chỉ có 1 GB và 4 GB RAM, mà một số lớn đã chiếm bởi system và các chương trình mặc định.

Tôi đã nói rõ: Nếu trong mọi sheet dữ liệu không vượt quá cột AV thì ta luôn lấytới AV và không chơi trò Ws.[AV11].End(2).Column nữa. Mà nếu đã chơi trò END thì phải là End(xlToLeft)

Tôi chỉ sửa code của bạn snow để bạn thấy khi mảng giảm cân nhiều thì sẽ thế nào. Còn giải pháp của bạn SA_DQ thì coi như bài tập về nhà cho bạn. Nhưng nếu đúng là "Mình đang tập tọe VBA" thì bài tập quá khó với bạn đấy. Tôi không tin là trên cơ sở mấy gợi ý đó bạn sẽ tự hoàn thành được bài tập đó.
Mã:
Public Sub Noisheet()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet, tong As Long
    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Sum" Then
            If Ws.Name <> "Total" Then
                tong = tong + Ws.Range("B" & Rows.Count).End(xlUp).Row - 10
            End If
        End If
    Next
    If tong = 0 Or tong > Rows.Count Then
        If tong > Rows.Count Then MsgBox "nhieu dong qua"
        Exit Sub
    End If
    ReDim dArr(1 To tong, 1 To 48)     '   lay tu A toi AV = 48 cot
    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Sum" Then
            If Ws.Name <> "Total" Then
                I = Ws.Cells(Rows.Count, "B").End(xlUp).Row
                If I > 10 Then
                    sArr = Ws.Range("A11:AV" & I).Value
                    For I = 1 To UBound(sArr, 1)
                        K = K + 1
                        For J = 1 To UBound(sArr, 2)
                            dArr(K, J) = sArr(I, J)
                        Next J
                    Next I
                End If
            End If
        End If
    Next
    With Sheets("Total")
        .Range("A7:AV" & Rows.Count).ClearContents
        .Range("A7").Resize(K, UBound(dArr, 2)).Value = dArr
    End With
End Sub

Tôi giữ nguyên code của bạn snow nhưng thực ra theo lôgíc thì xóa dữ liệu cũ phải làm ngay từ đầu. Vì sao? Vì nếu để như bây giờ và nếu có tong > Rows.Count thì code sẽ thoát Sub mà không xóa dữ liệu cũ. Người dùng sẽ "tưởng" đó là kết quả mới.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình chạy Code của bạn đang dính lỗi này: ReDim dArr(1 To Tong, 1 To Max)
Nếu rà chuột vô tham biếm 'Max' nó đang chứa trị 16.384
Nhưng các trang của bạn không quá 52 cột. Như vậy chúng tỏ macro còn lỗi trong việc xác định số cột trong từng trang tính.
Bạn nên tìm lỗi này & trừ khử đi
Còn nếu đúng trình độ VBA của bạn trung bình thì cách này không cần kiến thức mảng gì sất, tuy chậm hơn nhưng chắc không sai:

B1: Tạo vòng lặp duyệt qua các trang (Bạn đã làm)
B2 Xác dịnh vùng dữ liệu cần chép của trang đang duyệt (Rng)
B3: Copy sang 'Total':
B3.1 Xác định dòng cuối có dữ liệu của 'Total (ví dụ là lRow)
B3.2: Thực hiện Copy vùng dữ liệu cần chép sang 'Total': Rng.Copy Destination:=Sheets("Total")..Cells(lRow,"A")

Bạn đừng nghỉ là mình sẽ viết macro xử lý cho bạn nha: Vì dữ liệu của bạn như thể đống rác như vậy mình không dám đụng đâu!
Công nhận là máy bạn khủng thật. Tôi chạy code của bạn snow thì không chạy được vì mảng dArr quá lớn. Cũng phải thôi vì mảng dArr có 10329 dòng và 16384 cột, tức có 10329*16384 = 169230336 phần tử. Mà mỗi phần tử ngốn 16 bai (Variant) nên mảng dArr chiếm 2 707 685 376 bai > 2 GB. Trong khi đó 2 máy tôi chỉ có 1 GB và 4 GB RAM, mà một số lớn đã chiếm bởi system và các chương trình mặc định.

Tôi đã nói rõ: Nếu trong mọi sheet dữ liệu không vượt quá cột AV thì ta luôn lấytới AV và không chơi trò Ws.[AV11].End(2).Column nữa. Mà nếu đã chơi trò END thì phải là End(xlToLeft)

Tôi chỉ sửa code của bạn snow để bạn thấy khi mảng giảm cân nhiều thì sẽ thế nào. Còn giải pháp của bạn SA_DQ thì coi như bài tập về nhà cho bạn. Nhưng nếu đúng là "Mình đang tập tọe VBA" thì bài tập quá khó với bạn đấy. Tôi không tin là trên cơ sở mấy gợi ý đó bạn sẽ tự hoàn thành được bài tập đó.
Mã:
Public Sub Noisheet()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet, tong As Long
    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Sum" Then
            If Ws.Name <> "Total" Then
                tong = tong + Ws.Range("B" & Rows.Count).End(xlUp).Row - 10
            End If
        End If
    Next
    If tong = 0 Or tong > Rows.Count Then
        If tong > Rows.Count Then MsgBox "nhieu dong qua"
        Exit Sub
    End If
    ReDim dArr(1 To tong, 1 To 48)     '   lay tu A toi AV = 48 cot
    For Each Ws In ThisWorkbook.Worksheets
        If Ws.Name <> "Sum" Then
            If Ws.Name <> "Total" Then
                I = Ws.Cells(Rows.Count, "B").End(xlUp).Row
                If I > 10 Then
                    sArr = Ws.Range("A11:AV" & I).Value
                    For I = 1 To UBound(sArr, 1)
                        K = K + 1
                        For J = 1 To UBound(sArr, 2)
                            dArr(K, J) = sArr(I, J)
                        Next J
                    Next I
                End If
            End If
        End If
    Next
    With Sheets("Total")
        .Range("A7:AV" & Rows.Count).ClearContents
        .Range("A7").Resize(K, UBound(dArr, 2)).Value = dArr
    End With
End Sub

Tôi giữ nguyên code của bạn snow nhưng thực ra theo lôgíc thì xóa dữ liệu cũ phải làm ngay từ đầu. Vì sao? Vì nếu để như bây giờ và nếu có tong > Rows.Count thì code sẽ thoát Sub mà không xóa dữ liệu cũ. Người dùng sẽ "tưởng" đó là kết quả mới.
Cảm ơn bạn batman1 đã nhiệt tình hỗ trợ và bạn SA_DQ như mình đã nói mình đang tập tọe VBA mà và đúng là quá khó với mình sau gợi ý của bạn SA_DQ nhưng mình sẽ cố gắng học hỏi thêm. Chúc hai bạn vui khỏe.
 
Upvote 0
...
Tôi giữ nguyên code của bạn snow nhưng thực ra theo lôgíc thì xóa dữ liệu cũ phải làm ngay từ đầu. Vì sao? Vì nếu để như bây giờ và nếu có tong > Rows.Count thì code sẽ thoát Sub mà không xóa dữ liệu cũ. Người dùng sẽ "tưởng" đó là kết quả mới.
Cái vấn đề này tôi nhắc hoài nhưng hình như bà con ở GPE này không quan tâm.
Nguyên tắc cần thiết của tổng hợp dữ liệu khủng (vài ngàn dòng là khủng rồi) là phải có log ghi lại.
Tối thiểu là phải có lời báo: "Sheet1 12345 dòng; Sheet2 6789 dòng, ...; tổng cộng 123456 dòng"
Nếu là tôi thì hoặc ghi hẳn số dòng ra một file text; hoặc ghi xuất xứ vào cột A (từ dòng 1 đến 12345 là "Sheet1";...) và sau khi kiểm chứng xong, xóa cột.

Nhưng ở đây, tôi thấy tối đa là người ta có một cái message "Done!". Chưa kể nhiều người còn code để gặp vấn đề thì nó vượt qua luôn. Tôi thực sự không hiểu khi chép chỉ 9 sheets mà không biết rằng đáng lẽ phải là 10 thì chép làm cái gì?
 
Upvote 0
Em có 1 file muốn nhờ các anh chị em trên diễn đàn viết đoạn code tìm điều kiện theo mảng cho em.
Nói ra rất dài dòng nên em có nêu yêu cầu ở trong ảnh và em có đưa file lên rồi.

Mong sớm được anh chị em trên diễn đàn giúp đỡ.
Thân!
Bài đã được tự động gộp:

Em có 1 file muốn nhờ các anh chị em trên diễn đàn viết đoạn code tìm điều kiện theo mảng cho em.
Nói ra rất dài dòng nên em có nêu yêu cầu ở trong ảnh và em có đưa file lên rồi.

Mong sớm được anh chị em trên diễn đàn giúp đỡ.
Thân!
 

File đính kèm

  • Book2.xlsm
    9.1 KB · Đọc: 8
  • 1.JPG
    1.JPG
    96.3 KB · Đọc: 10
Upvote 0
Em có 1 file muốn nhờ các anh chị em trên diễn đàn viết đoạn code tìm điều kiện theo mảng cho em.
Nói ra rất dài dòng nên em có nêu yêu cầu ở trong ảnh và em có đưa file lên rồi.

Mong sớm được anh chị em trên diễn đàn giúp đỡ.
Thân!
Bài đã được tự động gộp:
Bạn thử:
PHP:
Sub Test()
    Dim i%, j%, LR&
    LR = ActiveSheet.Range("A10000").End(xlUp).Row
    For i = 4 To LR
        For j = 3 To 11
            If Cells(i, 1) <= Cells(i, j) Then
                Cells(i, 2) = "Lên l" & ChrW(7899) & "p"
                Exit For
            ElseIf Cells(i, 1) > Cells(i, j) Then
                Cells(i, 2) = ChrW(7902) & " l" & ChrW(7841) & "i l" & ChrW(7899) & "p"
            End If
        Next
    Next
End Sub
 

File đính kèm

  • LEN LOP.xls
    40 KB · Đọc: 9
Upvote 0
Bạn thử:
PHP:
Sub Test()
    Dim i%, j%, LR&
    LR = ActiveSheet.Range("A10000").End(xlUp).Row
    For i = 4 To LR
        For j = 3 To 11
            If Cells(i, 1) <= Cells(i, j) Then
                Cells(i, 2) = "Lên l" & ChrW(7899) & "p"
                Exit For
            ElseIf Cells(i, 1) > Cells(i, j) Then
                Cells(i, 2) = ChrW(7902) & " l" & ChrW(7841) & "i l" & ChrW(7899) & "p"
            End If
        Next
    Next
End Sub
Cám ơn anh nhiều. Đúng ý của em rồi.
Chúc các anh, chị em sức khỏe và thành đạt.
Thân!
 
Upvote 0
Xin giúp mình tăng tốc độ xử lý VBA, vì khi nhập 1 dữ liệu tại 1 cell của sheet nguồn, enter nó sẽ mất khoảng 5-7s cho 1 thao tác. File nặng khoảng 12MB.

Cụ thể:
- Sheet nguồn nhập, thay đổi dữ liệu: "2019"
- Sheet lọc dữ liệu từ sheet nguồn: "Ton", "No", "Phat sinh", "Loi nhuan".

Mục đích: tự động Repply filter cho các sheet cần lọc dữ liệu khi nhập hoặc thay đổi giá trị dữ liệu từ Sheet nguồn "2019".

- Đoạn mã (được áp vào module của sheet "2019"):

Private Sub Worksheet_Change(ByVal Target As Range)

Sheets("2019").AutoFilter.ApplyFilter
Sheets("Ton").AutoFilter.ApplyFilter
Sheets("No").AutoFilter.ApplyFilter
Sheets("Phat sinh").AutoFilter.ApplyFilter
Sheets("Loi nhuan").AutoFilter.ApplyFilter

End Sub

Mong các bạn chỉ giúp cách cải thiện tốc độ xử lý; Hoặc viết giúp đoạn code nào xử lý nhanh với mục đích tự động Repply Filter tại các sheet cần lọc khi thay đổi dữ liệu từ sheet nguồn.
Cảm ơn !
 
Upvote 0
Lại cái tật một bài đăng hai chỗ.
Thành viên hơn 5 năm gì mà chả biết lịch sự căn bản.
 
Upvote 0
Hi anh chị, em mới tìm hiểu về VBA, nên chưa có nhiều kinh nghiệm, mong các anh chị chỉ bảo.
Em đang có 1 bài tập như trong file.
Hiện e không biết sử dụng vòng lặp VBA như thế nào để thực hiện.
Hiện e có thể sử dụng hàm thủ công sumif và countif .
Yêu cầu:
Tính số ngày hàng về ( lots ) và tổng số lượng hàng về ( pcs )

Cảm ơn anh chị !
 

File đính kèm

  • VBA - DDP - Hỏi đáp 3.9.xlsm
    14 KB · Đọc: 7
Upvote 0
Hi anh chị, em mới tìm hiểu về VBA, nên chưa có nhiều kinh nghiệm, mong các anh chị chỉ bảo.
Em đang có 1 bài tập như trong file.
Hiện e không biết sử dụng vòng lặp VBA như thế nào để thực hiện.
Hiện e có thể sử dụng hàm thủ công sumif và countif .
Yêu cầu:
Tính số ngày hàng về ( lots ) và tổng số lượng hàng về ( pcs )

Cảm ơn anh chị !
1 cách:
PHP:
Sub Test()
    Dim LR As Long
    LR = Range("B" & Rows.Count).End(xlUp).Row
    [L3] = WorksheetFunction.CountIf(Range("C3:C" & LR), Range("K3"))
    [M3] = WorksheetFunction.SumIf(Range("C3:C" & LR), Range("K3"), Range("D3:D" & LR))
End Sub
 
Upvote 0
1 cách:
PHP:
Sub Test()
    Dim LR As Long
    LR = Range("B" & Rows.Count).End(xlUp).Row
    [L3] = WorksheetFunction.CountIf(Range("C3:C" & LR), Range("K3"))
    [M3] = WorksheetFunction.SumIf(Range("C3:C" & LR), Range("K3"), Range("D3:D" & LR))
End Sub
OK tks a . Để e tìm hiểu thêm .
 
Upvote 0
Web KT
Back
Top Bottom