Lọc những giá trị có cả trong Cột A và B (tại sao 3 If mà chỉ có 1 End If nhỉ?)

Liên hệ QC

trungvdb

Thành viên thường trực
Tham gia
22/8/08
Bài viết
374
Được thích
171
Nghề nghiệp
Tài chính
Tôi rút gọn Code thành (chạy ổn)
PHP:
Option Explicit
 Dim lRow As Long, jZ As Long, tRow As Long
   Dim lRow0 As Long, jW As Long
  
Sub FilterAll()
 lRow = Range("A65432").End(xlUp).Row
 lRow0 = Range("B65432").End(xlUp).Row
   Application.ScreenUpdating = False
     If lRow > lRow0 Then tRow = lRow Else tRow = lRow0
    Range("E3:C" & tRow).ClearContents
    For jZ = 3 To lRow
        For jW = 3 To lRow0
            If Cells(jZ, 1) = Cells(jW, 2) Then _
                Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
        Next jW
    Next jZ
     End Sub

Nhưng vẫn thắc mắc có If sao không có End If nhỉ
 
Chỉnh sửa lần cuối bởi điều hành viên:
Tại sao có 3 If mà chỉ có một End If nhỉ (đáng lẽ thông thường phải là 3 chớ).

Câu hỏi không đúng mong các thày chỉ tiếp và đừng la nhé vì tôi mới tập nhiều khái niệm chưa biết. Thanks
Phát biểu IF có thể viết:
Mã:
IF Điều kiện
  Kết quả 1
Else
 Kết quả 2
