Hỏi về ý nghĩa code dùng dictionary

Liên hệ QC

Yeuvoyeucon

Thành viên hoạt động
Tham gia
30/10/09
Bài viết
143
Được thích
23
Kính gửi anh chị và các bạn,
Em ngồi học về Dictionary và có đọc các bài của diễn đàn. Nhưng thực sự em thấy khó hiểu và khó tưởng tượng quá ạ. Anh chị cho em xin ý nghĩa từng đoạn code dưới này với ạ.
+ a = 1 nghĩa là gì ạ
+ Từ đoạn dk = arr(i, 1) & "#" & arr(i, 2) đến hết e không hiểu ạ.
Mã:
Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, j As Long
    Set dic = CreateObject("scripting.dictionary")
    a = 1
    With Sheets("sheet1")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:D" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 5)
         For i = 1 To UBound(arr)
             dk = arr(i, 1) & "#" & arr(i, 2)
             If Not dic.exists(dk) Then
                dic.Add dk, a
                For j = 1 To 4
                   kq(a, j) = arr(i, j)
                Next j
                kq(a, 5) = "gio vao"
                a = a + 2
             Else
               b = dic.Item(dk) + 1
               For j = 1 To 4
                  kq(b, j) = arr(i, j)
               Next j
               kq(b, 5) = "gio ra"
             End If
        Next i
 
Kiếm đoạn dic khác chân phương hơn 1 chút chứ đoạn này hơi khó chút xíu.
 
Upvote 0
Kiếm đoạn dic khác chân phương hơn 1 chút chứ đoạn này hơi khó chút xíu.
File nó đây anh ạ. File ở diễn đàn mình ạ. Nếu theo tư duy bình thường thì với mỗi nhân viên trong một ngày tìm giờ min và giờ max và list ra ạ. Nhưng em đọc code không hiểu chỗ nào nó làm kiểu đó, hay là một giải thuật khác ạ. Mong anh chỉ giúp ạ.
 

File đính kèm

  • cham cong (1).xlsm
    21 KB · Đọc: 16
Upvote 0
File nó đây anh ạ. File ở diễn đàn mình ạ. Nếu theo tư duy bình thường thì với mỗi nhân viên trong một ngày tìm giờ min và giờ max và list ra ạ. Nhưng em đọc code không hiểu chỗ nào nó làm kiểu đó, hay là một giải thuật khác ạ. Mong anh chỉ giúp ạ.
Lúc nào trên máy tính tôi sẽ cho 1 ví dụ dễ hiểu hơn đối với bạn. Hiểu cái đơn giản rồi mới dần dần lấn tới.
 
Upvote 0
@Yeuvoyeucon Bạn xem bài viết hướng dẫn này xem
 
Upvote 0
@Yeuvoyeucon Bạn xem bài viết hướng dẫn này xem
Dạ, mình đọc rồi bạn ạ. Toàn cái hay. Nhưng đi vào thực tế mình đọc mình không hiểu hết được. Nhiều khi có thuật toán giải khác so với tư duy thông thường của mình.
 
Upvote 0
Kính gửi anh chị và các bạn,
Em ngồi học về Dictionary và có đọc các bài của diễn đàn. Nhưng thực sự em thấy khó hiểu và khó tưởng tượng quá ạ. Anh chị cho em xin ý nghĩa từng đoạn code dưới này với ạ.
+ a = 1 nghĩa là gì ạ
+ Từ đoạn dk = arr(i, 1) & "#" & arr(i, 2) đến hết e không hiểu ạ.
Mã:
Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, j As Long
    Set dic = CreateObject("scripting.dictionary")
    a = 1
    With Sheets("sheet1")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr < 3 Then Exit Sub
         arr = .Range("A3:D" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 5)
         For i = 1 To UBound(arr)
             dk = arr(i, 1) & "#" & arr(i, 2)
             If Not dic.exists(dk) Then
                dic.Add dk, a
                For j = 1 To 4
                   kq(a, j) = arr(i, j)
                Next j
                kq(a, 5) = "gio vao"
                a = a + 2
             Else
               b = dic.Item(dk) + 1
               For j = 1 To 4
                  kq(b, j) = arr(i, j)
               Next j
               kq(b, 5) = "gio ra"
             End If
        Next i
Bỏ lấy cái đấy đi để hiểu,

