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

Liên hệ QC
Làm gì mà loằng ngoằng thế.
Chỉ cần thử nghiệm đúng 1 cấu trúc chuẩn của For...Next thôi. Để nắm chắc nó hoặt động như nào, kết thúc thì counter bằng bao nhiêu?

1613814348668.png

Điểm quan trọng là ở cái giá trị step có 3 trường hợp: <0, =0, >0 thì không chịu thử nghiệm.

Đã viết sẵn cho rồi, chỉ cần thay giá trị vào rồi xem là xong thôi.
 
Làm gì mà loằng ngoằng thế.
Chỉ cần thử nghiệm đúng 1 cấu trúc chuẩn của For...Next thôi. Để nắm chắc nó hoặt động như nào, kết thúc thì counter bằng bao nhiêu?

View attachment 254344

Điểm quan trọng là ở cái giá trị step có 3 trường hợp: <0, =0, >0 thì không chịu thử nghiệm.

Đã viết sẵn cho rồi, chỉ cần thay giá trị vào rồi xem là xong thôi.
Ủa có mà Bạn, OT có ghi chú khi thử các trị âm hoặc = 0 thì vòng lặp i không có điểm kết thúc ạ.
Cũng có thể là do OT viết sai câu lệnh nên nó mới vậy ạ, híc OT xem thêm ạ :
Mã:
    ...
    Const minStp As Long = 1 ' Khi de gia tri <0 (hoac=0) vong lap i khong thoat
    ...
        For stp = minStp To maxCount
    ...
            For i = startCount To maxCount Step stp
    ...
 
Cái bảng báo cáo thử nghiệm có đâu?

Mà sao step < 0 lại bị thế?

Chốt lại là mình không cần làm gớm vậy. Thật đơn giản thôi.

View attachment 254345

Đây ạ, khi stp=0 (hoặc <0) thì i lặp đi lặp lại là 1 khồn tăng nên không thoát được i:
Hic mớ đầu OT cũng làm đơn giản như vi dụ của Bạn nhưng chưa hình dung được bước chạy với các thay đổi giá trị: startCount & stp nên phải tạo thêm các vòng lặp để đưa xuống sheet cho dễ nhìn hơn, vì trong cửa số debug OT coi không quen ạ:

1613815909469.png
À với step < 0 thì thoát luôn i Bạn à, nhưng do OT để nó chạy từ âm đến dương qua 0 nên nó không thoát được được, OT hiểu rồi.
Cảm ơn Bạn đã nhắc.
 
Lần chỉnh sửa cuối:
Phần diễn biến của Bạn, OT hiểu bạn đang muốn nói gì
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ả.
Phần đó nói về sự tích lão chết tiệt từ chối 1 tấn mật ong rừng, không có mật để chia cho befaint nên ảnh puồn.
Tôi kể câu chuyện chiều nay tại sao đến giờ mới đọc các câu trả lời:
Bà xã bảo: ông rảnh quá ông lấy rổ giá (giá đỗ) ra bứt và đếm xem bao nhiêu cái rễ. Mình vừa bứt vừa đếm đến hơn 100 thì bả hỏi "xong chưa", mình nói chưa xong, quay lại thì quên mất con số. Báo cho bả biết thì bả bảo đếm tiếp nhưng bắt đầu lại từ 1 cũng được. Mình nghe lời đếm lại từ 1 và bị đếm lại như thế 4, 5 lần. Khi xong hết báo cho bả biết là 12, rồi hỏi bà cần biết số rễ làm gì mà giờ chỉ còn 12?
Bả nói xong rồi thì thôi, ông tự suy luận đi, cuối cùng mình kết luận là bả biểu mình lặt rau.

Câu chuyện liên quan ở đây là: Với yêu cầu viết công thức tính ra giá trị counter khi thoát vòng lặp For i = m to 1000 Step n (chứ không phải giá trị cuối của vòng lặp), nếu đã liệt kê ra 1 bảng rồi thì phải suy luận đưa ra 1 công thức tính cho m và n bất kỳ. Và phải suy luận mới ra, đó là mục đích cuối của việc đố, cũng như phải suy luận mới ra việc bị lặt rau chứ không phải đếm rễ