End If
Nếu không cần đến kết quả 2 thì có thể viết:
Mã:
IF điều kiện then Kết quả 1
Khỏi cần End If
Còn kiểu viết thế này:
Mã:
If Cells(jZ, 1) = Cells(jW, 2) Then [SIZE=4][COLOR=#ff0000][B]_[/B][/COLOR][/SIZE]
                Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
tương đương với cách viết:
Mã:
If Cells(jZ, 1) = Cells(jW, 2) Then Range("E" & Range("E65432").End(xlUp).Row + 1) = Cells(jZ, 1)
Dài quá nên xuống dòng bằng dấu _ nhưng VBA vẫn hiểu đấy là 1 dòng
Đây thuộc về cú pháp thôi
 
Lần chỉnh sửa cuối:
Upvote 0
Tự nhiên hôm nay tôi lại gặp rắc rối với cái If này, mong thày chỉ cho Code này thừa, thiếu cái gì mà chạy báo lỗi

PHP:
Sub LocAB()
Dim iA As Long, iB As Long, z As Long
iA = [A65000].End(xlUp).Row
iB = [B65000].End(xlUp).Row
If iA >= iB Then z = iA
Else: z = iB
End If
MsgBox z
End Sub
 
Upvote 0
Tự nhiên hôm nay tôi lại gặp rắc rối với cái If này, mong thày chỉ cho Code này thừa, thiếu cái gì mà chạy báo lỗi

PHP:
Sub LocAB()
Dim iA As Long, iB As Long, z As Long
iA = [A65000].End(xlUp).Row
iB = [B65000].End(xlUp).Row
If iA >= iB Then z = iA
Else: z = iB
End If
MsgBox z
End Sub
Bạn viết IF kỳ cục quá nên lỗi là phải rồi
Sửa lại:
Mã:
Sub LocAB()
  Dim iA As Long, iB As Long, z As Long
  iA = [A65000].End(xlUp).Row
  iB = [B65000].End(xlUp).Row
  [B][COLOR=#ff0000]If iA >= iB Then
    z = iA
  Else
    z = iB
  End If[/COLOR][/B]
  MsgBox z
End Sub
Hoặc nếu "cố tình" viết thành 1 dòng thì thế này:
Mã:
Sub LocAB()
  Dim iA As Long, iB As Long, z As Long
  iA = [A65000].End(xlUp).Row
  iB = [B65000].End(xlUp).Row
  [COLOR=#ff0000][B]If iA >= iB Then z = iA Else z = iB[/B][/COLOR]
  MsgBox z
End Sub
Cũng có thể viết cách khác:
Mã:
Sub LocAB()
  Dim iA As Long, iB As Long, z As Long
  iA = [A65000].End(xlUp).Row
  iB = [B65000].End(xlUp).Row
 [COLOR=#ff0000][B] z = IIf(iA >= iB, iA, iB)[/B][/COLOR]
  MsgBox z
End Sub
Lưu ý: IIfhàm IF trong VBA, khác với phát biểu IF nha
 
Lần chỉnh sửa cuối:
Upvote 0
Hóa ra If khi viết có anh chàng _ nó sẽ khác, vai trò của nó tựa như là cầu nối làm cho 2 dòng như là được nối thành 1 dòng, làm từ sáng tôi cứ thắc mắc giờ mới hiểu được

Viết thành nhiều dòng cần có End If, viết 1 dòng thì thôi khỏi cần

Tôi làm thử bài này bằng mảng, chạy được nhưng có vẻ như Code chưa được hợp lý lắm, mong mọi người sửa cho
PHP:
Sub LocAB()
Dim DL(), iA As Long, iB As Long, Dongcuoi As Long, i As Long, j As Long
iA = [A65000].End(xlUp).Row
iB = [B65000].End(xlUp).Row
If iA >= iB Then
Dongcuoi = iA
Else
Dongcuoi = iB
End If
DL = Range("A1:B" & Dongcuoi).Value
Range("C:C").ClearContents
For i = 1 To iA
For j = 1 To iB
If DL(i, 1) = DL(j, 2) Then
Range("C" & Range("C65000").End(xlUp).Row + 1) = DL(i, 1)
End If
Next j
Next i
End Sub

Xin hỏi cái dòng Range("C" & Range("C65000").End(xlUp).Row + 1) = DL(i, 1) có thể viết theo tiêu chí dạng khác được không?
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn thay dòng cuối Range("C" & Range("C65000").End(xlUp).Row + 1) = DL(i, 1) theo kiểu khác ví dụ :

PHP:
Sub LocAB()
Dim DL(), iA As Long, iB As Long, Dongcuoi As Long, i As Long, j As Long
iA = [A65000].End(xlUp).Row
iB = [B65000].End(xlUp).Row
If iA >= iB Then
Dongcuoi = iA
Else
Dongcuoi = iB
End If
DL = Range("A1:B" & Dongcuoi).Value
ReDim KQ(1 To UBound(DL, 1), 1 To 1)
Range("C:C").ClearContents
For i = 1 To iA
    For j = 1 To iB
        If DL(i, 1) = DL(j, 2) Then
            n = n + 1
            KQ(n, 1) = DL(i, 1)
        End If
    Next j
Next i
[C1].Resize(n).Value = KQ
End Sub

Lưu ý: Với các đoạn Code trên thì nếu một giá trị nào mà xuất hiện nhiều lần trong cột A hoặc cột B nhiều lần thì: Kết quả thu được tại cột C phản ánh giá trị đó sẽ được lặp lại nhiều lần (=số lần lặp lại ở cột nhiều hơn)
 
Upvote 0
Hóa ra If khi viết có anh chàng _ nó sẽ khác, vai trò của nó tựa như là cầu nối làm cho 2 dòng như là được nối thành 1 dòng, làm từ sáng tôi cứ thắc mắc giờ mới hiểu được

Viết thành nhiều dòng cần có End If, viết 1 dòng thì thôi khỏi cần

Tôi làm thử bài này bằng mảng, chạy được nhưng có vẻ như Code chưa được hợp lý lắm, mong mọi người sửa cho
PHP:
Sub LocAB()
Dim DL(), iA As Long, iB As Long, Dongcuoi As Long, i As Long, j As Long
iA = [A65000].End(xlUp).Row
iB = [B65000].End(xlUp).Row
If iA >= iB Then
Dongcuoi = iA
Else
Dongcuoi = iB
End If
DL = Range("A1:B" & Dongcuoi).Value
Range("C:C").ClearContents
For i = 1 To iA
For j = 1 To iB
If DL(i, 1) = DL(j, 2) Then
Range("C" & Range("C65000").End(xlUp).Row + 1) = DL(i, 1)
End If
Next j
Next i
End Sub

Xin hỏi cái dòng Range("C" & Range("C65000").End(xlUp).Row + 1) = DL(i, 1) có thể viết theo tiêu chí dạng khác được không?
Bạn có thể viết thế này:
PHP:
Sub LocAB()
  Dim DL(), iA As Long, iB As Long, Dongcuoi As Long, i As Long, j As Long, n As Long
  iA = [A65000].End(xlUp).Row
  iB = [B65000].End(xlUp).Row
  n = Range("C65000").End(xlUp).Row
  If iA >= iB Then
    Dongcuoi = iA
  Else
   Dongcuoi = iB
  End If
  DL = Range("A1:B" & Dongcuoi).Value
  Range("C:C").ClearContents
  For i = 1 To iA
    For j = 1 To iB
      If DL(i, 1) <> "" Then
        If DL(i, 1) = DL(j, 2) Then
          n = n + 1
          Range("C" & n) = DL(i, 1)
        End If
      End If
    Next
  Next
End Sub
Tuy nhiên bài này dùng mảng chưa triệt để... Đoạn Range("C" & n) = DL(i, 1) sẽ làm tốc độ xử lý chậm đi
Lý ra chổ này phải cho toàn bộ vào 1 mảng phụ, xong vòng lập, gán 1 lần vào cột C mới là ngon
-----------
Nói thêm: Đây là bài toán tìm các phần tử có trong 2 list, nếu dùng vòng lập như bạn thì dù có kết hợp với xử lý mảng như bạn vẫn chậm ---> Phải dùng Dictionary mới nhanh
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu đầu bài thay đổi là:
Tìm những giá trị xuất hiện trong cả cột A và cột B (mỗi giá trị chỉ xuất hiện 1 lần)

Tôi làm theo Dictionary không biết sai ở đâu, nhờ thày Ndu cùng mọi người chỉ giúp

PHP:
Sub LocAB()
Dim DL(), iA As Long, iB As Long, Dongcuoi As Long, i As Long, j As Long
iA = [A65000].End(xlUp).Row
iB = [B65000].End(xlUp).Row
If iA >= iB Then
Dongcuoi = iA
Else
Dongcuoi = iB
End If
DL = Range("A1:B" & Dongcuoi).Value
ReDim KQ(1 To UBound(DL, 1), 1 To 1)
Set Dic = CreateObject("Scripting Dictionary")
Range("C:C").ClearContents
For i = 1 To iA
    For j = 1 To iB
        If DL(i, 1) = DL(j, 2) And Not Dic.Exists(DL(i, 1)) Then
         n = n + 1
        Dic.Add , DL(i, 1), ""
           KQ(n, 1) = DL(i, 1)
        End If
    Next j
Next i
[C1].Resize(n).Value = KQ
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu đầu bài thay đổi là:
Tìm những giá trị xuất hiện trong cả cột A và cột B (mỗi giá trị chỉ xuất hiện 1 lần)

Tôi làm theo Dictionary không biết sai ở đâu, nhờ thày Ndu cùng mọi người chỉ giúp

PHP:
Sub LocAB()
Dim DL(), iA As Long, iB As Long, Dongcuoi As Long, i As Long, j As Long
iA = [A65000].End(xlUp).Row
iB = [B65000].End(xlUp).Row
If iA >= iB Then
Dongcuoi = iA
Else
Dongcuoi = iB
End If
DL = Range("A1:B" & Dongcuoi).Value
ReDim KQ(1 To UBound(DL, 1), 1 To 1)
Set Dic = CreateObject("Scripting Dictionary")
Range("C:C").ClearContents
For i = 1 To iA
    For j = 1 To iB
        If DL(i, 1) = DL(j, 2) And Not Dic.Exists(DL(i, 1)) Then
         n = n + 1
        Dic.Add , DL(i, 1), ""
           KQ(n, 1) = DL(i, 1)
        End If
    Next j
Next i
[C1].Resize(n).Value = KQ
End Sub
Giải thuật bài này như sau:
- Gọi mảng DL1 là dữ liệu của vùng cột A
- Gọi mảng DL2 là dữ liệu của vùng cột B
- Dùng vòng lập duyệt qua các phần tử của DL1 và Add vào Dictionary (biến Dic)
- Dùng vòng lập duyệt qua các phần tử của DL2, xét xem các phần tử này có tồn tại trong Dic hay không... Nếu có tồn tại, nạp phần tử ấy vào mảng KQ đồng thời Remove phần tử này trong Dictionary (mục đích để lần sau không bị lấy trùng)
Vậy, 2 vòng lập này là riêng biệt nhau chứ không lồng vào nhau như code của bạn
PHP:
Sub LocAB()
  Dim DL1, DL2, KQ(), i As Long, n As Long, tmp As String, Dic As Object
  On Error Resume Next
  Set Dic = CreateObject("Scripting.Dictionary")
  With Sheet1
    DL1 = .Range("A1:A10000").Value
    DL2 = .Range("B1:B10000").Value
    ReDim KQ(1 To UBound(DL1, 1), 1 To 1)
    .Range("C:C").ClearContents
    For i = 1 To UBound(DL1, 1)
      If CStr(DL1(i, 1)) <> "" Then
        tmp = CStr(DL1(i, 1))
        If Not Dic.Exists(tmp) Then Dic.Add tmp, Nothing
      End If
    Next
    For i = 1 To UBound(DL2, 1)
      If CStr(DL2(i, 1)) <> "" Then
        tmp = CStr(DL2(i, 1))
        If Dic.Exists(tmp) Then
          n = n + 1
          KQ(n, 1) = DL2(i, 1)
          Dic.Remove (tmp)
        End If
      End If
    Next
    If n Then .Range("C1").Resize(n).Value = KQ
  End With
End Sub
Tham khảo thêm bài viết tổng quát này:
http://www.giaiphapexcel.com/forum/showthread.php?48469-Tạo-hàm-so-sánh-2-danh-sách
 
Lần chỉnh sửa cuối:
Upvote 0
Học theo thày Ndu, tôi có tự làm lại, sau đó đối chiếu với cách của thày rồi mà cũng không phát hiện ra lỗi, xin mọi người hãy chỉ dùm:

PHP:
Sub Loc()
Dim DL1(), DL2(), KQ(), DongcuoiA As Long, DongcuoiB As Long, i As Long
DongcuoiA = [A65000].End(xlUp).Row
DongcuoiB = [B65000].End(xlUp).Row
DL1 = Range("A1:A" & DongcuoiA).Value
DL2 = Range("B1:B" & DongcuoiB).Value
ReDim KQ(1 To UBound(DL1, 1), 1 To 1)
Range("C:C").ClearContents
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(DL1, 1)
If DL1(i, 1) <> "" Then
    Tmp = DL1(i, 1)
    If Not Dic.Exists(Tmp) Then
        Dic.Add Tmp, ""
    End If
End If
Next
For i = 1 To UBound(DL2, 1)
If DL2(i, 1) <> "" And Dic.Exists(DL2(i, 1)) Then
        n = n + 1
        KQ(n, 1) = DL2(i, 1)
        Dic.Remove (DL2(i, 1))
    End If
Next
[C1].Resize(n).Value = KQ
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Học theo thày Ndu, tôi có tự làm lại, sau đó đối chiếu với cách của thày rồi mà cũng không phát hiện ra lỗi, xin mọi người hãy chỉ dùm:

PHP:
Sub Loc()
Dim DL1(), DL2(), KQ(), DongcuoiA As Long, DongcuoiB As Long, i As Long
DongcuoiA = [A1].End(xlUp).Row
DongcuoiB = [B1].End(xlUp).Row
DL1 = Range("A1:A" & DongcuoiA).Value
DL2 = Range("B1:B" & DongcuoiB).Value
ReDim KQ(1 To UBound(DL1, 1), 1 To 1)
Range("C:C").ClearContents
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(DL1, 1)
If DL1(i, 1) <> "" Then
    Tmp = DL1(i, 1)
    If Not Dic.Exists(Tmp) Then
        Dic.Add Tmp, ""
    End If
End If
Next
For i = 1 To UBound(DL2, 1)
If DL2(i, 1) <> "" Then
    Tmp = DL2(i, 1)
    If Dic.Exists(Tmp) Then
        n = n + 1
        KQ(n, 1) = DL2(i, 1)
        Dic.Remove (Tmp)
    End If
End If
Next
[C1].Resize(n).Value = KQ
End Sub

Ở đây kyo không tính đến việc giải thuật cũng như kết quả là đúng hay sai, nhưng kyo chỉ muốn sửa lỗi sai của bạn ở một số chỗ là
DongcuoiA = [A65000].End(xlUp).Row
DongcuoiB = [B65000].End(xlUp).Row

Bạn ghi là [A1] thế nên giá trị của DongcuoiA của bạn vẫn mãi là số 1, và điều đó gây nên lỗi.

Với lại nguyên đoạn này của bạn
PHP:
DongcuoiA = [A1].End(xlUp).Row
DongcuoiB = [B1].End(xlUp).Row
DL1 = Range("A1:A" & DongcuoiA).Value
DL2 = Range("B1:B" & DongcuoiB).Value
Viết thế này sẽ gọn hơn
PHP:
DL1 = Range([A1], [A65000].End(xlUp)).Value
DL2 = Range([B1], [B65000].End(xlUp)).Value
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bác kyo nhé, không hiểu sao chiều rà soát kỹ rồi mà lại vẫn sai ngớ ngẩn thế.
 
Upvote 0
Học theo thày Ndu, tôi có tự làm lại, sau đó đối chiếu với cách của thày rồi mà cũng không phát hiện ra lỗi, xin mọi người hãy chỉ dùm:

PHP:
Sub Loc()
Dim DL1(), DL2(), KQ(), DongcuoiA As Long, DongcuoiB As Long, i As Long
DongcuoiA = [A65000].End(xlUp).Row
DongcuoiB = [B65000].End(xlUp).Row
DL1 = Range("A1:A" & DongcuoiA).Value
DL2 = Range("B1:B" & DongcuoiB).Value
ReDim KQ(1 To UBound(DL1, 1), 1 To 1)
Range("C:C").ClearContents
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(DL1, 1)
If DL1(i, 1) <> "" Then
    Tmp = DL1(i, 1)
    If Not Dic.Exists(Tmp) Then
        Dic.Add Tmp, ""
    End If
End If
Next
For i = 1 To UBound(DL2, 1)
If DL2(i, 1) <> "" And Dic.Exists(DL2(i, 1)) Then
        n = n + 1
        KQ(n, 1) = DL2(i, 1)
        Dic.Remove (DL2(i, 1))
    End If
Next
[C1].Resize(n).Value = KQ
End Sub
- Sau này làm việc với mảng, bạn nên bỏ luôn mấy cái vụ End(xlUp) đi ---> Nó sẽ sai khi bảng tính của bạn dùng AutoFilter ---> Khai báo dư ra cũng chẳng hề gì (đằng nào cũng đã có điều kiện If DL1(i, 1) <> "" Then rồi)
- Không phải tự nhiên mà tôi xài CStr() đâu ---> Không có cái này thì số 1 định dạng Number sẽ khác với số 1 định dạng Text đấy
----------------
Mấy cái này thuộc về kinh nghiệm, khi bạn làm nhiều sẽ tự nhận ra...
Dù sao tôi cũng rất thán phục bạn, trong thời gian ngắn đã tiến bộ rất nhiều! Cố lên nhé!
 
Upvote 0
- Sau này làm việc với mảng, bạn nên bỏ luôn mấy cái vụ End(xlUp) đi ---> Nó sẽ sai khi bảng tính của bạn dùng AutoFilter ---> Khai báo dư ra cũng chẳng hề gì (đằng nào cũng đã có điều kiện If DL1(i, 1) <> "" Then rồi)
- Không phải tự nhiên mà tôi xài CStr() đâu ---> Không có cái này thì số 1 định dạng Number sẽ khác với số 1 định dạng Text đấy
----------------
Mấy cái này thuộc về kinh nghiệm, khi bạn làm nhiều sẽ tự nhận ra...
Dù sao tôi cũng rất thán phục bạn, trong thời gian ngắn đã tiến bộ rất nhiều! Cố lên nhé!
Chẳng nhẻ dùng
DL1 = Range("A1:A65536").Value ?
Lúc đó vòng lập
For i = 1 To UBound(DL1, 1)
liệu có chạy chậm không?
Xin hỏi các anh chị ta dùng UsedRange.rows.count thì các chức năng khác có bị ảnh hưởng không
 
Lần chỉnh sửa cuối:
Upvote 0
Chẳng nhẻ dùng
DL1 = Range("A1:A65536").Value ?
Lúc đó vòng lập
For i = 1 To UBound(DL1, 1)
liệu có chạy chậm không?
Xin hỏi các anh chị ta dùng UsedRange.rows.count thì các chức năng khác có bị ảnh hưởng không
Bảo đảm không chậm cho dù có duyệt đến dòng cuối cùng ---> Thử sẽ biết liền
Nếu thích thì cứ dùng ActiveSheet.UsedRange.rows.count, hoàn toàn không có vấn đề gì
 
Upvote 0
Cảm ơn thày Ndu rất nhiều, những lời khuyên dạy của thày chắc chắn tôi sẽ ghi nhớ khi sử dụng. Bởi là giai đoạn thực hành các bài đơn giản nên bước đầu về cơ bản tôi chú ý nhiều đến bản chất, hướng giải quyết vấn đề, tạm thời bỏ qua chưa sử dụng các bẫy lỗi, các hàm chuyển đổi như CStr...để nhìn cho dễ.

Cách đây khoảng 1 tháng trước, từ chỗ không biết lập trình là gì, không ngờ tình cờ vào diễn đàn, được mọi người chỉ bảo (đặc biệt là thày Ndu96081631thày Ptm0412), giúp tôi hiểu biết thêm những điều kỳ diệu của VBA.

Thời gian tới cùng với việc nghiên cứu thuật toán, tôi sẽ cố gắng nghiên cứu về các phương thức (hầu như hiện giờ tôi chưa biết gì về nó), rất kính mong có vấn đề gì nhờ các thày chỉ bảo cho.
 
Lần chỉnh sửa cuối:
Upvote 0
Bài toán lọc những giá trị cột A không tồn tại trong cột B

Bài toán này tôi dự kiến làm như sau:
- Mảng DL1 là dữ liệu của vùng cột A
- Mảng DL2 là dữ liệu của vùng cột B
- Dùng vòng lập duyệt qua các phần tử của DL2 và Add vào Dictionary (biến Dic)
- Dùng vòng lập duyệt qua các phần tử của DL1, xét xem các phần tử này có tồn tại trong Dic hay không... Nếu không có tồn tại, nạp phần tử ấy vào mảng KQ.

Sau đó tôi viết Code thì không chạy (báo lỗi 429)

PHP:
Sub Loc()
Dim DL1(), DL2(), KQ(), i As Long, n As Long
DL1 = Range([A1], [A65000].End(xlUp)).Value
DL2 = Range([B1], [B65000].End(xlUp)).Value
ReDim KQ(1 To UBound(DL1, 1), 1 To 1)
Set Dic = CreateObject("Scripting Dictionary")
Range("C:C").ClearContents
For i = 1 To UBound(DL2, 1)
    If DL2(i, 1) <> "" Then
        Tmp = DL2(i, 1)
        If Not Dic.Exists(Tmp) Then
            Dic.Add Tmp, ""
        End If
    End If
Next i
For i = 1 To UBound(DL1, 1)
    If DL1(i, 1) <> "" And Not Dic.Exists(DL1(i, 1)) Then
        n = n + 1
        KQ(n, 1) = DL1(i, 1)
    End If
Next
[C1].Resize(n).Value = KQ
End Sub

Xin cho hỏi lời giải trên nhầm ở đâu mà không ra được đáp số
 
Upvote 0
Bài toán này tôi dự kiến làm như sau:
- Mảng DL1 là dữ liệu của vùng cột A
- Mảng DL2 là dữ liệu của vùng cột B
- Dùng vòng lập duyệt qua các phần tử của DL2 và Add vào Dictionary (biến Dic)
- Dùng vòng lập duyệt qua các phần tử của DL1, xét xem các phần tử này có tồn tại trong Dic hay không... Nếu không có tồn tại, nạp phần tử ấy vào mảng KQ.

Sau đó tôi viết Code thì không chạy (báo lỗi 429)

PHP:
Sub Loc()
Dim DL1(), DL2(), KQ(), i As Long, n As Long
DL1 = Range([A1], [A65000].End(xlUp)).Value
DL2 = Range([B1], [B65000].End(xlUp)).Value
ReDim KQ(1 To UBound(DL1, 1), 1 To 1)
Set Dic = CreateObject("Scripting Dictionary")
Range("C:C").ClearContents
For i = 1 To UBound(DL2, 1)
    If DL2(i, 1) <> "" Then
        Tmp = DL2(i, 1)
        If Not Dic.Exists(Tmp) Then
            Dic.Add Tmp, ""
        End If
    End If
Next i
For i = 1 To UBound(DL1, 1)
    If DL1(i, 1) <> "" And Not Dic.Exists(DL1(i, 1)) Then
        n = n + 1
        KQ(n, 1) = DL1(i, 1)
    End If
Next
[C1].Resize(n).Value = KQ
End Sub

Xin cho hỏi lời giải trên nhầm ở đâu mà không ra được đáp số
Bạn sửa câu này thử xem: Set Dic = CreateObject("Scripting.Dictionary")
 
Upvote 0
Chạy tốt rồi bác Viethoai ah, thế mà trong khi viết VBA không cảnh bảo (bôi đỏ) hộ cái, làm mình cứ tưởng đúng rồi.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom