Tạo báo cáo giống như Pivot Table.

Liên hệ QC
Thử bon chen với Bác @HieuCD , Bạn thử chạy 'Sub Tham_Khao_ForNext' bên dưới:

Mã:
Option Explicit

Private Function KeyExists(aExists, sKey, j, k) As Boolean
    For k = 1 To j
        If aExists(k) = sKey Then
            KeyExists = True
            Exit For
        End If
    Next k
End Function

Sub Tham_Khao_ForNext()
 
    Dim aExists, sKey As String, sArr(), Result()
    Dim r As Long, i As Long, j As Long, k As Long
    Dim shData  As Worksheet, shKQ As Worksheet
   
    Set shData = ThisWorkbook.Worksheets("Sheet1")
    Set shKQ = ThisWorkbook.Worksheets("Sheet3")
   
    r = shData.Range("A" & shData.Rows.Count).End(xlUp).Row
    If r < 2 Then Exit Sub
   
    shKQ.Range("A2").Resize(10000, 5).ClearContents
    sArr = shData.Range("A1").Resize(r, 5).Value2
    ReDim Result(1 To r, 1 To 5): ReDim aExists(1 To r)
    For i = 1 To r
        If sArr(i, 3) = 1 Then
            sKey = sArr(i, 1) & "|" & sArr(i, 4)
            If Not KeyExists(aExists, sKey, j, k) Then
                aExists(k) = sKey
                j = j + 1
                Result(j, 1) = j
                Result(j, 2) = sArr(i, 4)
                Result(j, 3) = sArr(i, 5)
                Result(j, 5) = sArr(i, 1)
            End If
            Result(k, 4) = Result(k, 4) + 1
        End If
    Next i
   
    shKQ.Range("A2").Resize(j, 5) = Result
   
End Sub
Code chạy đúng do may mắn đầu năm, bỏ mảng aExists code sẽ tường minh và chuẩn hơn
 
Thế khi
For i = 1 to EndRow Step 2
Thì sao?
Chú hỏi hết gì Chú hỏi hết luôn đi ạ, con viết nhiều rồi lại lên top1 đến lúc đó đâm lao rồi con lại cố theo lao bỏ cả chồng con công việc để đua tốp thì chết.
Sau khi đọc hết khuya về nếu ngồi máy con ngẫm rồi test một thể giờ con đang làm nên chưa test được chỉ dám đoán trong khả năng kiến thức ít ỏi của mình ạ.
Code chạy đúng do may mắn đầu năm, bỏ mảng aExists code sẽ tường minh và chuẩn hơn
Dạ , Bác vậy ạ. Bác nói vậy chắc là đúng là con gặp may rồi.. con cảm ơn Bác đã gởi con lời tốt đẹp gián tiếp ạ :"'
Bài đã được tự động gộp:

Định hỏi anh đây: Tại sao lại có điều kiện If sArr(i, 3) = 1 Then?
Chú hỏi Bác ấy thật nhiều vào để con xem 'song hùng gặp nhau' tôm tép có hưởng lây gì không? }}}}}
 
Chú hỏi hết gì Chú hỏi hết luôn đi ạ, con viết nhiều rồi lại lên top1 đến lúc đó đâm lao rồi con lại cố theo lao bỏ cả chồng con công việc để đua tốp thì chết.
Sau khi đọc hết khuya về nếu ngồi máy con ngẫm rồi test một thể giờ con đang làm nên chưa test được chỉ dám đoán trong khả năng kiến thức ít ỏi của mình ạ.
Phải suy luận ra chứ có 1 dòng code mà phải test trên máy à?
Hỏi thêm đây (ôn bài cũ): Tại sao k tăng ở đâu đâu bên trời Function, k cũng không phải biến public, mà đem về sub chính vẫn còn nguyên giá trị đã tăng?
 
Phải suy luận ra chứ có 1 dòng code mà phải test trên máy à?
Hỏi thêm đây (ôn bài cũ): Tại sao k tăng ở đâu đâu bên trời Function, k cũng không phải biến public, mà đem về sub chính vẫn còn nguyên giá trị đã tăng?
Con xin phép tối mà cũng có thể là sau tối ... sau nữa con sẽ trả lời và tại bài viết này ạ (sửa bài ạ) ... cả ngày hôm nay đi làm mà cứ code với két xong cứ nhe răng ra cười Sếp mấy lần qua ra nhìn con rồi.
 
Sheet1 cột C có công thức: =IF(OR($B2>0,LEN($D2)=6),1,"")
Có khả năng cột C có giá trị rổng và mình muốn loại dòng nầy
Theo tôi thấy thì đây là 1 kiểu nhập liệu tự động chứ không phải kiểu ràng buộc điều kiện: hoặc là điền barcode, hoặc là điền mã thì tự điền 1, ít có trường hợp mã dài ngắn khác nhau và chả lẽ mã dài hơn hay ngắn hơn thì bỏ thùng trống không.
Tuy nhiên ý tôi hỏi là để cho thấy cái sự "bon chen" của cô nàng @Hoàng Nhật Phương mang tính chất sao chép không cần hiểu, miễn chạy ra kết quả giống là được. Giả sử code gốc sai thì việc sao chép sai cũng không biết.
 
Theo tôi thấy thì đây là 1 kiểu nhập liệu tự động chứ không phải kiểu ràng buộc điều kiện: hoặc là điền barcode, hoặc là điền mã thì tự điền 1, ít có trường hợp mã dài ngắn khác nhau và chả lẽ mã dài hơn hay ngắn hơn thì bỏ thùng trống không.
Tuy nhiên ý tôi hỏi là để cho thấy cái sự "bon chen" của cô nàng @Hoàng Nhật Phương mang tính chất sao chép không cần hiểu, miễn chạy ra kết quả giống là được. Giả sử code gốc sai thì việc sao chép sai cũng không biết.
Dạ Chú Mỹ, một thói quen khó chữa từ trước đến giờ khiến cho con không thể tiến bộ được là chỉ khi nào code chạy bị lỗi hoặc kết quả bị sai thì con mới tìm hiểu kỹ nguyên nhân hoặc là tìm trợ giúp nếu không xử lý được.. (@$%@
 
Dạ Chú Mỹ, một thói quen khó chữa từ trước đến giờ khiến cho con không thể tiến bộ được
Muốn tiến bộ thì suy nghĩ trả lời câu hỏi bài 23 và 27:
- Nếu for i = 1 (hoặc =m) to 10.000 step 2, (hoặc step n thì khi ra khỏi vòng lặp i bằng bao nhiêu? Cho công thức tổng quát
- Tại sao k tăng ở đâu đâu bên trời Function, k cũng không phải biến public, mà đem về sub chính vẫn còn nguyên giá trị đã tăng?
 
Muốn tiến bộ thì suy nghĩ trả lời câu hỏi bài 23 và 27:
- Nếu for i = 1 (hoặc =m) to 10.000 step 2, (hoặc step n thì khi ra khỏi vòng lặp i bằng bao nhiêu? Cho công thức tổng quát
- Tại sao k tăng ở đâu đâu bên trời Function, k cũng không phải biến public, mà đem về sub chính vẫn còn nguyên giá trị đã tăng?
Con giải thích như sau ạ:
- Với vòng lặp step:
Khi for i = 1 to 10.000 step 2 thì i = 10.000-1=9.999
Khi for i = 1 to m step n thì i = (m-n)+1, n càng tăng thì i càng giảm, m = i chỉ khi nào n=1

- Với k
Mã:
Function KeyExists(Result, sKey, j, k) As Boolean
For k = 1 To j
'...
Next k
k xuất phát là 1 khi j=0 k vẫn sẽ là 1.
nếu j > 0 thì k sẽ tăng thêm 1 cứ như vậy sau mỗi lần kết thúc vằng lặp thì biến k luôn + (do For..next)
k mang về sub chính vẫn còn nguyên là do là đúng rồi (do truyền k)
 
Con giải thích như sau ạ:
- Với vòng lặp step:
Khi for i = 1 to 10.000 step 2 thì i = 10.000-1=9.999
Khi for i = 1 to m step n thì i = (m-n)+1, n càng tăng thì i càng giảm, m = i chỉ khi nào n=1

- Với k
Mã:
Function KeyExists(Result, sKey, j, k) As Boolean
For k = 1 To j
'...
Next k
k xuất phát là 1 khi j=0 k vẫn sẽ là 1.
nếu j > 0 thì k sẽ tăng thêm 1 cứ như vậy sau mỗi lần kết thúc vằng lặp thì biến k luôn + (do For..next)
k mang về sub chính vẫn còn nguyên là do là đúng rồi (do truyền k)
Câu 1 đọc sai câu hỏi (for i = m to 1000 step n cơ mà?) câu 2 sai câu trả lời
Trả lời câu 2: Do function nhận tham số ByRef của k truyền vào, nên giá trị k của sub chính thay đổi do Function.
 
Câu 1 đọc sai câu hỏi (for i = m to 1000 step n cơ mà?) câu 2 sai câu trả lời
Trả lời câu 2: Do function nhận tham số ByRef của k truyền vào, nên giá trị k của sub chính thay đổi do Function.
ủa câu 1 có gì khác à Chú Mỹ, chờ con test thử xem khác gì ạ.
Câu 2 con giải thích vậy mà sai á trời không khai báo đương nhiên là ByRef thì con biết rồi còn truyền thì con cũng đã nói là truyền sang sub nên nó giữ nguyên mà hic Chú Mỹ đưa câu trả lời của để so sánh với câu trả lời của Chú Mỹ bằng phép tính A=B luôn như phép toán đó hả !$@!!
 
Không có "vòng lặp step".

1613804255222.png
Không đúng.

Thử như vậy xem:
PHP:
Sub vidu()
    Const startCount = 20
    Const stp = 4   ' 3 truong hop: stp <0, =0, >0 '
    Const maxCount = 1000
    Const oanTaVan = 12
    Dim i As Long
    For i = startCount To maxCount Step stp
        'i = i + oanTaVan  ' them truong hop nay nua.
    Next i
    MsgBox i
End Sub

---
Diễn biến: Bé >> Nhóc >> Cô nàng >> "chưa biết" :p
Kiếm được 'học trò cưng' rồi hem biết có mật ong rừng hông. :D
 
Không có "vòng lặp step".

View attachment 254330
Không đúng.

Thử như vậy xem:
PHP:
Sub vidu()
    Const startCount = 20
    Const stp = 4   ' 3 truong hop: stp <0, =0, >0 '
    Const maxCount = 1000
    Const oanTaVan = 12
    Dim i As Long
    For i = startCount To maxCount Step stp
        'i = i + oanTaVan  ' them truong hop nay nua.
    Next i
    MsgBox i
End Sub

---
Diễn biến: Bé >> Nhóc >> Cô nàng >> "chưa biết" :p
Kiếm được 'học trò cưng' rồi hem biết có mật ong rừng hông. :D

Không có "vòng lặp step".

View attachment 254330
Không đúng.

Thử như vậy xem:
PHP:
Sub vidu()
    Const startCount = 20
    Const stp = 4   ' 3 truong hop: stp <0, =0, >0 '
    Const maxCount = 1000
    Const oanTaVan = 12
    Dim i As Long
    For i = startCount To maxCount Step stp
        'i = i + oanTaVan  ' them truong hop nay nua.
    Next i
    MsgBox i
End Sub

---
Diễn biến: Bé >> Nhóc >> Cô nàng >> "chưa biết" :p
Kiếm được 'học trò cưng' rồi hem biết có mật ong rừng hông. :D
Cảm ơn Bạn đã chỉ dẫn OT vừa kiểm tra 'For i = 10000 To EndRow Step 2', i= 1000 -1 đúng là sai thật , đúng là 10000.
Trường hợp của Bạn OT sẽ thử.
---
Phần diễn biến của Bạn, OT hiểu bạn đang muốn nói gì (nếu không tôn trọng Bạn OT cũng sẽ bỏ qua không trả lời)
Đây là nơi học hỏi giao lưu chia sẻ kiến thức là quan trọng còn OT là ai thì cũng không phải vấn đề, với OT sự tôn trọng mọi người & tuân thủ qui định nơi này là quan tọng nhất. Ngay cả khi nhờ vả riêng tư ai đó , OT luôn muốn gửi lời cảm ơn bằng hiện vật phần lớn là bị từ chối OT cũng rất ngại, (vẫn có người thông cảm vì phải nài nỉ nhiều lần mà nhận một chút)
Không dấu gì Bạn OT cũng vẫn còn một nick nữa nhưng từ lâu cũng không viết bài nick này là ảnh đại diện của 2 mẹ con OT (có người đã biết đến nick này với nick đó là một cặp) , OT thay đổi cũng vì vấn đề riêng tư liên quan đến công việc sau khi chuyển công tác.
Bạn ở HN nếu muốn biết OT thì OT có thể gặp bạn để giao lưu.. còn trên đây với OT không tiện mong bạn thông cảm.
Cảm ơn Bạn đã quan tâm.
 
Câu 1 đọc sai câu hỏi (for i = m to 1000 step n cơ mà?) câu 2 sai câu trả lời
Trả lời câu 2: Do function nhận tham số ByRef của k truyền vào, nên giá trị k của sub chính thay đổi do Function.
Em chào bác ạ!
Em thấy 1 vấn đề có rất nhiều giải pháp,
Bác có thể giải quyết bằng Power Query không ạ.
 
Bạn hiểu lầm rồi. Phần đó tách riêng bởi dấu gạch gạch ---. Không nói tới bạn gì cả.

Xin lỗi Bạn vì OT đã hiểu nhầm,
cảm ơn Bạn đã chỉ dẫn với gợi ý của Bạn OT thử làm để kiểm tra thì kết quả như sau, mong Bạn chỉ dẫn thêm ạ:
Mã:
Sub vidu()

    Dim startCount As Long, stp As Long
    Dim i As Long, r As Long, iCount As Long, x As Long
    
    Const maxCount As Long = 5
    Const minStp As Long = 1 ' Khi de gia tri <0 (hoac=0) vong lap i khong thoat
    Const t As Long = 7
    r = 1
    Range("A1").Resize(10000, 5).ClearContents
    
    Cells(r, 1) = "startCount"
    Cells(r, 2) = "stp"
    Cells(r, 3) = "iCount"
    Cells(r, 4) = "i"
    Cells(r, 5) = "x"
    For startCount = 1 To maxCount
        For stp = minStp To maxCount
            r = r + 1
            Cells(r, 1) = startCount
            Cells(r, 2) = stp
            For i = startCount To maxCount Step stp
                iCount = i
                x = iCount + t
            Next i
            Cells(r, 3) = iCount
            Cells(r, 4) = i
            Cells(r, 5) = x
        Next stp
    Next startCount
    
End Sub

1613812801163.png
 
Web KT
Back
Top Bottom