1) Nên học lại cơ bản VBA , vì không hiểu
a=1
thì hiểu dictionary object chi cho vội

2) sau khi hiểu VBA cơ bản thì tìm kiếm Dictionary cơ bản mà đọc
 
Upvote 0
Bỏ lấy cái đấy đi để hiểu,

1) Nên học lại cơ bản VBA , vì không hiểu
a=1
thì hiểu dictionary object chi cho vội

2) sau khi hiểu VBA cơ bản thì tìm kiếm Dictionary cơ bản mà đọc
Cách học của người đi làm và có tuổi sẽ khác với người trẻ bạn ạ. Học ngoại ngữ cũng thế thôi, người đi làm học ngoại ngữ cũng có cách học riêng để đốt nhanh giai đoạn ở đoạn nào đó. Mỗi người một cách học và nhu cầu tùy theo điều kiện và thời gian. Mình ở cơ quan chủ yếu dùng SQL còn VBA mình có biết tý chút nhưng mình đang tìm hiểu về Dic và với mình nó là cái khó, nên mình mới hỏi.
 
Upvote 0
File nó đây anh ạ. File ở diễn đàn mình ạ. Nếu theo tư duy bình thường thì với mỗi nhân viên trong một ngày tìm giờ min và giờ max và list ra ạ. Nhưng em đọc code không hiểu chỗ nào nó làm kiểu đó, hay là một giải thuật khác ạ. Mong anh chỉ giúp ạ.

File này của bạn chỉ chạy đúng khi dữ liệu ngày giờ đã được sắp xếp tăng dần, nếu không có sắp xếp sẽ chạy sai giờ vào/ ra.
 
Upvote 0
Đây là diễn đạt theo cách mình hiểu, thuật ngữ nhiều khi không rành lắm, bạn cứ xem lại cái cơ bản trên diễn đàn nhiều lắm là sẽ hiểu hơn. "Văn viết" ra nhiều khi bạn đọc xong cũng không hiểu, có người giảng thì dễ hiểu hơn.
Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, j As Long 'khai báo biến
Set dic = CreateObject("scripting.dictionary") 'tạo đối tượng Dictionary
a = 1 ‘mặc định giá trị bắt đầu của biến a là 1
With Sheets("sheet1") 'tại sheet1
lr = .Range("A" & Rows.Count).End(xlUp).Row ‘Xác định biến lr = vị trí dòng cuối cùng có dữ liệu tại cột A
If lr < 3 Then Exit Sub ‘nếu biến lr nhỏ hơn 3 (dữ liệu bên dưới hàng tiêu đề không có thì thoát sub không thực hiện tiếp nữa)
arr = .Range("A3:D" & lr).Value ‘nạp vùng từ A3 đến cột D hàng cuối cùng có dữ liệu tại cột A (lr)
ReDim kq(1 To UBound(arr), 1 To 5) ‘xác định lại kích thước cho mảng kq (gồm số hàng = số phần tử từ A3:A & lr, số cột = 5 cột)
For i = 1 To UBound(arr) ‘vòng lặp chạy từ 1 đến giá trị cuối cùng tại cột đầu tiên của mảng arr
dk = arr(i, 1) & "#" & arr(i, 2) ‘biến dk là chuỗi ghép từ 2 cột A và B, dấu # để phân biệt sự khác nhau giữa "abc_def" va "ab_cdef" khi nối chuỗi lại
If Not dic.exists(dk) Then ‘phương thức exists kiểm tra sự tồn tại của khóa dk, nếu “not” là chưa có khóa này trong dic thì thực hiện tiếp
dic.Add dk, a ‘phương thức add sẽ đánh dấu key cho biến dk là a lúc này có giá trị a=1
For j = 1 To 4 ‘vòng for chạy từ 1 đến 4 tương ứng với 4 cột của mảng kq và mảng arr
kq(a, j) = arr(i, j) ‘mảng kq = mảng arr (giá trị tương ứng vị trí hàng thứ 1 trong mảng và cột 1,2,3,4)
Next j
kq(a, 5) = "gio vao" ‘ghi chú cột thứ 5 của mảng tại dòng thứ a là “gio vao”
a = a + 2 ‘thay đổi giá trị của a tăng thêm 2 dòng (để dòng bên dưới sẽ ghi "giờ ra")
Else ‘ngược lại điều kiện if trên là xét khóa dk nếu lặp lại (đã tồn tại key ghi nhớ ở mệnh đề if trên rồi)
b = dic.Item(dk) + 1 ‘lúc này biến b sẽ bằng key đã ghi nhớ của biến dk tăng thêm 1 (nghĩa là vòng lặp For xét có bao nhiêu dòng giờ ra trong ngày thì hàng tính giờ ra sau cùng sẽ ghi vào mảng bên dưới hàng "giờ vào")
For j = 1 To 4 ‘tương tự như trên
kq(b, j) = arr(i, j) ‘tương tự như trên
Next j 'kết thúc vòng lặp
kq(b, 5) = "gio ra" ‘ghi chú cột thứ 5 của mảng tại dòng b là “gio ra”
End If 'kết thúc if
Next i
... chắc còn phần code ghi mảng ra sheet tại vị trí nào nữa là xong.
 