Ghi chú:
Step âm là trừ cho đến khi nhỏ hơn hoặc bằng 1000. Vậy thì m phải đặt con số lớn hơn 1000 chứ?
 
Lần chỉnh sửa cuối:
View attachment 254349

Không ai can thiệp tới counter trong vòng lặp. Khi nào cần tỏ ra 'nguy hiểm' lắm mới thay đổi counter thôi.
Cảm ơn Bạn,
Do OT không hiểu về vấn đề này (bảo sao Bạn cứ bảo làm thật đơn giản thôi) chỉ nghĩ đơn giản không thấy rõ được các bước lặp loại này nên loay hoay mãi làm thử để đưa xuốn sheet để xem cho dễ thôi ạ, tránh đoán mò như những bài trước ..

Phần đó nói về sự tích lão chết tiệt từ chối 1 tấn mật ong rừng, không có mật để chia cho befaint nên ảnh puồn.
Tôi kể câu chuyện chiều nay tại sao đến giờ mới đọc các câu trả lời:
Bà xã bảo: ông rảnh quá ông lấy rổ giá (giá đỗ) ra bứt và đếm xem bao nhiêu cái rễ. Mình vừa bứt vừa đếm đến hơn 100 thì bả hỏi "xong chưa", mình nói chưa xong, quay lại thì quên mất con số. Báo cho bả biết thì bả bảo đếm tiếp nhưng bắt đầu lại từ 1 cũng được. Mình nghe lời đếm lại từ 1 và bị đếm lại như thế 4, 5 lần. Khi xong hết báo cho bả biết là 12, rồi hỏi bà cần biết số rễ làm gì mà giờ chỉ còn 12?
Bả nói xong rồi thì thôi, ông tự suy luận đi, cuối cùng mình kết luận là bả biểu mình lặt rau.

Câu chuyện liên quan ở đây là: Với yêu cầu viết công thức tính ra giá trị counter khi thoát vòng lặp For i = m to 1000 Step n (chứ không phải giá trị cuối của vòng lặp), nếu đã liệt kê ra 1 bảng rồi thì phải suy luận đưa ra 1 công thức tính cho m và n bất kỳ. Và phải suy luận mới ra, đó là mục đích cuối của việc đố, cũng như phải suy luận mới ra việc bị lặt rau chứ không phải đếm rễ

Ghi chú:
Step âm là trừ cho đến khi nhỏ hơn hoặc bằng 1000. Vậy thì m phải đặt con số lớn hơn 1000 chứ?
Thảo nào Chú Mỹ nhớ lâu vậy vì hay liên tưởng việc làm trong cuộc sống đến kiến thức, nhưng pahir có kiến thức thì mới liên tưởng được chứ ạ.
Con cũng chưa tìm hiểu việc đặt số nó có ảnh hưởng gì không nhưng vì duy nghĩ đặt vòng lặp for lồng nhiều vào nhau nên con giảm con số để mang tính test thử rồi ngẫm ra công thức dạng như bài 33 đó ạ:
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
 
Con cũng chưa tìm hiểu việc đặt số nó có ảnh hưởng gì không nhưng vì duy nghĩ đặt vòng lặp for lồng nhiều vào nhau nên con giảm con số để mang tính test thử rồi ngẫm ra công thức dạng như bài 33 đó ạ:
Nhiều mà sai thì nhiều làm gì (như befaint nói đụng vào counter)
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ẫu cứ là sai câu hỏi: i = m to 1000 step n, chứ không phải i=1 to m step n.

Cũng còn may chứ không tôi hỏi tới i = m to k step n là còn bể não nữa đó
 
Không phải ngẫu nhiên tôi viết code để test trong bài 21
Mã:
EndRow = 1000
For i = 1 to EndRow
    k = i
