tách dữ liệu theo mã số, code bị lỗi (1 người xem)

  • Thread starter Thread starter LYSM
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

LYSM

Thành viên thường trực
Tham gia
16/3/11
Bài viết
290
Được thích
26
Chào cả nhà, em có file dữ liệu muốn tách từ sheet 1 sang sheet "ket qua" theo tiêu chí dữ liệu có mã số ở cột C không trùng với cột K thì được tách (vùng từ A:I) nhưng code cứ báo lỗi, nhờ mọi người viết lại code giúp em và giải thích giúp em code tại sao bị lỗi thì càng tốt. Em mới tập VBA ạ.
Cảm ơn mọi người!
 

File đính kèm

Lần chỉnh sửa cuối:
Chào cả nhà, em có file dữ liệu muốn tách từ sheet 1 sang sheet "ket qua" theo tiêu chí dữ liệu có mã số ở cột C không trùng với cột K thì được tách (vùng từ A:I) nhưng code cứ báo lỗi, nhờ mọi người viết lại code giúp em và giải thích giúp em code tại sao bị lỗi thì càng tốt. Em mới tập VBA ạ.
Cảm ơn mọi người!

code bị lỗi chỗ nào, bạn miêu tả cụ thể hơn được không ???
 
Upvote 0
Em có file đính kèm đó ạ, em đang vào bằng phone nên ko miêu tả được ạ, bác tải file đính kèm chạy code giúp em với.

Bạn "đứng" ở sheet1 và chạy code bằng cách nhấn nút EXECUTE sẽ không bị lỗi. Vì thuộc tính Caller nó thế, bạn tham khảo help sẽ hiểu rõ hơn.
 
Upvote 0
Bạn "đứng" ở sheet1 và chạy code bằng cách nhấn nút EXECUTE sẽ không bị lỗi. Vì thuộc tính Caller nó thế, bạn tham khảo help sẽ hiểu rõ hơn.

Không phải code bác viết cho em đâu ạ, code em tự viết (em làm tương tự như vậy ở 1 file khác thì bình thường) nhưng khi chạy nó cứ báo lỗi "Subcript out of range" ạ. Vì em còn muốn làm 1 vài thứ nữa mà lại không hiểu code của bác viết. Mong bác và mọi người xem giúp. Em cảm ơn!
 
Upvote 0
Không phải code bác viết cho em đâu ạ, code em tự viết (em làm tương tự như vậy ở 1 file khác thì bình thường) nhưng khi chạy nó cứ báo lỗi "Subcript out of range" ạ. Vì em còn muốn làm 1 vài thứ nữa mà lại không hiểu code của bác viết. Mong bác và mọi người xem giúp. Em cảm ơn!

file bạn đã gửi ở #1, có thấy lỗi gì đâu.

cái file khác đang bị lỗi "Subcript out of range" chắc do bác đặt điều kiện AdvancedFilter chưa đúng ---> up file đang bị lỗi để mọi người có thể giúp bạn.
 
Upvote 0
file bạn đã gửi ở #1, có thấy lỗi gì đâu.

cái file khác đang bị lỗi "Subcript out of range" chắc do bác đặt điều kiện AdvancedFilter chưa đúng ---> up file đang bị lỗi để mọi người có thể giúp bạn.

Sorry em up nhầm file, em đã up lại rồi ạ, bác xem giúp em với
 
Upvote 0
Sorry em up nhầm file, em đã up lại rồi ạ, bác xem giúp em với
1/ Bạn giải quyết ô C1466 trước khi chạy code.
2/ Khai báo lại:
ReDim Res(1 To 1000000, 1 To 9)
Sẽ hết lỗi nhưng kết quả không biết có đúng ý bạn không, tôi thấy nó "trớt quớt" với điều kiện bạn đặt ra rồi.
3/ Sửa code bạn lại như thế này nếu đúng thì xài, nhưng phâi làm bước 1 trước.

Xem bài #11 (Code này không đúng nên gở bỏ)
 