Upvote 0
Mong anh cho ý nghĩa của các dòng trong code và thuật toán của code với ạ.

Mình giải thích theo cách hiểu của bản thân, bạn tham khảo:

1628927246718.png
1628927285673.png

Mã:
Option Explicit

Sub laydulieu()
    '//Khai baìo biêìn
    Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, j As Long
    '//KhõÒi taòo Dic
    Set dic = CreateObject("scripting.dictionary")
    
    a = 1 'a bãìt ðâÌu = 1 , doÌng ðâÌu tiên trong maÒng kq
    With Sheets("sheet1")
        '//Xaìc ðiònh doÌng cuôìi trong baÒng dýÞ liêòu cãn cýì vaÌo côòt A ðêÒ xaìc ðiònh
         lr = .Range("A" & Rows.Count).End(xlUp).Row
        
         '// nêìu doÌng cuôìi < 3 không coì dýÞ liêòu thiÌ thoaìt câu lêònh
         If lr < 3 Then Exit Sub
        
         '// gaìn dýÞ liêòu vaÌo baÒng bãìt ðâÌu týÌ côòt A doÌng 3 ðêìn côòt B doÌng Lr(tiÌm ðýõòc)
         arr = .Range("A3:D" & lr).Value
        
         'khai baìo maÒng kq ðêÒ gaìn kêìt quaÒ võìi chiêÌu thýì nhâìt = maÒng ar, chiêÌu thýì 2 (5 côòt)
         ReDim kq(1 To UBound(arr), 1 To 5)
        
         For i = 1 To UBound(arr) '//Duyêòt caìc lâÌn lýõòt theo chiêÌu thýì nhâìt
            
             '//xaìc ðiònh ðiêÌu kiêòn câÌn ðýa vaÌo dic
             dk = arr(i, 1) & "#" & arr(i, 2) '//NgaÌy thaìng + IdNumber
             '"#" ðêÒ phân biêòt trong trýõÌng hõòp nôìi 2 chuôÞi laòi biò truÌng nhau, viì duò:
             '  "abc" & "def" = "abcdef" -->      chuôÞi 1
             '  "ab"  &  "cdef"= "abcdef" -->     chuôÞi 2
             ' => chuôÞi 1 = chuôÞi 2  cuÌng laÌ "abcdef" nêìu gaìn vaÌo dic thiÌ chiÒ châìp nhâòn ðýõòc 1 giaì triò.
             ' do ðoì nêìu muôìn phân biêòt 2 chuôÞi gheìp naÌy thiÌ câÌn gaìn môòt hoãòc chuôÞi kyì týò ðãòc biêòt ðêÒ phân biêòt 2 chuôÞi
             '  "abc" & "#" & "def" = "abc#def" -->      chuôÞi 1
             '  "ab" & "#" &  "cdef"= "ab#cdef" -->      chuôÞi 2
            
             If Not dic.exists(dk) Then '//nêìu chuôÞi dk chýa tôÌn taòi trong dic
                dic.Add dk, a '// ðýa chuôÞi dk vaÌo dic , týõng ýìng võìi doÌng dýÞ liêòu a trong maÒng kq
                For j = 1 To 4 'Duyêòt 4 côòt trong maÒng, týõng ýìng 4 côòt A,B,C,D trên baÒng tiình
                   kq(a, j) = arr(i, j) ' bãìt ðâÌu gaìn vaÌo doÌng a trong maÒng kq (kêìt quaÒ) ,
                   '//lâÌn lýõòt týÌ côòt 1 ðêìn côòt 4
                Next j
                kq(a, 5) = "gio vao" ' côòt thýì 5 trong maÒng kêìt quaÒ gaìn "gio vao"
                a = a + 2 'nhaÒy caìch doÌng(caìch 1 doÌng)sau môÞi lâÌn tiÌm ðýõòc kêìt quaÒ dk duy nhâìt a tãng 2 giaì triò
                
             Else
               b = dic.Item(dk) + 1 ' nêìu truÌng ngaÌy vaÌ IdNuber thiÌ xaìc ðiònh doÌng dýÞ liêòu truÌng trong maÒng kq (a),
               'khi xaìc ðiònh ðýõòc doÌng truÌng thiÌ + 1 (gaìn giaì triò vaÌo ngay doÌng bên dýõìi )
               'nêìu õÒ trên caìc giaì triò gaìn vaÌo doÌng a thiÌ õÒ ðây seÞ laÌ a+1
               For j = 1 To 4 '// duyêòt 4 côòt nhý trên vaÌ gaìn giaì triò lâÌn lýõòt
                  kq(b, j) = arr(i, j)
               Next j
               kq(b, 5) = "gio ra" ' côòt thýì 5 trong maÒng kêìt quaÒ gaìn "gio ra" týõng ýìng laÌ a+1
             End If
        Next i
        '//Xaìc ðiònh doÌng cuôìi trong baÒng dýÞ liêòu cãn cýì vaÌo côòt I ðêÒ xaìc ðiònh
        lr = .Range("I" & Rows.Count).End(xlUp).Row
        
        If lr > 2 Then .Range("I3:M" & lr).ClearContents '//Nêìu coì dýÞ liêòu thiÌ xoìa
        
        'nêìu > 0 : caìi naÌy laÌ thýÌa a luôn >0 viÌ a bãìt ðâÌu =1
        If a Then .Range("I3:M3").Resize(a - 1).Value = kq ' gaìn dýÞ liêòu trong maÒng kq xuôìng sheet
        
   End With

