Giúp gỡ lỗi-err-13-Type-mismatch (1 người xem)

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

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

mickeybh

Thành viên hoạt động
Tham gia
26/9/13
Bài viết
156
Được thích
33
Gửi Anh (Chị) và các bạn!

Mình có làm 1 ví dụ nhỏ sử dụng Dictionary nhưng khi chạy code nó cứ báo lỗi Type mismatch nhưng mình không nhìn ra cái sai trong code nên mình gửi file lên GPE mong Anh(Chị) và các bạn giúp đỡ!
 

File đính kèm

Gửi Anh (Chị) và các bạn!

Mình có làm 1 ví dụ nhỏ sử dụng Dictionary nhưng khi chạy code nó cứ báo lỗi Type mismatch nhưng mình không nhìn ra cái sai trong code nên mình gửi file lên GPE mong Anh(Chị) và các bạn giúp đỡ!
Cái này bạn thử thí nghiệm nó tý là ra ngay thôi mà:
Set r = Union(r1, r2)
For i = 1 To r.Rows.Count
r.Rows.Count= 4 nên i chạy tới 4 thì....nghỉ theo lệnh của bạn
If Not Dic.Exists(r(i, 1)) Then
Dic.Add Cells(i, 1), ""
Nếu hông có thằng r(i,1) thì gán thằng Cells(i, 1), híc, mà thằng Cells(i, 1) khi i chạy từ 1 đến 4 sẽ là cell [A1] đến cell [A4], sao ngộ "dzị" ta
Bạn cho thử vài giá trị từ A1==> A4 xem sao
Thân
 
Upvote 0
Gửi Anh (Chị) và các bạn!

Mình có làm 1 ví dụ nhỏ sử dụng Dictionary nhưng khi chạy code nó cứ báo lỗi Type mismatch nhưng mình không nhìn ra cái sai trong code nên mình gửi file lên GPE mong Anh(Chị) và các bạn giúp đỡ!

Cells(i,1) bạn sửa lại thành r(i,1) vì khi keys bị rỗng thì có thể hàm transpose gây ra lỗi, với lại ngày tháng khi nạp vào keys thì hình như nó không phân biệt được thì phải khi đó dic mà vẫn nạp vào, với lại cách của bạn hình nhưng không xét cột O không biết bạn có muốn xét tới cột đó không. Khi dùng phương thức Union thì nên dùng thuộc tính Areas của chúng để làm việc cho tiện. Bạn có thể tham khảo code này mình viết chưa chuẩn lắm

[GPECODE=vb]
Sub NgayDuyNhat()
Dim i As Long, j As Long
Dim r1 As Range, r2 As Range
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Set r1 = Sheet1.Range("A31", Sheet1.Range("A65536").End(xlUp))
Set r2 = Sheet1.Range("O31", Sheet1.Range("O65536").End(xlUp))
Set r = Union(r1, r2)


For j = 1 To r.Areas.Count
For i = 1 To r.Areas(j).Rows.Count

If Not Dic.Exists(CDate(r.Areas(j)(i, 1))) Then
Dic.Add CDate(r.Areas(j)(i, 1)), ""
End If
Next i
Next


If Dic.Count Then Sheet2.Range("B1").Resize(Dic.Count, 1).Value = Application.Transpose(Dic.Keys)




Set Dic = Nothing
End Sub


[/GPECODE]
 
Upvote 0
Gửi Anh (Chị) và các bạn!