Lần chỉnh sửa cuối:
Upvote 0
1/ Bạn giải quyết ô C1466 trước khi chạy code.
2/ Khai báo lại:
ReDim Res(1 To 1000000, 1 To 9)
Sẽ hết lỗi nhưng kết quả không biết có đúng ý bạn không, tôi thấy nó "trớt quớt" với điều kiện bạn đặt ra rồi.
3/ Sửa code bạn lại như thế này nếu đúng thì xài, nhưng phâi làm bước 1 trước.

PHP:
Sub Tach()
Dim Res, Arr, Arr1, I As Long, J As Long, K As Long
With Sheet1
Arr = .Range(.[A2], .[A65000].End(xlUp)).Resize(, 9).Value
Arr1 = .Range(.[K3], .[K65000].End(xlUp)).Value
ReDim Res(1 To UBound(Arr, 1), 1 To 9)
For I = 1 To UBound(Arr, 1)
    For J = 1 To UBound(Arr1, 1)
        If Arr(I, 3) = Arr1(J, 1) Then Exit For
    Next J
      K = K + 1
      For J = 1 To 9
        Res(K, J) = Arr(I, J)
      Next J
Next I
End With
    Sheet2.Range("A2:I65536").ClearContents
    If K Then Sheet2.Range("A2").Resize(K, 9) = Res
End Sub

4/ Muốn "tốc độ" hơn thì dùng 1 "Dic".
Thầy ơi, em chạy code của em thì nó ra cả đống nhiều hơn file gốc, còn code của thầy thì nó ra bằng đúng file gốc. Em muốn nó chỉ lọc những mã không có trong cột K thôi ạ
 
Upvote 0
Em muốn nó chỉ lọc những mã không có trong cột K thôi ạ

Bạn nói yêu cầu ngay từ đầu có phải khỏe không! Đưa code lên làm gì rồi bắt người ta đoán
Bài toán của bạn thuộc dạng: SO SÁNH 2 DANH SÁCH.
Với file của bạn thì yêu cầu là: Tìm các phần tử có trong DS1 và không có trong DS2 ---> Dạng này đã có cả đống trên diễn đàn rồi
 
Upvote 0
Thầy ơi, em chạy code của em thì nó ra cả đống nhiều hơn file gốc, còn code của thầy thì nó ra bằng đúng file gốc. Em muốn nó chỉ lọc những mã không có trong cột K thôi ạ
Thay bằng code này, đọc code bạn không hiểu bạn muốn gì nên làm "tầm bậy".
PHP:
Sub Tach()
Dim sArr(), tArr(), dArr(), I As Long, J As Long, K As Long, Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    tArr = .Range(.[K3], .[K65000].End(xlUp)).Value
    For I = 1 To UBound(tArr, 1)
        If Not Dic.Exists(tArr(I, 1)) Then Dic.Add tArr(I, 1), ""
    Next I
    sArr = .Range(.[A2], .[A65000].End(xlUp)).Resize(, 9).Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 9)
For I = 1 To UBound(sArr, 1)
    If sArr(I, 3) <> "" Then
        If Not Dic.Exists(sArr(I, 3)) Then
            K = K + 1
            For J = 1 To 9
                dArr(K, J) = sArr(I, J)
            Next J
        End If
    End If
Next I
With Sheets("Ket qua")
    .Range("A2:I65536").ClearContents
    If K Then .Range("A2").Resize(K, 9) = dArr
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Bạn nói yêu cầu ngay từ đầu có phải khỏe không! Đưa code lên làm gì rồi bắt người ta đoán
Bài toán của bạn thuộc dạng: SO SÁNH 2 DANH SÁCH.
Với file của bạn thì yêu cầu là: Tìm các phần tử có trong DS1 và không có trong DS2 ---> Dạng này đã có cả đống trên diễn đàn rồi

Em có nói từ đầu mà thầy! Do em cũng đang tập tành VBA nên tiện thể muốn hỏi mọi người luôn
 