End Sub
 
Upvote 0
Đây là diễn đạt theo cách mình hiểu, thuật ngữ nhiều khi không rành lắm, bạn cứ xem lại cái cơ bản trên diễn đàn nhiều lắm là sẽ hiểu hơn. "Văn viết" ra nhiều khi bạn đọc xong cũng không hiểu, có người giảng thì dễ hiểu hơn.
Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, j As Long 'khai báo biến
Set dic = CreateObject("scripting.dictionary") 'tạo đối tượng Dictionary
a = 1 ‘mặc định giá trị bắt đầu của biến a là 1
With Sheets("sheet1") 'tại sheet1
lr = .Range("A" & Rows.Count).End(xlUp).Row ‘Xác định biến lr = vị trí dòng cuối cùng có dữ liệu tại cột A
If lr < 3 Then Exit Sub ‘nếu biến lr nhỏ hơn 3 (dữ liệu bên dưới hàng tiêu đề không có thì thoát sub không thực hiện tiếp nữa)
arr = .Range("A3:D" & lr).Value ‘nạp vùng từ A3 đến cột D hàng cuối cùng có dữ liệu tại cột A (lr)
ReDim kq(1 To UBound(arr), 1 To 5) ‘xác định lại kích thước cho mảng kq (gồm số hàng = số phần tử từ A3:A & lr, số cột = 5 cột)
For i = 1 To UBound(arr) ‘vòng lặp chạy từ 1 đến giá trị cuối cùng tại cột đầu tiên của mảng arr
dk = arr(i, 1) & "#" & arr(i, 2) ‘biến dk là chuỗi ghép từ 2 cột A và B, dấu # để phân biệt sự khác nhau giữa "abc_def" va "ab_cdef" khi nối chuỗi lại
If Not dic.exists(dk) Then ‘phương thức exists kiểm tra sự tồn tại của khóa dk, nếu “not” là chưa có khóa này trong dic thì thực hiện tiếp
dic.Add dk, a ‘phương thức add sẽ đánh dấu key cho biến dk là a lúc này có giá trị a=1
For j = 1 To 4 ‘vòng for chạy từ 1 đến 4 tương ứng với 4 cột của mảng kq và mảng arr
kq(a, j) = arr(i, j) ‘mảng kq = mảng arr (giá trị tương ứng vị trí hàng thứ 1 trong mảng và cột 1,2,3,4)
Next j
kq(a, 5) = "gio vao" ‘ghi chú cột thứ 5 của mảng tại dòng thứ a là “gio vao”
a = a + 2 ‘thay đổi giá trị của a tăng thêm 2 dòng (để dòng bên dưới sẽ ghi "giờ ra")
Else ‘ngược lại điều kiện if trên là xét khóa dk nếu lặp lại (đã tồn tại key ghi nhớ ở mệnh đề if trên rồi)
b = dic.Item(dk) + 1 ‘lúc này biến b sẽ bằng key đã ghi nhớ của biến dk tăng thêm 1 (nghĩa là vòng lặp For xét có bao nhiêu dòng giờ ra trong ngày thì hàng tính giờ ra sau cùng sẽ ghi vào mảng bên dưới hàng "giờ vào")
For j = 1 To 4 ‘tương tự như trên
kq(b, j) = arr(i, j) ‘tương tự như trên
Next j 'kết thúc vòng lặp
kq(b, 5) = "gio ra" ‘ghi chú cột thứ 5 của mảng tại dòng b là “gio ra”
End If 'kết thúc if
Next i
... chắc còn phần code ghi mảng ra sheet tại vị trí nào nữa là xong.
Cảm ơn bạn đã đọc và chỉ bảo. Mình sẽ đọc kỹ !
 