Mình có làm 1 ví dụ nhỏ sử dụng Dictionary nhưng khi chạy code nó cứ báo lỗi Type mismatch nhưng mình không nhìn ra cái sai trong code nên mình gửi file lên GPE mong Anh(Chị) và các bạn giúp đỡ!
Nguyên nhân thì bác concogia đã nêu ra rồi. Tôi chỉ đưa ra một hướng xử lý hơi khác một chút xíu để bạn tham khảo:
[GPECODE=vb]Sub NgayDuyNhat()
Dim r1 As Range, r2 As Range, Cll As Range
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Set r1 = Sheet1.Range("A31:A" & Sheet1.Range("A65536").End(xlUp).Row)
Set r2 = Sheet1.Range("O31:O" & Sheet1.Range("O65536").End(xlUp).Row)
For Each Cll In Union(r1, r2)
If Not Dic.Exists(CLng(Cll.Value)) Then Dic.Add CLng(Cll.Value), ""
Next
If Dic.Count Then Sheet2.[B1].Resize(Dic.Count) = Application.Transpose(Dic.Keys)
Set Dic = Nothing
End Sub[/GPECODE]
Ở code này, việc sử dụng hàm CLng là cần thiết để tránh trường hợp ngày tháng đảo lộn giữa nguồn và đích. Bạn cứ thử bỏ hàm này trong câu lệnh If trong vòng For sẽ thấy ngay điều này.
 
Upvote 0
Nguyên nhân thì bác concogia đã nêu ra rồi. Tôi chỉ đưa ra một hướng xử lý hơi khác một chút xíu để bạn tham khảo:
[GPECODE=vb]Sub NgayDuyNhat()
Dim r1 As Range, r2 As Range, Cll As Range
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Set r1 = Sheet1.Range("A31:A" & Sheet1.Range("A65536").End(xlUp).Row)
Set r2 = Sheet1.Range("O31:O" & Sheet1.Range("O65536").End(xlUp).Row)
For Each Cll In Union(r1, r2)
If Not Dic.Exists(CLng(Cll.Value)) Then Dic.Add CLng(Cll.Value), ""
Next
If Dic.Count Then Sheet2.[B1].Resize(Dic.Count) = Application.Transpose(Dic.Keys)
Set Dic = Nothing
End Sub[/GPECODE]
Ở code này, việc sử dụng hàm CLng là cần thiết để tránh trường hợp ngày tháng đảo lộn giữa nguồn và đích. Bạn cứ thử bỏ hàm này trong câu lệnh If trong vòng For sẽ thấy ngay điều này.
Xin cảm ơn Anh(Chị) và các bạn rất nhiều, một ví dụ nho nhỏ không ngờ lại phức tạp thế.
Mình có chạy thử code của 2 bạn nghiaphuc nmhung49 đều cho ra kết quả nhưng khi cột O không có dữ liệu thì nó lại gây ra lỗi ở dòng If Not Dic...
Mong nhận được sự giúp đỡ của các bạn!
 
Upvote 0
Xin cảm ơn Anh(Chị) và các bạn rất nhiều, một ví dụ nho nhỏ không ngờ lại phức tạp thế.
Mình có chạy thử code của 2 bạn nghiaphuc nmhung49 đều cho ra kết quả nhưng khi cột O không có dữ liệu thì nó lại gây ra lỗi ở dòng If Not Dic...
Mong nhận được sự giúp đỡ của các bạn!
Thêm một If để bẫy lỗi dữ liệu không phải Date thử xem:
PHP:
Sub NgayDuyNhat()
Dim Dic As Object, i As Long, r1 As Range, r2 As Range, Cll As Range, Tem As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet1
    Set r1 = .Range(.[A31], .[A65536].End(xlUp))
    Set r2 = .Range(.[O31], .[O65536].End(xlUp))
End With
For Each Cll In Union(r1, r2)
    If IsDate(Cll) Then
        Tem = Cll * 1
        If Not Dic.Exists(Tem) Then
            Dic.Add Tem, ""
        End If
    End If
Next Cll
If Dic.Count Then Sheet2.Range("B1").Resize(Dic.Count, 1) = Application.Transpose(Dic.Keys)
Set r1 = Nothing: Set r2 = Nothing: Set Dic = Nothing
End Sub
 
Upvote 0

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

Back
Top Bottom