Next
Msgbox i & "-" & k
tôi viết k = i trong vòng lặp và Msgbox ngoài vòng lặp là để k lấy giá trị cuối của i trong vòng lặp, và Msgbox hiển thị 1 số cuối trong vòng lặp so sánh với khi ra khỏi vòng lặp.
Code viết nhiều để test cũng theo cấu trúc trên cho trường hợp tổng quát For i = m to k step n là:

PHP:
Sub TestOutputCounter()
Dim m As Long, i As Long, n As Long, k As Long, j As Long, p As Long
For i = 2 To 20
    m = Cells(i, 1)
    k = Cells(i, 2)
    n = Cells(i, 3)
    For j = m To k Step n
        p = j
    Next
    Cells(i, 4) = p
    Cells(i, 5) = j
Next
End Sub
Giải thích code:
Lấy m (start), k (end), n (step) trên bảng tính ở 3 cột A, B, C. Kết quả số cuối của counter j trong vòng lặp gán vào cột D, giá trị sau khi ra khỏi vòng lặp của j gán xuống cột E
Kết quả:

1613837120708.png

Nhận xét:
p (last counter) = m (start) +bội số lớn nhất của n (step) mà nhỏ hơn k (end). Chỉ cần cộng counter thêm 1 step thì lớn hơn end. Đó chính là Output counter j
Có thể tính ra last counter bằng công thức sau đó cộng thêm step để cho ra counter
D2 = Last counter = End - MOD( End - Start, Step) =B2-MOD(B2-A2,C2)
E2 = Output Counter + Step = End - MOD( End - Start, Step) + Step = B2-MOD(B2-A2,C2)+C2

1613837153998.png

Test với Step âm: phải cho m lớn hơn k (start > end) mới chạy

1613837430986.png
 
Lần chỉnh sửa cuối:
Không phải ngẫu nhiên tôi viết code để test trong bài 21
Mã:
EndRow = 1000
For i = 1 to EndRow
    k = i
Next
Msgbox i & "-" & k
tôi viết k = i trong vòng lặp và Msgbox ngoài vòng lặp là để k lấy giá trị cuối của i trong vòng lặp, và Msgbox hiển thị 1 số cuối trong vòng lặp so sánh với khi ra khỏi vòng lặp.
Code viết nhiều để test cũng theo cấu trúc trên cho trường hợp tổng quát For i = m to k step n là:

PHP:
Sub TestOutputCounter()
Dim m As Long, i As Long, n As Long, k As Long, j As Long, p As Long
For i = 2 To 20
    m = Cells(i, 1)
    k = Cells(i, 2)
    n = Cells(i, 3)
    For j = m To k Step n
        p = j
    Next
    Cells(i, 4) = p
    Cells(i, 5) = j
Next
End Sub
Giải thích code:
Lấy m (start), k (end), n (step) trên bảng tính ở 3 cột A, B, C. Kết quả số cuối của counter j trong vòng lặp gán vào cột D, giá trị sau khi ra khỏi vòng lặp của j gán xuống cột E
Kết quả:

View attachment 254354

Nhận xét:
p (last counter) = m (start) +bội số lớn nhất của n (step) mà nhỏ hơn (k (end) - m (start)). Chỉ cần cộng counter thêm 1 step thì lớn hơn end. Đó chính là Output counter j
Có thể tính ra last counter bằng công thức sau đó cộng thêm step để cho ra counter
D2 = Last counter = End - MOD( End - Start, Step) =B2-MOD(B2-A2,C2)
E2 = Output Counter + Step = End - MOD( End - Start, Step) + Step = B2-MOD(B2-A2,C2)+C2

View attachment 254355

Test với Step âm: phải cho m lớn hơn k (start > end) mới chạy

View attachment 254357
Trời ạ đúng là ra hại não thật không thể yêu thương được, con thì đang mải loay hoay với cái vidu của Bạn @befaint , Bạn nhắc phải đọc thật chậm thôi và đơn giản thôi giờ mới thấy thấm.
Con mới làm qua qua cái này để xem công thức tổng quát thế nào quay ra thì thấy bài của Chú Mỹ (công thức khiếp quá) để con đọc thật chậm ạ:
Cảm ơn Chú Mỹ nhiều ạ.
1613837629160.png

Cũng còn may chứ không tôi hỏi tới i = m to k step n là còn bể não nữa đó
Nhận xét:
p (last counter) = m (start) +bội số lớn nhất của n (step) mà nhỏ hơn (k (end) - m (start)). Chỉ cần cộng counter thêm 1 step thì lớn hơn end. Đó chính là Output counter j
Có thể tính ra last counter bằng công thức sau đó cộng thêm step để cho ra counter
D2 = Last counter = End - MOD( End - Start, Step) =B2-MOD(B2-A2,C2)
E2 = Output Counter + Step = End - MOD( End - Start, Step) + Step = B2-MOD(B2-A2,C2)+C2
Những ai hiểu hết code for next và viết code cũng phải bể não như thế này hả Chú Mỹ.
 
Lần chỉnh sửa cuối:
Trời ạ đúng là ra hại não thật không thể yêu thương được, con thì đang mải loay hoay với cái vidu của Bạn @befaint , Bạn nhắc phải đọc thật chậm thôi và đơn giản thôi giờ mới thấy thấm.
Con mới làm qua qua cái này để xem công thức tổng quát thế nào quay ra thì thấy bài của Chú Mỹ (công thức khiếp quá) để con đọc thật chậm ạ:
Cảm ơn Chú Mỹ nhiều ạ.
Đó là cách để suy luận trực quan. Khi quen rồi thì suy luận trực tiếp cách tính ở trong đầu không cần giấy và nháp.
Phải tập suy luận chứ chả lẽ lần sau vợ bảo đếm rễ giá lại cứ thế mà đếm sao?
 
Đó là cách để suy luận trực quan. Khi quen rồi thì suy luận trực tiếp cách tính ở trong đầu không cần giấy và nháp.
Chả lẽ lần sau vợ bảo đếm rễ lại cứ thế mà đếm sao?
Dạ con ơn Chú Mỹ nhiều , khuya rồi Chú ngủ sớm đi ạ, Chú Mỹ vừa làm quả thông lão cho con đỡ bể não như này thì Chú Mỹ nằm có ngủ được không đó? :fish:
 
Những ai hiểu hết code for next và viết code cũng phải bể não như thế này hả Chú Mỹ.
Code trên chỉ để trả lời câu hỏi về hàm Function KeyExists
Bài 15 đã viết:
Viết ào ào thế mà có biết nguyên lý hoạt động của Function KeyExists hay không vậy nhóc? Tại sao k cứ thế mà tăng 1?
Nếu không bể não làm sao trả lời được câu hỏi tại sao. Mà không biết hỏi tại sao thì cả đời chỉ xin code hoặc copy code về chạy, chứ chả bao giờ có thể tự viết
 
Nếu không bể não làm sao trả lời được câu hỏi tại sao. Mà không biết hỏi tại sao thì cả đời chỉ xin code hoặc copy code về chạy, chứ chả bao giờ có thể tự viết
Dạ, một lần nữa con cảm ơn Chú Mỹ nhiều nhé. Chú Mỹ nghỉ đi ạ, ngày mai nếu có 'rễ giá' đếm Chú không bị nhặt rau nữa >_<
 
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 ạ.
Power Query chỉ cần GroupBy thôi
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    "Grouped Rows" = Table.Group(Source, { "article_no", "Size", "Carton"}, {{"Quantity", each List.Sum([Qty]), type nullable number}}),
    "Reordered Columns" = Table.ReorderColumns("Grouped Rows",{"article_no", "Size", "Quantity", "Carton"})
in
    "Reordered Columns"
 
Power Query chỉ cần GroupBy thôi
PHP:
let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    "Grouped Rows" = Table.Group(Source, { "article_no", "Size", "Carton"}, {{"Quantity", each List.Sum([Qty]), type nullable number}}),
    "Reordered Columns" = Table.ReorderColumns("Grouped Rows",{"article_no", "Size", "Quantity", "Carton"})
in
    "Reordered Columns"
Nghỉ ngợi gì mờ quên ngủ vậy /-*+/
 
Web KT
Back
Top Bottom