Upvote 0
Cách học của người đi làm và có tuổi sẽ khác với người trẻ bạn ạ. Học ngoại ngữ cũng thế thôi, người đi làm học ngoại ngữ cũng có cách học riêng để đốt nhanh giai đoạn ở đoạn nào đó. Mỗi người một cách học và nhu cầu tùy theo điều kiện và thời gian. Mình ở cơ quan chủ yếu dùng SQL còn VBA mình có biết tý chút nhưng mình đang tìm hiểu về Dic và với mình nó là cái khó, nên mình mới hỏi.
Bạn xem file ví dụ và giải thích từng dòng code trong đó
 

File đính kèm

  • DictionaryExample.xlsm
    15.6 KB · Đọc: 11
Upvote 1
Mình giải thích theo cách hiểu của bản thân, bạn tham khảo:

View attachment 264074
View attachment 264075

Mã:
Option Explicit

Sub laydulieu()
    '//Khai baìo biêìn
    Dim arr, i As Long, dk As String, kq, dic As Object, lr As Long, b As Long, a As Long, j As Long
    '//KhõÒi taòo Dic
    Set dic = CreateObject("scripting.dictionary")
   
    a = 1 'a bãìt ðâÌu = 1 , doÌng ðâÌu tiên trong maÒng kq
    With Sheets("sheet1")
        '//Xaìc ðiònh doÌng cuôìi trong baÒng dýÞ liêòu cãn cýì vaÌo côòt A ðêÒ xaìc ðiònh
         lr = .Range("A" & Rows.Count).End(xlUp).Row
       
         '// nêìu doÌng cuôìi < 3 không coì dýÞ liêòu thiÌ thoaìt câu lêònh
         If lr < 3 Then Exit Sub
       
         '// gaìn dýÞ liêòu vaÌo baÒng bãìt ðâÌu týÌ côòt A doÌng 3 ðêìn côòt B doÌng Lr(tiÌm ðýõòc)
         arr = .Range("A3:D" & lr).Value
       
         'khai baìo maÒng kq ðêÒ gaìn kêìt quaÒ võìi chiêÌu thýì nhâìt = maÒng ar, chiêÌu thýì 2 (5 côòt)
         ReDim kq(1 To UBound(arr), 1 To 5)
       
         For i = 1 To UBound(arr) '//Duyêòt caìc lâÌn lýõòt theo chiêÌu thýì nhâìt
           
             '//xaìc ðiònh ðiêÌu kiêòn câÌn ðýa vaÌo dic
             dk = arr(i, 1) & "#" & arr(i, 2) '//NgaÌy thaìng + IdNumber
             '"#" ðêÒ phân biêòt trong trýõÌng hõòp nôìi 2 chuôÞi laòi biò truÌng nhau, viì duò:
             '  "abc" & "def" = "abcdef" -->      chuôÞi 1
             '  "ab"  &  "cdef"= "abcdef" -->     chuôÞi 2
             ' => chuôÞi 1 = chuôÞi 2  cuÌng laÌ "abcdef" nêìu gaìn vaÌo dic thiÌ chiÒ châìp nhâòn ðýõòc 1 giaì triò.
             ' do ðoì nêìu muôìn phân biêòt 2 chuôÞi gheìp naÌy thiÌ câÌn gaìn môòt hoãòc chuôÞi kyì týò ðãòc biêòt ðêÒ phân biêòt 2 chuôÞi
             '  "abc" & "#" & "def" = "abc#def" -->      chuôÞi 1
             '  "ab" & "#" &  "cdef"= "ab#cdef" -->      chuôÞi 2
           
             If Not dic.exists(dk) Then '//nêìu chuôÞi dk chýa tôÌn taòi trong dic
                dic.Add dk, a '// ðýa chuôÞi dk vaÌo dic , týõng ýìng võìi doÌng dýÞ liêòu a trong maÒng kq
                For j = 1 To 4 'Duyêòt 4 côòt trong maÒng, týõng ýìng 4 côòt A,B,C,D trên baÒng tiình
                   kq(a, j) = arr(i, j) ' bãìt ðâÌu gaìn vaÌo doÌng a trong maÒng kq (kêìt quaÒ) ,
                   '//lâÌn lýõòt týÌ côòt 1 ðêìn côòt 4
                Next j
                kq(a, 5) = "gio vao" ' côòt thýì 5 trong maÒng kêìt quaÒ gaìn "gio vao"
                a = a + 2 'nhaÒy caìch doÌng(caìch 1 doÌng)sau môÞi lâÌn tiÌm ðýõòc kêìt quaÒ dk duy nhâìt a tãng 2 giaì triò
               
             Else
               b = dic.Item(dk) + 1 ' nêìu truÌng ngaÌy vaÌ IdNuber thiÌ xaìc ðiònh doÌng dýÞ liêòu truÌng trong maÒng kq (a),
               'khi xaìc ðiònh ðýõòc doÌng truÌng thiÌ + 1 (gaìn giaì triò vaÌo ngay doÌng bên dýõìi )
               'nêìu õÒ trên caìc giaì triò gaìn vaÌo doÌng a thiÌ õÒ ðây seÞ laÌ a+1
               For j = 1 To 4 '// duyêòt 4 côòt nhý trên vaÌ gaìn giaì triò lâÌn lýõòt
                  kq(b, j) = arr(i, j)
               Next j
               kq(b, 5) = "gio ra" ' côòt thýì 5 trong maÒng kêìt quaÒ gaìn "gio ra" týõng ýìng laÌ a+1
             End If
        Next i
        '//Xaìc ðiònh doÌng cuôìi trong baÒng dýÞ liêòu cãn cýì vaÌo côòt I ðêÒ xaìc ðiònh
        lr = .Range("I" & Rows.Count).End(xlUp).Row
       
        If lr > 2 Then .Range("I3:M" & lr).ClearContents '//Nêìu coì dýÞ liêòu thiÌ xoìa
       
        'nêìu > 0 : caìi naÌy laÌ thýÌa a luôn >0 viÌ a bãìt ðâÌu =1
        If a Then .Range("I3:M3").Resize(a - 1).Value = kq ' gaìn dýÞ liêòu trong maÒng kq xuôìng sheet
       
   End With

End Sub
Cảm ơn OT đã trợ giúp. Mong bạn luôn bình an !
 
Upvote 0
Bạn xem file ví dụ và giải thích từng dòng code trong đó
Ví dụ của em đúng như anh Ongke0711 nói thì nếu không xếp theo thứ tự tăng dần, code sẽ bị sai thật. Vì theo tư duy đơn giản của em phải có cái gì đó so sánh theo giờ lớn bé min, max ở đây. Em cảm ơn Anh đã giúp đỡ ạ.
Bài đã được tự động gộp:

Hic. Tôi đọc code đó còn tẩu hỏa nhập ma nữa là.
Cảm ơn OT và Anh Maika. Đã F8 để đọc kết quả nhưng cũng vẫn khó hiểu. Dic với em thấy khó thật. Em cần nhiều thời gian để đọc và nghiền ngẫm thêm.
 
Upvote 0
Upvote 0
Web KT
Back
Top Bottom