nhờ các anh chị chỉnh giúp code sử dụng Dic (1 người xem)

Liên hệ QC

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

quoc nhat

Thành viên tiêu biểu
Tham gia
8/3/12
Bài viết
567
Được thích
43
Nghề nghiệp
cán bộ ngành y tế
Chào các anh chị em có tìm trược trên Forum mình đoạn code so sánh dữ liệu giữa 2 file như sau:
Mã:
Public Sub GPE()
On Error Resume Next
Dim fName As String, Wb As Workbook, Sh As Worksheet
fName = ThisWorkbook.Path & "\" & "TONG HOP KK thuoc 06.07.xls"
Application.ScreenUpdating = False
Application.DisplayAlerts = False
    Set Wb = Application.Workbooks.Open(fName)
    Set Sh = Wb.Worksheets("th ke khai")
Dim Dic As Object, I As Long, j As Long, k As Long, Tem As String, Tem1 As String, Tem2 As String, Sarr(), Darr(), tarr()
Set Dic = CreateObject("Scripting.Dictionary")
With Sh
    Sarr = .Range(.[a2], .[a65000].End(xlUp)).Resize(, 14).Value
End With
    For I = 1 To UBound(Sarr, 1)
        Tem = UCase(Sarr(I, 12)) [COLOR=#ff0000][B]'So dang ky[/B][/COLOR]
        Tem1 = Sarr(I, 8) [B][COLOR=#00ff00]' don gia[/COLOR][/B]
        If Not Dic.Exists(Tem) Then
            Dic.Add (Tem), ""
            Dic.Add (Tem1), ""
        End If
    Next I
With Sheet1
        tarr = .Range(.[a2], .[a65000].End(xlUp)).Resize(, 14).Value
        ReDim Darr(1 To UBound(tarr, 1), 1 To 1)
    For I = 1 To UBound(tarr, 1)
        k = k + 1
        Tem = UCase(tarr(I, 14)) [B][COLOR=#ff0000]' so dang ký[/COLOR][/B]
        Tem1 = tarr(I, 8) [B][COLOR=#00ff00]' don giá[/COLOR][/B]
         If Dic.Exists(Tem) And Not Dic.Exists(Tem1) Then
            Darr(k, 1) = "x"
        End If
    Next I
     Wb.Close (False)
    If k Then
    Sheet1.[o2].Resize(k - 1).Value = Darr
    End If
End With
    Set Dic = Nothing
End Sub
em chế biến mãi mà không ra thành phẩm gì cả
nhờ các anh chị giúp em

nếu số đăng ký của sheet sh trùng với số đăng ký của sheet1 nhưng đơn giá của sheet sh khác với đơn giá của sheet1 thì lấy giá trị đó

xin lỗi các anh chị vì file quá nặng nên không đính kèm được
 
Chào các anh chị em có tìm trược trên Forum mình đoạn code so sánh dữ liệu giữa 2 file như sau:
Mã:
Public Sub GPE()
On Error Resume Next
Dim fName As String, Wb As Workbook, Sh As Worksheet
fName = ThisWorkbook.Path & "\" & "TONG HOP KK thuoc 06.07.xls"
Application.ScreenUpdating = False
Application.DisplayAlerts = False
    Set Wb = Application.Workbooks.Open(fName)
    Set Sh = Wb.Worksheets("th ke khai")
Dim Dic As Object, I As Long, j As Long, k As Long, Tem As String, Tem1 As String, Tem2 As String, Sarr(), Darr(), tarr()
Set Dic = CreateObject("Scripting.Dictionary")
With Sh
    Sarr = .Range(.[a2], .[a65000].End(xlUp)).Resize(, 14).Value
End With
    For I = 1 To UBound(Sarr, 1)
        Tem = UCase(Sarr(I, 12)) [COLOR=#ff0000][B]'So dang ky[/B][/COLOR]
        Tem1 = Sarr(I, 8) [B][COLOR=#00ff00]' don gia[/COLOR][/B]
        If Not Dic.Exists(Tem) Then
            Dic.Add (Tem), ""
            Dic.Add (Tem1), ""
        End If
    Next I
With Sheet1
        tarr = .Range(.[a2], .[a65000].End(xlUp)).Resize(, 14).Value
        ReDim Darr(1 To UBound(tarr, 1), 1 To 1)
    For I = 1 To UBound(tarr, 1)
        k = k + 1
        Tem = UCase(tarr(I, 14)) [B][COLOR=#ff0000]' so dang ký[/COLOR][/B]
        Tem1 = tarr(I, 8) [B][COLOR=#00ff00]' don giá[/COLOR][/B]
         If Dic.Exists(Tem) And Not Dic.Exists(Tem1) Then
            Darr(k, 1) = "x"
        End If
    Next I
     Wb.Close (False)
    If k Then
    Sheet1.[o2].Resize(k - 1).Value = Darr
    End If
End With
    Set Dic = Nothing
End Sub
em chế biến mãi mà không ra thành phẩm gì cả
nhờ các anh chị giúp em

nếu số đăng ký của sheet sh trùng với số đăng ký của sheet1 nhưng đơn giá của sheet sh khác với đơn giá của sheet1 thì lấy giá trị đó

xin lỗi các anh chị vì file quá nặng nên không đính kèm được

-- bạn phải tạo một key : key này phải chứa giá trị của số đăng ký và đơn giá

ví dụ
Mã:
Tem = UCase(Sarr(I, 12)) [COLOR=#ff0000][B]'So dang ky[/B][/COLOR]
        Tem1 = Sarr(I, 8) [B][COLOR=#00ff00]' don gia[/COLOR][/B]
        If Not Dic.Exists[B][I](Tem & chr(0) & Tem1) [/I][/B]Then
............................

bạn lưu ý :

- Xác định vùng dữ liệu : cần để ý đến trường hợp người dùng sử dụng filter,...
- Sử dụng dic : xét trường hợp key chứa các chuỗi rống, hay khoảng trắng ,..........
 
Upvote 0
-- bạn phải tạo một key : key này phải chứa giá trị của số đăng ký và đơn giá

ví dụ
Mã:
Tem = UCase(Sarr(I, 12)) [COLOR=#ff0000][B]'So dang ky[/B][/COLOR]
        Tem1 = Sarr(I, 8) [B][COLOR=#00ff00]' don gia[/COLOR][/B]
        If Not Dic.Exists[B][I](Tem & chr(0) & Tem1) [/I][/B]Then
............................

bạn lưu ý :

- Xác định vùng dữ liệu : cần để ý đến trường hợp người dùng sử dụng filter,...
- Sử dụng dic : xét trường hợp key chứa các chuỗi rống, hay khoảng trắng ,..........
Mình chỉ copy lại thôi chứ mình đâu biết sử dụng dic đâu
Bạn giúp mình cái so sánh đó được không?
Cảm ơn bạn!
 
Upvote 0
code ở bài #1 là code của bạn đã chế biến, hay là code nguyên bản ?
Mình đã chế biến rồi nguyên bản của nó không có so sánh đơn giá (tem1)
giờ mình chế thêm (tem1) vào nhưng khi lấy giá trị nó không so sánh được mà lấy thêm cái trùng số đăng ký mà trùng cả đơn giá luôn.
bạn xem có giúp được không?
Mình cảm ơn nhiều!
 
Upvote 0
Mình đã chế biến rồi nguyên bản của nó không có so sánh đơn giá (tem1)
giờ mình chế thêm (tem1) vào nhưng khi lấy giá trị nó không so sánh được mà lấy thêm cái trùng số đăng ký mà trùng cả đơn giá luôn.
bạn xem có giúp được không?
Mình cảm ơn nhiều!

gửi file đính kèm, xóa những dữ liệu ko cần thiết,
 
Upvote 0
gửi file đính kèm, xóa những dữ liệu ko cần thiết,
file của mình đây
bạn vào địa chỉ sau tải về xem cho mình với nghe:
http://www.mediafire.com/download/hk1w2fbgoea5918/BHXH.rar
mình muốn so sánh dữ liêu trong file 20 THANG 6 NAM 2016 Y với File TONG HOP KK thuoc 06.07
- nếu trùng số đắng ký nhưng khác đơn giá giữa 2 file ) các cột mình đánh dấu chữ màu đỏ) thì đánh dấu vào cột ghi chú trong 20 THANG 6 NAM 2016 Y
như trong file mình có làm ấy nhưng không phân biệt được đơn giá # nhau trong cùng một SĐK
bạn xem giúp
quên mất mình có đặt pass cho file 20 THANG 6 NAM 2016 Y
pass: 0947555494
 
Lần chỉnh sửa cuối:
Upvote 0
file của mình đây
bạn vào địa chỉ sau tải về xem cho mình với nghe:
http://www.mediafire.com/download/hk1w2fbgoea5918/BHXH.rar
mình muốn so sánh dữ liêu trong file 20 THANG 6 NAM 2016 Y với File TONG HOP KK thuoc 06.07
- nếu trùng số đắng ký nhưng khác đơn giá giữa 2 file ) các cột mình đánh dấu chữ màu đỏ) thì đánh dấu vào cột ghi chú trong 20 THANG 6 NAM 2016 Y
như trong file mình có làm ấy nhưng không phân biệt được đơn giá # nhau trong cùng một SĐK
bạn xem giúp
quên mất mình có đặt pass cho file 20 THANG 6 NAM 2016 Y
pass: 0947555494

Chạy thử Sub này coi sao.
PHP:
Public Sub GPE_2()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Dic As Object, sArr(), dArr(), tArr()
Dim MyWb As String, Tem As String, Rws As Long, I As Long, K As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    MyWb = ThisWorkbook.Name
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "TONG HOP KK thuoc 06.07.xls"'
With Sheets("th ke khai")
    sArr = .Range(.[A2], .[A65000].End(xlUp)).Resize(, 14).Value
    ReDim tArr(1 To UBound(sArr), 1 To 1)
End With
    For I = 1 To UBound(sArr, 1)
        Tem = UCase(sArr(I, 12))
        If Tem <> Empty And Not Dic.Exists(Tem) Then
            K = K + 1
            Dic.Add (Tem), K
            tArr(K, 1) = sArr(I, 8)
        Else
            Rws = Dic.Item(Tem)
            If InStr(tArr(Rws, 1), sArr(I, 8)) = 0 Then tArr(Rws, 1) = tArr(Rws, 1) & " - " & sArr(I, 8)
        End If
    Next I
Windows(MyWb).Activate
With Sheet1
   sArr = .Range("H2", .Range("N65536").End(xlUp)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 1)
   For I = 1 To UBound(sArr)
        Tem = sArr(I, 7)
        If Dic.Exists(Tem) Then
            Rws = Dic.Item(Tem)
            dArr(I, 1) = sArr(I, 1) & " - " & tArr(Rws, 1)
        End If
    Next I
    .Range("O2").Resize(I - 1) = dArr
End With
    Set Dic = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Chạy thử Sub này coi sao.
PHP:
Public Sub GPE_2()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Dic As Object, sArr(), dArr(), tArr()
Dim MyWb As String, Tem As String, Rws As Long, I As Long, K As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    MyWb = ThisWorkbook.Name
Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "TONG HOP KK thuoc 06.07.xls"'
With Sheets("th ke khai")
    sArr = .Range(.[A2], .[A65000].End(xlUp)).Resize(, 14).Value
    ReDim tArr(1 To UBound(sArr), 1 To 1)
End With
    For I = 1 To UBound(sArr, 1)
        Tem = UCase(sArr(I, 12))
        If Tem <> Empty And Not Dic.Exists(Tem) Then
            K = K + 1
            Dic.Add (Tem), K
            tArr(K, 1) = sArr(I, 8)
        Else
            Rws = Dic.Item(Tem)
            If InStr(tArr(Rws, 1), sArr(I, 8)) = 0 Then tArr(Rws, 1) = tArr(Rws, 1) & " - " & sArr(I, 8)
        End If
    Next I
Windows(MyWb).Activate
With Sheet1
   sArr = .Range("H2", .Range("N65536").End(xlUp)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 1)
   For I = 1 To UBound(sArr)
        Tem = sArr(I, 7)
        If Dic.Exists(Tem) Then
            Rws = Dic.Item(Tem)
            dArr(I, 1) = sArr(I, 1) & " - " & tArr(Rws, 1)
        End If
    Next I
    .Range("O2").Resize(I - 1) = dArr
End With
    Set Dic = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
anh BaTê ơi có cách nào so sánh mà không cần mở File TONG HOP... đó lên không vì dữ liệu thật lên đến 35351 dòng nặng quá phải đợi mất 10 phút mới chạy xong
 
Upvote 0
anh BaTê ơi có cách nào so sánh mà không cần mở File TONG HOP... đó lên không vì dữ liệu thật lên đến 35351 dòng nặng quá phải đợi mất 10 phút mới chạy xong

Có lẽ các chuyên gia ADO làm được.
Tôi thì không biết ADO. Chỉ biết VBA thôi.
Mở sẵn file Tong Hop... mà cũng mất 10 phút sao?
Chuyển sang xài Excel 2010, .xlsx hoặc .xlsm dung lượng nhẹ hơn rất nhiều so với .xls của 2003.
 
Upvote 0
Có lẽ các chuyên gia ADO làm được.
Tôi thì không biết ADO. Chỉ biết VBA thôi.
Mở sẵn file Tong Hop... mà cũng mất 10 phút sao?
Chuyển sang xài Excel 2010, .xlsx hoặc .xlsm dung lượng nhẹ hơn rất nhiều so với .xls của 2003.

Cảm ơn anh. Em sẻ cân nhắc về điều này.
 
Upvote 0
anh BaTê ơi có cách nào so sánh mà không cần mở File TONG HOP... đó lên không vì dữ liệu thật lên đến 35351 dòng nặng quá phải đợi mất 10 phút mới chạy xong
[INFO1]Xin phép mượn đoạn code của anh Batê để chế biến :[/INFO1]

Mã:
Public Sub GPE_2()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Dic As Object, sArr(), dArr(), tArr()
Dim MyWb As String, [COLOR=#ff0000]Tem[/COLOR], Rws As Long, I As Long, K As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    'MyWb = ThisWorkbook.Name
'---------------------------------------------------------------------------------
[I]'Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "TONG HOP KK thuoc 06.07.xls" '[/I]
[I]'With Sheets("th ke khai")[/I]
[I]    'sArr = .Range(.[A2], .[A65000].End(xlUp)).Resize(, 14).Value[/I]
[I]    'ReDim tArr(1 To UBound(sArr), 1 To 1)[/I]
[I]'End With[/I]
[I]'--------------[/I]--------------------------------------------------------------------------
Dim Cnn As Object, rst As Object, SQL$
Set Cnn = CreateObject("ADODB.connection")
Set rst = CreateObject("ADODB.recordset")
With Cnn
    If Val(Application.Version) < 12 Then
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.Path & "\TONG HOP KK thuoc 06.07.xls" & _
                        ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
    Else
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                        "Data Source='" & ThisWorkbook.Path & "\TONG HOP KK thuoc 06.07.xls" & _
                        "';Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
    End If
    .Open
End With
SQL = "SELECT * FROM [th ke khai$A2:N65536] "
rst.Open SQL, Cnn, 3, 3, 1
sArr = TransArr(rst.getrows)
ReDim tArr(1 To UBound(sArr) + 1, 1 To 1)
Cnn.Close: Set rst = Nothing: Set Cnn = Nothing
'----------------------------------------------------------------------------------------
    For I = 0 To UBound(sArr, 1)
        Tem = sArr(I, 11)
        If Len(Tem) Then
            Tem = UCase(Tem)
            If Not Dic.Exists(Tem) Then
                K = K + 1
                Dic.Add (Tem), K
                tArr(K, 1) = sArr(I, 7)
            Else
                Rws = Dic.Item(Tem)
                If InStr(tArr(Rws, 1), sArr(I, 7)) = 0 Then tArr(Rws, 1) = tArr(Rws, 1) & " - " & sArr(I, 7)
            End If
        End If
    Next I
'Windows(MyWb).Activate
With Sheet1
   sArr = .Range("H2", .Range("N65536").End(xlUp)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 1)
   For I = 1 To UBound(sArr)
        Tem = sArr(I, 7)
        If Dic.Exists(Tem) Then
           
            Rws = Dic.Item(Tem)
            dArr(I, 1) = sArr(I, 1) & " - " & tArr(Rws, 1)
        End If
    Next I
    .Range("O2").Resize(I - 1) = dArr
End With
Set Dic = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Function TransArr(sArr As Variant) As Variant
    Dim cllX As Long, cllY As Long, tmpX As Long, tmpY As Long, tmpArr As Variant
    tmpX = UBound(sArr, 2):    tmpY = UBound(sArr, 1)
    ReDim tmpArr(tmpX, tmpY)
    For cllX = 0 To tmpX
        For cllY = 0 To tmpY
            tmpArr(cllX, cllY) = sArr(cllY, cllX)
        Next cllY
    Next cllX
    TransArr = tmpArr


End Function
 
Upvote 0
10-30 phút có gì đâu mà sợ?
Một ngày chạy code mấy lần? Nếu dữ liệu mấy chục ngàn dòng mà một ngày phải tổng hợp vài lần thì là do quy trình sai. Cần thiết kế lại cách làm việc.
 
Upvote 0
[INFO1]Xin phép mượn đoạn code của anh Batê để chế biến :[/INFO1]

Mã:
Public Sub GPE_2()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Dim Dic As Object, sArr(), dArr(), tArr()
Dim MyWb As String, [COLOR=#ff0000]Tem[/COLOR], Rws As Long, I As Long, K As Long
    Set Dic = CreateObject("Scripting.Dictionary")
    'MyWb = ThisWorkbook.Name
'---------------------------------------------------------------------------------
[I]'Workbooks.Open Filename:=ThisWorkbook.Path & "\" & "TONG HOP KK thuoc 06.07.xls" '[/I]
[I]'With Sheets("th ke khai")[/I]
[I]    'sArr = .Range(.[A2], .[A65000].End(xlUp)).Resize(, 14).Value[/I]
[I]    'ReDim tArr(1 To UBound(sArr), 1 To 1)[/I]
[I]'End With[/I]
[I]'--------------[/I]--------------------------------------------------------------------------
Dim Cnn As Object, rst As Object, SQL$
Set Cnn = CreateObject("ADODB.connection")
Set rst = CreateObject("ADODB.recordset")
With Cnn
    If Val(Application.Version) < 12 Then
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=" & ThisWorkbook.Path & "\TONG HOP KK thuoc 06.07.xls" & _
                        ";Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";"
    Else
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                        "Data Source='" & ThisWorkbook.Path & "\TONG HOP KK thuoc 06.07.xls" & _
                        "';Extended Properties=""Excel 12.0;HDR=No;IMEX=1"";"
    End If
    .Open
End With
SQL = "SELECT * FROM [th ke khai$A2:N65536] "
rst.Open SQL, Cnn, 3, 3, 1
sArr = TransArr(rst.getrows)
ReDim tArr(1 To UBound(sArr) + 1, 1 To 1)
Cnn.Close: Set rst = Nothing: Set Cnn = Nothing
'----------------------------------------------------------------------------------------
    For I = 0 To UBound(sArr, 1)
        Tem = sArr(I, 11)
        If Len(Tem) Then
            Tem = UCase(Tem)
            If Not Dic.Exists(Tem) Then
                K = K + 1
                Dic.Add (Tem), K
                tArr(K, 1) = sArr(I, 7)
            Else
                Rws = Dic.Item(Tem)
                If InStr(tArr(Rws, 1), sArr(I, 7)) = 0 Then tArr(Rws, 1) = tArr(Rws, 1) & " - " & sArr(I, 7)
            End If
        End If
    Next I
'Windows(MyWb).Activate
With Sheet1
   sArr = .Range("H2", .Range("N65536").End(xlUp)).Value
   ReDim dArr(1 To UBound(sArr), 1 To 1)
   For I = 1 To UBound(sArr)
        Tem = sArr(I, 7)
        If Dic.Exists(Tem) Then
           
            Rws = Dic.Item(Tem)
            dArr(I, 1) = sArr(I, 1) & " - " & tArr(Rws, 1)
        End If
    Next I
    .Range("O2").Resize(I - 1) = dArr
End With
Set Dic = Nothing
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Function TransArr(sArr As Variant) As Variant
    Dim cllX As Long, cllY As Long, tmpX As Long, tmpY As Long, tmpArr As Variant
    tmpX = UBound(sArr, 2):    tmpY = UBound(sArr, 1)
    ReDim tmpArr(tmpX, tmpY)
    For cllX = 0 To tmpX
        For cllY = 0 To tmpY
            tmpArr(cllX, cllY) = sArr(cllY, cllX)
        Next cllY
    Next cllX
    TransArr = tmpArr


End Function
Cảm ơn anh nghe. Em sẽ cho chạy đoạn code này xem thế nào có gì thắc mắc anh vui lòng giúp tiếp nhé
 
Upvote 0
Web KT

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

Back
Top Bottom