Upvote 0
Hôm nay rảnh, làm cho bạn code theo kiểu tổng quát
1> Hàm hổ trợ:
Mã:
Function Compare2List(ByVal SourceArray, ByVal Array2Compare, ByVal ColIndex As Long, ByVal CompareType As Boolean)
  Dim lR As Long, lC As Long, n As Long
  Dim lFirstRow As Long, lEndRow As Long, lFirstCol As Long, lEndCol As Long
  Dim aSource, aDest, aComp, Item
  Dim sTmp As String, str As String
  Dim dic As Object
  
  'Nap Dictionary
  Set dic = CreateObject("Scripting.Dictionary")
  aComp = Array2Compare
  For Each Item In aComp
    str = CStr(Item)
    If Len(str) Then
      If Not dic.Exists(str) Then dic.Add str, ""
    End If
  Next
  
  aSource = SourceArray
  lFirstRow = LBound(aSource, 1)
  lEndRow = UBound(aSource, 1)
  lFirstCol = LBound(aSource, 2)
  lEndCol = UBound(aSource, 2)
  n = lFirstRow - 1
  ReDim aDest(lFirstCol To lEndCol, lFirstRow To lFirstRow)
  For lR = lFirstRow To lEndRow
    sTmp = CStr(aSource(lR, ColIndex))
    If Len(sTmp) Then
      If dic.Exists(sTmp) = CompareType Then
        n = n + 1
        ReDim Preserve aDest(lFirstCol To lEndCol, lFirstRow To n)
        For lC = lFirstCol To lEndCol
          aDest(lC, n) = aSource(lR, lC)
        Next
      End If
    End If
  Next
  If n >= lFirstRow Then Compare2List = Transpose2DArray(aDest)
End Function
Function Transpose2DArray(ByVal arr2D)
  Dim arr(), aTemp
  Dim lR As Long, lC As Long
  On Error Resume Next
  aTemp = arr2D
  ReDim arr(LBound(aTemp, 2) To UBound(aTemp, 2), LBound(aTemp, 1) To UBound(aTemp, 1))
  For lR = LBound(aTemp, 1) To UBound(aTemp, 1)
    For lC = LBound(aTemp, 2) To UBound(aTemp, 2)
      arr(lC, lR) = aTemp(lR, lC)
    Next
  Next
  Transpose2DArray = arr
End Function
2> Áp dụng:
2 đoạn code ở trên bạn không cần quan tâm (hiểu thì tốt, không hiểu cũng không sao). Bây giờ đến bước áp dụng tại Sub Main
Mã:
Sub Main()
  Dim SourceArray, Array2Compare, aDest
  [COLOR=#ff0000]SourceArray = Sheet1.Range("A2:I10000").Value
  Array2Compare = Sheet1.Range("K2:K100").Value[/COLOR]
  aDest = [COLOR=#0000cd][B]Compare2List(SourceArray, Array2Compare, 3, False)[/B][/COLOR]
  If IsArray(aDest) Then
    Sheet2.Range("A2:I65536").ClearContents
    Sheet2.Range("A2").Resize(UBound(aDest, 1), UBound(aDest, 2)).Value = aDest
    MsgBox "Thành công!"
  End If
End Sub
Chú ý Sub Main ở những chỗ tôi tô đỏ là chỗ ta khai báo 2 vùng dữ liệu để so sánh nhau
Giải thích đoạn màu xanh Compare2List(SourceArray, Array2Compare, 3, False)
SourceArray: Là vùng dữ liệu chính
Array2Compare: Là mẫu để so sánh
2 vùng này cứ khai báo dư thoải mái, chẳng cần End(xlUp), xlDown gì ráo
Số 3: là vị trí cột trong vùng dữ liệu chính (tức cột thứ 3)
Giá trị False: Nghĩa là bạn muốn lọc dữ liệu có trong vùng dữ liệu chính nhưng không có trong mẫu so sánh. Nếu giá trị này bằng True nghĩa là lọc dữ liệu có trong cả 2 vùng dữ liệu chính và mẫu so sánh
Tóm lại: Chỉ cần biết cách áp dụng tại Sub Main, biết cách khai báo đúng tham chiếu là được
 

File đính kèm

Upvote 0

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

Back
Top Bottom