Lấy dữ liệu mới không trùng với dữ liệu đã có và đổ vào sheet khác (1 người xem)

  • Thread starter Thread starter thufpts
  • Ngày gửi Ngày gửi

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

thufpts

Thành viên hoạt động
Tham gia
6/8/12
Bài viết
157
Được thích
6
Giới tính
Nam
Nghề nghiệp
Bốc vác
Dear các Bác.
em có vấn đề này mong các bác cứu giúp.
em có một file excel bao gồm 3 Sheet CONTROLLER, DATA, NEW
bây giờ em muốn lấy ra dữ liệu của của DATA không được trùng với CONTROLLER với điều kiện cột K chỉ lấy 01, và 02 và đổ vào sheet NEW.
tại sheet NEW em đã đặt sẵn các cột cần lấy của sheet DATA( từ A đến R)

Dữ liệu của sheet DATA và CONTROLLER có Cột A làm khóa chính để các bác tiện so sánh.
em không rành về vba lắm rất mong các bác giúp đỡ
 

File đính kèm

Bạn kiểm tra kết quả xen sao?

PHP:
Option Explicit
Sub ChépDL()
Dim Dict As Object, J As Long, W As Long, Z As Long, Col As Byte
Dim Arr() As Variant, sArr As Variant

With Sheets("Controller")
    Set Dict = CreateObject("Scripting.Dictionary")
    sArr = .Range(.[A2], .[A65500].End(xlUp)).Value
    For J = 1 To UBound(sArr, 1)
        If Not IsEmpty(sArr(J, 1)) And Not Dict.exists(sArr(J, 1)) Then
            W = W + 1
            Dict.Add sArr(J, 1), W
        Else
        End If
    Next J
End With
Z = W
With Sheets("Data")
    sArr = .Range(.[A2], .[A65500].End(xlUp)).Resize(, 24).Value
    ReDim Arr(1 To UBound(sArr, 1), 1 To 18)
    For J = 1 To UBound(sArr, 1)
        If Not IsEmpty(sArr(J, 1)) And Not Dict.exists(sArr(J, 1)) Then
            If sArr(J, 11) = "01" Or sArr(J, 11) = "02" Then
                Z = Z + 1
                Dict.Add sArr(J, 1), Z
                For Col = 1 To 18
                    Arr(Z - W, Col) = sArr(J, Col)
                Next Col
            End If
        End If
    Next J
End With
With Sheets("New")
    .[B2].CurrentRegion.Offset(1).ClearContents
    .Cells(2, "A").Resize(Z, 18).Value = Arr()
End With
End Sub
 
Upvote 0
Dear các Bác.
em có vấn đề này mong các bác cứu giúp.
em có một file excel bao gồm 3 Sheet CONTROLLER, DATA, NEW
bây giờ em muốn lấy ra dữ liệu của của DATA không được trùng với CONTROLLER với điều kiện cột K chỉ lấy 01, và 02 và đổ vào sheet NEW.
tại sheet NEW em đã đặt sẵn các cột cần lấy của sheet DATA( từ A đến R)
Dữ liệu của sheet DATA và CONTROLLER có Cột A làm khóa chính để các bác tiện so sánh.
em không rành về vba lắm rất mong các bác giúp đỡ
thử với code nầy xem sao
Mã:
Sub GPE()
Dim Darr(), Sarr(), Dic As Object, i As Long, Rng As Range
Set Dic = CreateObject("Scripting.Dictionary")
Darr = Sheets("DATA").Range("A1:R" & Sheets("DATA").Range("A65500").End(xlUp).Row).Value
Sarr = Sheets("CONTROLLER").Range("A2:A" & Sheets("CONTROLLER").Range("A65500").End(xlUp).Row).Value
For i = 1 To UBound(Sarr)
  If Not Dic.exists(Sarr(i, 1)) Then Dic.Add (Sarr(i, 1)), ""
Next i
With Sheets("DATA")
  Set Rng = .Range("A1:R1")
  For i = 2 To UBound(Darr)
    If Not Dic.exists(Darr(i, 1)) And (Darr(i, 11) = "01" Or Darr(i, 11) = "02") Then
      Set Rng = Application.Union(Rng, .Range("A" & i & ":R" & i))
    End If
  Next i
End With
Rng.Copy Sheets("NEW").Range("A1")
Set Rng = Nothing
End Sub
 
Upvote 0
thử với code nầy xem sao
Mã:
Sub GPE()
Dim Darr(), Sarr(), Dic As Object, i As Long, Rng As Range
Set Dic = CreateObject("Scripting.Dictionary")
Darr = Sheets("DATA").Range("A1:R" & Sheets("DATA").Range("A65500").End(xlUp).Row).Value
Sarr = Sheets("CONTROLLER").Range("A2:A" & Sheets("CONTROLLER").Range("A65500").End(xlUp).Row).Value
For i = 1 To UBound(Sarr)
  If Not Dic.exists(Sarr(i, 1)) Then Dic.Add (Sarr(i, 1)), ""
Next i
With Sheets("DATA")
  Set Rng = .Range("A1:R1")
  For i = 2 To UBound(Darr)
    If Not Dic.exists(Darr(i, 1)) And (Darr(i, 11) = "01" Or Darr(i, 11) = "02") Then
      Set Rng = Application.Union(Rng, .Range("A" & i & ":R" & i))
    End If
  Next i
End With
Rng.Copy Sheets("NEW").Range("A1")
Set Rng = Nothing
End Sub
Cám ơn bác. bác có thể giúp em vừa đổ vào sheet new và vừa đổ dữ liệu kế tiếp vào sheet CONTROLLER mà không làm mất dữ liệu cũ được không bác.
mục đích của em là muốn biết được có bao nhiêu item được tao mới trong sheet new và số item vừa tạo ra đó sẽ điền luôn kế tiếp vào sheet controller để em không phải copy nhiều
rất dễ nhầm. mong bác giúp em
 
Upvote 0
PHP:
Option Explicit
Sub ChépDL()
Dim Dict As Object, J As Long, W As Long, Z As Long, Col As Byte
Dim Arr() As Variant, sArr As Variant

With Sheets("Controller")
    Set Dict = CreateObject("Scripting.Dictionary")
    sArr = .Range(.[A2], .[A65500].End(xlUp)).Value
    For J = 1 To UBound(sArr, 1)
        If Not IsEmpty(sArr(J, 1)) And Not Dict.exists(sArr(J, 1)) Then
            W = W + 1
            Dict.Add sArr(J, 1), W
        Else
        End If
    Next J
End With
Z = W
With Sheets("Data")
    sArr = .Range(.[A2], .[A65500].End(xlUp)).Resize(, 24).Value
    ReDim Arr(1 To UBound(sArr, 1), 1 To 18)
    For J = 1 To UBound(sArr, 1)
        If Not IsEmpty(sArr(J, 1)) And Not Dict.exists(sArr(J, 1)) Then
            If sArr(J, 11) = "01" Or sArr(J, 11) = "02" Then
                Z = Z + 1
                Dict.Add sArr(J, 1), Z
                For Col = 1 To 18
                    Arr(Z - W, Col) = sArr(J, Col)
                Next Col
            End If
        End If
    Next J
End With
With Sheets("New")
    .[B2].CurrentRegion.Offset(1).ClearContents
    .Cells(2, "A").Resize(Z, 18).Value = Arr()
End With
End Sub
em cám ơn bác nhiều lắm. em chưa test hết nhưng nó chạy được rồi. đa tạ bác
 
Upvote 0
Cám ơn bác. bác có thể giúp em vừa đổ vào sheet new và vừa đổ dữ liệu kế tiếp vào sheet CONTROLLER mà không làm mất dữ liệu cũ được không bác.
mục đích của em là muốn biết được có bao nhiêu item được tao mới trong sheet new và số item vừa tạo ra đó sẽ điền luôn kế tiếp vào sheet controller để em không phải copy nhiều
rất dễ nhầm. mong bác giúp em
bạn chạy code
Mã:
Sub GPE()
Dim Darr(), sArr(), Dic As Object, i As Long, LastR As Long, Rng As Range
Set Dic = CreateObject("Scripting.Dictionary")
Darr = Sheets("DATA").Range("A1:R" & Sheets("DATA").Range("A65500").End(xlUp).Row).Value
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
sArr = Sheets("CONTROLLER").Range("A2:A" & LastR).Value
For i = 1 To UBound(sArr)
  If Not Dic.exists(sArr(i, 1)) Then Dic.Add (sArr(i, 1)), ""
Next i
With Sheets("DATA")
  For i = 2 To UBound(Darr)
    If Not Dic.exists(Darr(i, 1)) And (Darr(i, 11) = "01" Or Darr(i, 11) = "02") Then
      If Rng Is Nothing Then
        Set Rng = .Range("A" & i & ":R" & i)
      Else
        Set Rng = Application.Union(Rng, .Range("A" & i & ":R" & i))
      End If
    End If
  Next i
End With
Sheets("NEW").Range("A2:R20000").ClearContents
Rng.Copy Sheets("NEW").Range("A2")
Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Set Rng = Nothing:  Set Dic = Nothing
End Sub
 
Upvote 0
bạn chạy code
Mã:
Sub GPE()
Dim Darr(), sArr(), Dic As Object, i As Long, LastR As Long, Rng As Range
Set Dic = CreateObject("Scripting.Dictionary")
Darr = Sheets("DATA").Range("A1:R" & Sheets("DATA").Range("A65500").End(xlUp).Row).Value
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
sArr = Sheets("CONTROLLER").Range("A2:A" & LastR).Value
For i = 1 To UBound(sArr)
  If Not Dic.exists(sArr(i, 1)) Then Dic.Add (sArr(i, 1)), ""
Next i
With Sheets("DATA")
  For i = 2 To UBound(Darr)
    If Not Dic.exists(Darr(i, 1)) And (Darr(i, 11) = "01" Or Darr(i, 11) = "02") Then
      If Rng Is Nothing Then
        Set Rng = .Range("A" & i & ":R" & i)
      Else
        Set Rng = Application.Union(Rng, .Range("A" & i & ":R" & i))
      End If
    End If
  Next i
End With
Sheets("NEW").Range("A2:R20000").ClearContents
Rng.Copy Sheets("NEW").Range("A2")
Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Set Rng = Nothing:  Set Dic = Nothing
End Sub
Em chạy code nó chỉ add được vào sheet controller chứ không add được vào sheet new. với lại em chạy lần 1 không báo lỗi chạy lần 2 nó báo lỗi
Rng.Copy Sheets("NEW").Range("A2")
 
Upvote 0
Mình có xem file của bạn. Nhưng có 1 chỗ mình ko hiểu cho mình hỏi thêm chút
Dữ liệu trùng giữa 2 sheet Controller và Data được bạn hiểu như thế nào
Có phải là tất cả dũ liệu của 15 cột của 1 dòng dữ liệu (sheet Controller) mà đều bằng dữ liệu của 15/24 cột của 1 dòng dữ liệu tương ứng (sheet Data) thì hiều là trùng phải không bạn
Nếu mà so sánh kiểu đấy thì chẳng có dòng dữ liệu nào trùng cả vì mình thấy Cột Reload của Sheet Controller có số 1 còn Cột Reload của sheet Data ko có dữ liệu
Bạn có thể trình bày thêm về định nghĩa trùng dữ liệu giữa các sheet được ko bạn
 
Upvote 0
Mình có xem file của bạn. Nhưng có 1 chỗ mình ko hiểu cho mình hỏi thêm chút
Dữ liệu trùng giữa 2 sheet Controller và Data được bạn hiểu như thế nào
Có phải là tất cả dũ liệu của 15 cột của 1 dòng dữ liệu (sheet Controller) mà đều bằng dữ liệu của 15/24 cột của 1 dòng dữ liệu tương ứng (sheet Data) thì hiều là trùng phải không bạn
Nếu mà so sánh kiểu đấy thì chẳng có dòng dữ liệu nào trùng cả vì mình thấy Cột Reload của Sheet Controller có số 1 còn Cột Reload của sheet Data ko có dữ liệu
Bạn có thể trình bày thêm về định nghĩa trùng dữ liệu giữa các sheet được ko bạn

Dear Bạn.
1. Đúng như bạn nói sheet CONTROLLER trùng với DATA. 2 cột khóa chính là SKU của 2 sheet. mình chỉ muốn so sánh 2 trường này thôi, còn không phải
tất cả các cột có dữ liệu giống nhau.
2. Cột reload lúc đầu mình định dung access để so sánh số 1 trong CONTROLLER là dữ liệu cũ còn 0 bên DATA là dữ liệu mới đấy là theo cách mình tổ chức dữ liệu thôi nhưng làm mãi không được nên đành viết lên đầy giờ các bác giúp.

Mình cám ơn
 
Upvote 0
Em chạy code nó chỉ add được vào sheet controller chứ không add được vào sheet new. với lại em chạy lần 1 không báo lỗi chạy lần 2 nó báo lỗi
Rng.Copy Sheets("NEW").Range("A2")
chạy lần 1 nó copy cả 2 sheet bình thường
chạy lần 2 sheet CONTROLLER có thêm dữ liệu, nên dữ liệu sheet DATA không thỏa điều kiện và báo lổi
code thêm phần bẩy lổi, và chỉnh lại tăng tốc độ
Mã:
Sub GPE()
Dim Drng As Range, sArr(), Dic As Object, i As Long, R As Long, LastR As Long, Rng As Range
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set Drng = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
sArr = Sheets("CONTROLLER").Range("A2:A" & LastR).Value
For i = 1 To UBound(sArr)
  If Not Dic.exists(sArr(i, 1)) Then Dic.Add (sArr(i, 1)), ""
Next i
For i = 1 To R - 1
  If Not Dic.exists(Drng(i, 1).Value) And (Drng(i, 11) = "01" Or Drng(i, 11) = "02") Then
    k = k + 1
    If Rng Is Nothing Then
      Set Rng = Range(Drng(i, 1), Drng(i, 18))
    Else
      Set Rng = Application.Union(Rng, Range(Drng(i, 1), Drng(i, 18)))
    End If
  End If
Next i
Sheets("NEW").Range("A2:R20000").ClearContents
If Not Rng Is Nothing Then
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
  MsgBox ("Khong tim thay du lieu thoa dieu kien")
End If
Application.ScreenUpdating = True
End Sub
 
Upvote 0
chạy lần 1 nó copy cả 2 sheet bình thường
chạy lần 2 sheet CONTROLLER có thêm dữ liệu, nên dữ liệu sheet DATA không thỏa điều kiện và báo lổi
code thêm phần bẩy lổi, và chỉnh lại tăng tốc độ
Mã:
Sub GPE()
Dim Drng As Range, sArr(), Dic As Object, i As Long, R As Long, LastR As Long, Rng As Range
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set Drng = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
sArr = Sheets("CONTROLLER").Range("A2:A" & LastR).Value
For i = 1 To UBound(sArr)
  If Not Dic.exists(sArr(i, 1)) Then Dic.Add (sArr(i, 1)), ""
Next i
For i = 1 To R - 1
  If Not Dic.exists(Drng(i, 1).Value) And (Drng(i, 11) = "01" Or Drng(i, 11) = "02") Then
    k = k + 1
    If Rng Is Nothing Then
      Set Rng = Range(Drng(i, 1), Drng(i, 18))
    Else
      Set Rng = Application.Union(Rng, Range(Drng(i, 1), Drng(i, 18)))
    End If
  End If
Next i
Sheets("NEW").Range("A2:R20000").ClearContents
If Not Rng Is Nothing Then
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
  MsgBox ("Khong tim thay du lieu thoa dieu kien")
End If
Application.ScreenUpdating = True
End Sub
cảm ơn bác rất nhiều. em check có gì em lại nhờ bác fix giúp.
 
Upvote 0
chạy lần 1 nó copy cả 2 sheet bình thường
chạy lần 2 sheet CONTROLLER có thêm dữ liệu, nên dữ liệu sheet DATA không thỏa điều kiện và báo lổi
code thêm phần bẩy lổi, và chỉnh lại tăng tốc độ
Mã:
Sub GPE()
Dim Drng As Range, sArr(), Dic As Object, i As Long, R As Long, LastR As Long, Rng As Range
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set Drng = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
sArr = Sheets("CONTROLLER").Range("A2:A" & LastR).Value
For i = 1 To UBound(sArr)
  If Not Dic.exists(sArr(i, 1)) Then Dic.Add (sArr(i, 1)), ""
Next i
For i = 1 To R - 1
  If Not Dic.exists(Drng(i, 1).Value) And (Drng(i, 11) = "01" Or Drng(i, 11) = "02") Then
    k = k + 1
    If Rng Is Nothing Then
      Set Rng = Range(Drng(i, 1), Drng(i, 18))
    Else
      Set Rng = Application.Union(Rng, Range(Drng(i, 1), Drng(i, 18)))
    End If
  End If
Next i
Sheets("NEW").Range("A2:R20000").ClearContents
If Not Rng Is Nothing Then
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
  MsgBox ("Khong tim thay du lieu thoa dieu kien")
End If
Application.ScreenUpdating = True
End Sub
Dear Bác HieuCD.
Code chạy rất ok. Nhưng bác giúp em vấn đề này được không vì tại lúc đầu đăng bài viết lên em không biết diễn tả sao cho bác hiểu.
phải đợi vào vấn đề em mới mô tả được như sau.
Hiện tại sheet CONTROLLER đã có dữ liệu được lấy ra từ sheet DATA nhưng các cột J,K,M,L của Sheet DATA luôn luôn bị thay đổi.
vì vậy em muốn các cột của sheet CONTROLLER cũng phải thay đổi theo và phải tuân theo các điều kiện sau đây.

1. Cột K tại sheet CONTROLLER sẽ thay đổi theo cột K của sheet DATA cho đến khi nào K của DATA =95 và giữ nguyên giá trị 95 dù cho K của DATA bị mất đi. em ví dụ SKU 970279-YW0CLN-FAR-32A của CONTROLLER thay đổi theo SKU 970279-YW0CLN-FAR-32A của DATA( thay đổi các cột mà em vừa trình bày) đến
khi SKU 970279-YW0CLN-FAR-32A của DATA =95 thì SKU 970279-YW0CLN-FAR-32A của CONTROLLER sẽ được giữ nguyên giá trị là 95.
Nếu như SKU 970279-YW0CLN-FAR-32A của DATA về sau này có bị mất đi thì SKU 970279-YW0CLN-FAR-32A của CONTROLER phải còn nguyên 95.

2. Cột J,K,L của CONTROLLER thay đổi theo J,K,L của DATA cho đến khi K của DATA =35 và giữ nguyên không đổi dù cho SKU của DATA sau này có bị xóa đi.

Em không biết em giải thích yêu cầu như vậy có rõ ràng để bác hiểu chưa. Nhưng em rất hy vọng bác sẽ giúp được em.
Em gửi lại file đính kèm. Bác xem theo file mới giúp em.
Em cám ơn.
 

File đính kèm

Upvote 0
Dear Bác HieuCD.
Code chạy rất ok. Nhưng bác giúp em vấn đề này được không vì tại lúc đầu đăng bài viết lên em không biết diễn tả sao cho bác hiểu.
phải đợi vào vấn đề em mới mô tả được như sau.
Hiện tại sheet CONTROLLER đã có dữ liệu được lấy ra từ sheet DATA nhưng các cột J,K,M,L của Sheet DATA luôn luôn bị thay đổi.
vì vậy em muốn các cột của sheet CONTROLLER cũng phải thay đổi theo và phải tuân theo các điều kiện sau đây.
1. Cột K tại sheet CONTROLLER sẽ thay đổi theo cột K của sheet DATA cho đến khi nào K của DATA =95 và giữ nguyên giá trị 95 dù cho K của DATA bị mất đi. em ví dụ SKU 970279-YW0CLN-FAR-32A của CONTROLLER thay đổi theo SKU 970279-YW0CLN-FAR-32A của DATA( thay đổi các cột mà em vừa trình bày) đến
khi SKU 970279-YW0CLN-FAR-32A của DATA =95 thì SKU 970279-YW0CLN-FAR-32A của CONTROLLER sẽ được giữ nguyên giá trị là 95.
Nếu như SKU 970279-YW0CLN-FAR-32A của DATA về sau này có bị mất đi thì SKU 970279-YW0CLN-FAR-32A của CONTROLER phải còn nguyên 95.
2. Cột J,K,L của CONTROLLER thay đổi theo J,K,L của DATA cho đến khi K của DATA =35 và giữ nguyên không đổi dù cho SKU của DATA sau này có bị xóa đi.
Em không biết em giải thích yêu cầu như vậy có rõ ràng để bác hiểu chưa. Nhưng em rất hy vọng bác sẽ giúp được em.
Em gửi lại file đính kèm. Bác xem theo file mới giúp em.
Em cám ơn.
mình diễn đạt lại cho rỏ:

- vẫn trích dữ liệu vào sheet NEW như code trước?

các dữ liệu có sẵn của CONTROLLER:
- Nếu cột K của CONTROLLER khác 95 sẽ tính lại cột K theo DATA dựa vào giá trị tương ứng của SKU?
- Nếu cột K của CONTROLLER khác 35 sẽ tính lại các cột J,L,M theo DATA?
Nếu không tìm thấy SKU trên DATA thì không thay đổi cả 2 ý trên?
 
Upvote 0
mình diễn đạt lại cho rỏ:

- vẫn trích dữ liệu vào sheet NEW như code trước?

các dữ liệu có sẵn của CONTROLLER:
-Nếu cột K của CONTROLLER khác 95 sẽ tính lại cột K theo DATA dựa vào giá trị tương ứng của SKU?
- Nếu cột K của CONTROLLER khác 35 sẽ tính lại các cột J,L,M theo DATA?
Nếu không tìm thấy SKU trên DATA thì không thay đổi cả 2 ý trên?

Dear bác, em trả lời theo các ý của bác như sau.

- vẫn trích dữ liệu vào sheet NEW như code trước

các dữ liệu có sẵn của CONTROLLER:
-Nếu cột K của CONTROLLER khác 95 sẽ tính lại cột K theo DATA dựa vào giá trị tương ứng của SKU
- Nếu cột K của CONTROLLER < 35 sẽ tính lại các cột J,L,M theo DATA
Nếu không tìm thấy SKU trên DATA thì không thay đổi cả 2 ý trên
Chính xác chỉ còn khác 35 thay bằng < 35 thôi.
 
Upvote 0
Dear bác, em trả lời theo các ý của bác như sau.

- vẫn trích dữ liệu vào sheet NEW như code trước

các dữ liệu có sẵn của CONTROLLER:
-Nếu cột K của CONTROLLER khác 95 sẽ tính lại cột K theo DATA dựa vào giá trị tương ứng của SKU
- Nếu cột K của CONTROLLER < 35 sẽ tính lại các cột J,L,M theo DATA
Nếu không tìm thấy SKU trên DATA thì không thay đổi cả 2 ý trên
Chính xác chỉ còn khác 35 thay bằng < 35 thôi.
bạn chạy thử code, chú ý chổ màu đỏ để chỉnh lại cho phù hợp
Mã:
Sub GPE1()
Dim DR As Range, Rng As Range, Sarr(), Dic As Object, DicD As Object
Dim i   As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set DicD = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set DR = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
Sarr = Sheets("CONTROLLER").Range("A2:M" & LastR).Value
For i = 1 To UBound(Sarr)
  Tmp = Sarr(i, 1)
  If Not Dic.exists(Tmp) Then Dic.Add (Tmp), ""
Next i
For i = 1 To R - 1
  Tmp = DR(i, 1).Value
  If Not Dic.exists(Tmp) Then
    If DR(i, 11) = "02" Then
      k = k + 1
      If Rng Is Nothing Then
        Set Rng = Range(DR(i, 1), DR(i, 18))
      Else
        Set Rng = Application.Union(Rng, Range(DR(i, 1), DR(i, 18)))
      End If
    End If
  Else
    If Not DicD.exists(Tmp) Then DicD.Add (Tmp), _
        Array(DR(i, 10).Value, DR(i, 11).Value, DR(i, 12).Value, DR(i, 13).Value)
  End If
Next i
For i = 1 To UBound(Sarr)
  Tmp = Sarr(i, 1)
  If DicD.exists(Tmp) Then
[COLOR=#ff0000]    If Sarr(i, 11) < 95 Then[/COLOR]
      Sarr(i, 11) = Format(DicD.Item(Tmp)(1), "@@")
    End If
[COLOR=#ff0000]    If Sarr(i, 11) < 35 Then[/COLOR]
      Sarr(i, 10) = DicD.Item(Tmp)(0)
      Sarr(i, 12) = DicD.Item(Tmp)(2)
      Sarr(i, 13) = DicD.Item(Tmp)(3)
    End If
  End If
Next i
Sheets("CONTROLLER").Range("K2").Resize(LastR - 1).NumberFormat = "@"
Sheets("CONTROLLER").Range("A2").Resize(LastR - 1, 13) = Sarr
If Not Rng Is Nothing Then
  Sheets("NEW").Range("A2:R20000").ClearContents
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
  MsgBox ("Khong tim thay du lieu them moi")
End If
Application.ScreenUpdating = True
End Sub
 
Upvote 0
@HieuCD:
Như thế này sẽ tránh được phải bảo dic gọi item(tmp) nhiều lần
Mã:
Dim Var as Variant
For i = 1 To UBound(Sarr)
  If DicD.exists(Sarr(i, 1)) Then
    Var = DicD.Item(Sarr(i, 1))
[COLOR=#ff0000]    If Sarr(i, 11) < 95 Then[/COLOR]
      Sarr(i, 11) = Format(Var(1), "@@")
    End If
[COLOR=#ff0000]    If Sarr(i, 11) < 35 Then[/COLOR]
      Sarr(i, 10) = Var(0)
      Sarr(i, 12) = Var(2)
      Sarr(i, 13) = Var(3)
    End If
  End If
Next i
 
Upvote 0
@HieuCD:
Như thế này sẽ tránh được phải bảo dic gọi item(tmp) nhiều lần
Mã:
Dim Var as Variant
For i = 1 To UBound(Sarr)
  If DicD.exists(Sarr(i, 1)) Then
    Var = DicD.Item(Sarr(i, 1))
[COLOR=#ff0000]    If Sarr(i, 11) < 95 Then[/COLOR]
      Sarr(i, 11) = Format(Var(1), "@@")
    End If
[COLOR=#ff0000]    If Sarr(i, 11) < 35 Then[/COLOR]
      Sarr(i, 10) = Var(0)
      Sarr(i, 12) = Var(2)
      Sarr(i, 13) = Var(3)
    End If
  End If
Next i
cám ơn bạn, nhiều kiến thức nếu không có bạn và các bạn khác trên diễn đàn có lẽ mình không bao giờ biết được
chúc bạn một ngày chủ nhật vui/-*+//-*+//-*+/
 
Upvote 0
cám ơn bạn, nhiều kiến thức nếu không có bạn và các bạn khác trên diễn đàn có lẽ mình không bao giờ biết được
chúc bạn một ngày chủ nhật vui/-*+//-*+//-*+/
Dear Bác HieuCD em không biết cám ơn bác như thế nào cho đủ. nếu em không có những người như bác thì em mãi là nông dân quèn.
trân trọng cám ơn bác.
 
Upvote 0
Thời đại tiên tiến này khó hiểu quá, ngừoi xưng là nông dân quèn cũng xổ tiếng tây bôm bốp. Cỡ không biết tiếng tây như mình được tính là gì đây? cùng đinh?
 
Upvote 0
Thời đại tiên tiến này khó hiểu quá, ngừoi xưng là nông dân quèn cũng xổ tiếng tây bôm bốp. Cỡ không biết tiếng tây như mình được tính là gì đây? cùng đinh?
Hoho tiếng tây hê lô bai bai thì em biết. mấy cái sheet tiếng anh đấy là đổ từ hệ thống ra nó quy định vậy mà mọi người quen miệng đọc thôi. chứ tây gì đâu.
các bác viết code thì mới tây được, bác cứ khiêm tốn rồi /-*+/
 
Upvote 0
Dear Bác HieuCD em không biết cám ơn bác như thế nào cho đủ. nếu em không có những người như bác thì em mãi là nông dân quèn.
trân trọng cám ơn bác.
"Nông dân" mà gõ được tiếng Việt và mần Code VBA, là "Trí thức - VIỆT", không phải trí thức ngoại lai.
"Nông dân" mà gõ được tiếng Việt PHA TẠP lẫn tiếng Anh, chắc là "Nông dân...".

Ậy dà, cái "nữa nạc nữa mỡ" này không biết định nghĩa anh VetMini ơi! }}}}}}}}}}}}}}} khà khà khà.

Chúc anh em một ngày thiệt vui tươi.
 
Upvote 0
chạy lần 1 nó copy cả 2 sheet bình thường
chạy lần 2 sheet CONTROLLER có thêm dữ liệu, nên dữ liệu sheet DATA không thỏa điều kiện và báo lổi
code thêm phần bẩy lổi, và chỉnh lại tăng tốc độ
Mã:
Sub GPE()
Dim Drng As Range, sArr(), Dic As Object, i As Long, R As Long, LastR As Long, Rng As Range
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set Drng = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
sArr = Sheets("CONTROLLER").Range("A2:A" & LastR).Value
For i = 1 To UBound(sArr)
  If Not Dic.exists(sArr(i, 1)) Then Dic.Add (sArr(i, 1)), ""
Next i
For i = 1 To R - 1
  If Not Dic.exists(Drng(i, 1).Value) And (Drng(i, 11) = "01" Or Drng(i, 11) = "02") Then
    k = k + 1
    If Rng Is Nothing Then
      Set Rng = Range(Drng(i, 1), Drng(i, 18))
    Else
      Set Rng = Application.Union(Rng, Range(Drng(i, 1), Drng(i, 18)))
    End If
  End If
Next i
Sheets("NEW").Range("A2:R20000").ClearContents
If Not Rng Is Nothing Then
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
  MsgBox ("Khong tim thay du lieu thoa dieu kien")
End If
Application.ScreenUpdating = True
End Sub
Dear Bác HieuCD.
em gặp phải lỗi này.khi em nhấn button GPE tại sheet NEW lần 1 thì ok nhưng lần 2 nó bị mất định dang. ví dụ Cột I của Sheet CONTROLLER cứ có số 0 đằng trước là bị mất.
07959 thành 7959.
Vấn đề 2 là em có một file access em thực hiện query từ access ra excel nhưng mà nó quay mãi mất cả tiếng mới ra kết quả.
em đã tìm hiểu trên diễn đàn về các làm vba nhưng thực sự là nó quá khó so với em. bác giúp em với
file đính kèm em gửi để bác dễ check.
 

File đính kèm

Upvote 0
Dear Bác HieuCD.
em gặp phải lỗi này.khi em nhấn button GPE tại sheet NEW lần 1 thì ok nhưng lần 2 nó bị mất định dang. ví dụ Cột I của Sheet CONTROLLER cứ có số 0 đằng trước là bị mất.
07959 thành 7959.
Vấn đề 2 là em có một file access em thực hiện query từ access ra excel nhưng mà nó quay mãi mất cả tiếng mới ra kết quả.
em đã tìm hiểu trên diễn đàn về các làm vba nhưng thực sự là nó quá khó so với em. bác giúp em với
file đính kèm em gửi để bác dễ check.
do excel tự định dạng lại, bạn định dang cột I theo Text
Sub GPE()
Dim Drng As Range, sArr(), Dic As Object, i As Long, R As Long, LastR As Long, Rng As Range
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set Drng = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
sArr = Sheets("CONTROLLER").Range("A2:A" & LastR).Value
For i = 1 To UBound(sArr)
If Not Dic.exists(sArr(i, 1)) Then Dic.Add (sArr(i, 1)), ""
Next i
For i = 1 To R - 1
If Not Dic.exists(Drng(i, 1).Value) And (Drng(i, 11) = "01" Or Drng(i, 11) = "02") Then
k = k + 1
If Rng Is Nothing Then
Set Rng = Range(Drng(i, 1), Drng(i, 18))
Else
Set Rng = Application.Union(Rng, Range(Drng(i, 1), Drng(i, 18)))
End If
End If
Next i
Sheets("NEW").Range("A2:R20000").ClearContents
Sheets("CONTROLLER").Range("I2").Resize(LastR).NumberFormat = "@"
If Not Rng Is Nothing Then
Rng.Copy Sheets("NEW").Range("A2")
Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
MsgBox ("Khong tim thay du lieu thoa dieu kien")
End If
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
do excel tự định dạng lại, bạn định dang cột I theo Text
Sub GPE()
Dim DR As Range, Rng As Range, Sarr(), Dic As Object, DicD As Object
Dim i As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set DicD = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set DR = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
Sarr = Sheets("CONTROLLER").Range("A2:M" & LastR).Value
For i = 1 To UBound(Sarr)
Tmp = Sarr(i, 1)
If Not Dic.exists(Tmp) Then Dic.Add (Tmp), ""
Next i
For i = 1 To R - 1
Tmp = DR(i, 1).Value
If Not Dic.exists(Tmp) Then
If DR(i, 11) = "02" Then
k = k + 1
If Rng Is Nothing Then
Set Rng = Range(DR(i, 1), DR(i, 18))
Else
Set Rng = Application.Union(Rng, Range(DR(i, 1), DR(i, 18)))
End If
End If
Else
If Not DicD.exists(Tmp) Then DicD.Add (Tmp), _
Array(DR(i, 10).Value, DR(i, 11).Value, DR(i, 12).Value, DR(i, 13).Value)
End If
Next i
Dim Var As Variant
For i = 1 To UBound(Sarr)
If DicD.exists(Sarr(i, 1)) Then
Var = DicD.Item(Sarr(i, 1))
If Sarr(i, 11) < 95 Then
Sarr(i, 11) = Format(Var(1), "@@")
End If
If Sarr(i, 11) < 35 Then
Sarr(i, 10) = Var(0)
Sarr(i, 12) = Var(2)
Sarr(i, 13) = Var(3)
End If
End If
Next i
Sheets("CONTROLLER").Range("K2").Resize(LastR - 1).NumberFormat = "@"
Sheets("CONTROLLER").Range("A2").Resize(LastR - 1, 13) = Sarr
If Not Rng Is Nothing Then
Sheets("NEW").Range("A2:R20000").ClearContents
Sheets("CONTROLLER").Range("I2").Resize(LastR).NumberFormat = "@"
Rng.Copy Sheets("NEW").Range("A2")
Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
MsgBox ("Updated")
End If
Application.ScreenUpdating = True
End Sub
Nó vẫn không được bác ạ
 
Upvote 0
mình có chỉnh lại ở bài #23, nhưng bạn copy code lẹ quá, xem lại bài 23
Sory bác. lỗi do em copy nhầm em không để ý. đúng ra là em đinh hỏi bác code ở bài 24 nhưng trước đó em lại copy nhầm ở bài khác.
em thêm code dòng màu đỏ vào bài 24 nó vẫn không chạy được. bác fix giúp em với.
cả vấn đề 2 trong file zip đính kèm nữa nếu bác rảnh.
 
Upvote 0
Sory bác. lỗi do em copy nhầm em không để ý. đúng ra là em đinh hỏi bác code ở bài 24 nhưng trước đó em lại copy nhầm ở bài khác.
em thêm code dòng màu đỏ vào bài 24 nó vẫn không chạy được. bác fix giúp em với.
cả vấn đề 2 trong file zip đính kèm nữa nếu bác rảnh.
bạn thêm định dạng Text cột I
Mã:
Sub GPE()
Dim DR As Range, Rng As Range, Sarr(), Dic As Object, DicD As Object
Dim i   As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set DicD = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set DR = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
Sarr = Sheets("CONTROLLER").Range("A2:M" & LastR).Value
For i = 1 To UBound(Sarr)
  Tmp = Sarr(i, 1)
  If Not Dic.exists(Tmp) Then Dic.Add (Tmp), ""
Next i
For i = 1 To R - 1
  Tmp = DR(i, 1).Value
  If Not Dic.exists(Tmp) Then
    If DR(i, 11) = "02" Then
      k = k + 1
      If Rng Is Nothing Then
        Set Rng = Range(DR(i, 1), DR(i, 18))
      Else
        Set Rng = Application.Union(Rng, Range(DR(i, 1), DR(i, 18)))
      End If
    End If
  Else
    If Not DicD.exists(Tmp) Then DicD.Add (Tmp), _
        Array(DR(i, 10).Value, DR(i, 11).Value, DR(i, 12).Value, DR(i, 13).Value)
  End If
Next i
Dim Var As Variant
For i = 1 To UBound(Sarr)
  If DicD.exists(Sarr(i, 1)) Then
    Var = DicD.Item(Sarr(i, 1))
    If Sarr(i, 11) < 95 Then
      Sarr(i, 11) = Format(Var(1), "@@")
    End If
    If Sarr(i, 11) < 35 Then
      Sarr(i, 10) = Var(0)
      Sarr(i, 12) = Var(2)
      Sarr(i, 13) = Var(3)
    End If
  End If
Next i
[COLOR=#ff0000]Sheets("CONTROLLER").Range("I2").Resize(LastR - 1).NumberFormat = "@"[/COLOR]
Sheets("CONTROLLER").Range("K2").Resize(LastR - 1).NumberFormat = "@"
Sheets("CONTROLLER").Range("A2").Resize(LastR - 1, 13) = Sarr
If Not Rng Is Nothing Then
  Sheets("NEW").Range("A2:R20000").ClearContents
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
  MsgBox ("Updated")
End If
Application.ScreenUpdating = True
End Sub
còn access mình ít làm, mình chỉ có thể viết SQL để trích dữ liệu trong Query, bạn nêu yêu cầu tuần sau rảnh mình sẽ thử viết xem được không
 
Upvote 0
còn access mình ít làm, mình chỉ có thể viết SQL để trích dữ liệu trong Query, bạn nêu yêu cầu tuần sau rảnh mình sẽ thử viết xem được không
Vâng bác rảnh thì được thì bác giúp em thôi. còn code format đã ok rồi bác ạ. cám ơn bác.
 
Upvote 0
bạn thêm định dạng Text cột I
Mã:
Sub GPE()
Dim DR As Range, Rng As Range, Sarr(), Dic As Object, DicD As Object
Dim i   As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set DicD = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set DR = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
Sarr = Sheets("CONTROLLER").Range("A2:M" & LastR).Value
For i = 1 To UBound(Sarr)
  Tmp = Sarr(i, 1)
  If Not Dic.exists(Tmp) Then Dic.Add (Tmp), ""
Next i
For i = 1 To R - 1
  Tmp = DR(i, 1).Value
  If Not Dic.exists(Tmp) Then
    If DR(i, 11) = "02" Then
      k = k + 1
      If Rng Is Nothing Then
        Set Rng = Range(DR(i, 1), DR(i, 18))
      Else
        Set Rng = Application.Union(Rng, Range(DR(i, 1), DR(i, 18)))
      End If
    End If
  Else
    If Not DicD.exists(Tmp) Then DicD.Add (Tmp), _
        Array(DR(i, 10).Value, DR(i, 11).Value, DR(i, 12).Value, DR(i, 13).Value)
  End If
Next i
Dim Var As Variant
For i = 1 To UBound(Sarr)
  If DicD.exists(Sarr(i, 1)) Then
    Var = DicD.Item(Sarr(i, 1))
    If Sarr(i, 11) < 95 Then
      Sarr(i, 11) = Format(Var(1), "@@")
    End If
    If Sarr(i, 11) < 35 Then
      Sarr(i, 10) = Var(0)
      Sarr(i, 12) = Var(2)
      Sarr(i, 13) = Var(3)
    End If
  End If
Next i
[COLOR=#ff0000]Sheets("CONTROLLER").Range("I2").Resize(LastR - 1).NumberFormat = "@"[/COLOR]
Sheets("CONTROLLER").Range("K2").Resize(LastR - 1).NumberFormat = "@"
Sheets("CONTROLLER").Range("A2").Resize(LastR - 1, 13) = Sarr
If Not Rng Is Nothing Then
  Sheets("NEW").Range("A2:R20000").ClearContents
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
  MsgBox ("Updated")
End If
Application.ScreenUpdating = True
End Sub
còn access mình ít làm, mình chỉ có thể viết SQL để trích dữ liệu trong Query, bạn nêu yêu cầu tuần sau rảnh mình sẽ thử viết xem được không
Bác HieuCD ơi bác chỉnh giúp em thêm điều kiện với. nghĩa là khi cả 2 SKU tồn tại đồng thời ở cả sheet DATA và CONTROLLER tại cột A.
Nếu như SKU tại DATA có STATUS < 35 mà bị mất đi thì SKU tương ứng bên CONTROLLER cũng bị mất đi.
bác giúp em với em loay hoay mãi vì nó nhiều dữ liệu rất dễ nhầm.
 
Upvote 0
Bác HieuCD ơi bác chỉnh giúp em thêm điều kiện với. nghĩa là khi cả 2 SKU tồn tại đồng thời ở cả sheet DATA và CONTROLLER tại cột A.
Nếu như SKU tại DATA có STATUS < 35 mà bị mất đi thì SKU tương ứng bên CONTROLLER cũng bị mất đi.
bác giúp em với em loay hoay mãi vì nó nhiều dữ liệu rất dễ nhầm.
bạn chạy code sau, chạy hơi chậm
Mã:
Sub DelCONTROL()
Dim Darr(), Sarr(), Dic As Object, i As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DATA")
  Darr = .Range("A2:K" & .Range("A65500").End(xlUp).Row).Value
End With
For i = 1 To UBound(Darr)
  If Darr(i, 11) < 35 Then
    Tmp = Darr(i, 1)
    If Not Dic.exists(Tmp) Then Dic.Add (Tmp), ""
  End If
Next i
With Sheets("CONTROLLER")
  Sarr = .Range("A1:A" & .Range("A65500").End(xlUp).Row).Value
  For i = 2 To UBound(Sarr)
    Tmp = Sarr(i, 1)
    If Not Dic.exists(Darr(i, 1)) Then
      .Range("A" & i).EntireRow.Delete
    End If
  Next i
End With
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
 
Upvote 0
bạn chạy code sau, chạy hơi chậm
Mã:
Sub DelCONTROL()
Dim Darr(), Sarr(), Dic As Object, i As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DATA")
  Darr = .Range("A2:K" & .Range("A65500").End(xlUp).Row).Value
End With
For i = 1 To UBound(Darr)
  If Darr(i, 11) < 35 Then
    Tmp = Darr(i, 1)
    If Not Dic.exists(Tmp) Then Dic.Add (Tmp), ""
  End If
Next i
With Sheets("CONTROLLER")
  Sarr = .Range("A1:A" & .Range("A65500").End(xlUp).Row).Value
  For i = 2 To UBound(Sarr)
    Tmp = Sarr(i, 1)
    If Not Dic.exists(Darr(i, 1)) Then
      .Range("A" & i).EntireRow.Delete
    End If
  Next i
End With
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Em chạy khoảng 2 đến 3 phút nhưng xong rồi nó vẫn còn nguyên bác ạ. bác check giúp em với. nếu có thể bác ghép luôn vào sub GPE trước đó
để không phải tạo 2 button sub.
cám ơn bác
 
Upvote 0
Em chạy khoảng 2 đến 3 phút nhưng xong rồi nó vẫn còn nguyên bác ạ. bác check giúp em với. nếu có thể bác ghép luôn vào sub GPE trước đó
để không phải tạo 2 button sub.
cám ơn bác
để 2 sub để dể quản lý, và sub chính gọn hơn, bạn có thể dùng lệnh: call DelCONTROL đặt ở đầu hoạc cuối sub chính để chạy lệnh xóa
đã sửa lại code, nhanh hơn 1 chút
Mã:
Sub DelCONTROL()
Dim Darr(), Sarr(), Dic As Object, Rng As Range, i As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DATA")
  Darr = .Range("A2:K" & .Range("A65500").End(xlUp).Row).Value
End With
For i = 1 To UBound(Darr)
  If Darr(i, 11) < 35 Then
    If Not Dic.exists(Darr(i, 1)) Then Dic.Add (Darr(i, 1)), ""
  End If
Next i
With Sheets("CONTROLLER")
  Sarr = .Range("A1:A" & .Range("A65500").End(xlUp).Row).Value
  For i = 2 To UBound(Sarr)
    If Not Dic.exists(Sarr(i, 1)) Then
      If Rng Is Nothing Then
        Set Rng = .Range("A" & i)
      Else
        Set Rng = Application.Union(Rng, .Range("A" & i))
      End If
    End If
  Next i
  If Not Rng Is Nothing Then
    Rng.EntireRow.Delete
  End If
End With
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
nếu quá chậm, thì bỏ hết code và viết lại toàn bộ
 
Upvote 0
để 2 sub để dể quản lý, và sub chính gọn hơn, bạn có thể dùng lệnh: call DelCONTROL đặt ở đầu hoạc cuối sub chính để chạy lệnh xóa
đã sửa lại code, nhanh hơn 1 chút
Mã:
nếu quá chậm, thì bỏ hết code và viết lại toàn bộ[/QUOTE]
cám ơn bác mấy ngày qua chỗ em mất mạng chưa online được. em chạy nếu có vấn đề gì bác support giúp.
 
Upvote 0
để 2 sub để dể quản lý, và sub chính gọn hơn, bạn có thể dùng lệnh: call DelCONTROL đặt ở đầu hoạc cuối sub chính để chạy lệnh xóa
đã sửa lại code, nhanh hơn 1 chút
nếu quá chậm, thì bỏ hết code và viết lại toàn bộ
Bac HieuCD ơi có chút vấn đề. em chỉ muốn loại những SKU có STT <35 có tại CONTROLLER mà không tồn tại ở sheet DATA thôi và phải giữ nguyên các SKU khác.
vì em bấm button dele nó chỉ giữ lại <35 còn các SKU khác có STATUS > 35 nó xóa sạch. bác fix giúp em với.
 
Upvote 0
Bac HieuCD ơi có chút vấn đề. em chỉ muốn loại những SKU có STT <35 có tại CONTROLLER mà không tồn tại ở sheet DATA thôi và phải giữ nguyên các SKU khác.
vì em bấm button dele nó chỉ giữ lại <35 còn các SKU khác có STATUS > 35 nó xóa sạch. bác fix giúp em với.
mấy hôm nay bận nên không lên diễn đàn. bạn chạy code và kiểm tra lại
Mã:
Sub DelCONTROL()
Dim Darr(), Sarr(), Dic As Object, Rng As Range, i As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DATA")
  Darr = .Range("A2:K" & .Range("A65500").End(xlUp).Row).Value
End With
For i = 1 To UBound(Darr)
  If Not Dic.exists(Darr(i, 1)) Then Dic.Add (Darr(i, 1)), ""
Next i
With Sheets("CONTROLLER")
  Sarr = .Range("A1:K" & .Range("A65500").End(xlUp).Row).Value
  For i = 2 To UBound(Sarr)
    If  Sarr(i, 11) < 35 Then
      If Not Dic.exists(Sarr(i, 1)) Then
        If Rng Is Nothing Then
          Set Rng = .Range("A" & i)
        Else
          Set Rng = Application.Union(Rng, .Range("A" & i))
        End If
      End If
    End If
  Next i
  If Not Rng Is Nothing Then
    Rng.EntireRow.Delete
  End If
End With
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
 
Upvote 0
mấy hôm nay bận nên không lên diễn đàn. bạn chạy code và kiểm tra lại
Mã:
Sub DelCONTROL()
Dim Darr(), Sarr(), Dic As Object, Rng As Range, i As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("DATA")
  Darr = .Range("A2:K" & .Range("A65500").End(xlUp).Row).Value
End With
For i = 1 To UBound(Darr)
  If Not Dic.exists(Darr(i, 1)) Then Dic.Add (Darr(i, 1)), ""
Next i
With Sheets("CONTROLLER")
  Sarr = .Range("A1:K" & .Range("A65500").End(xlUp).Row).Value
  For i = 2 To UBound(Sarr)
    If  Sarr(i, 11) < 35 Then
      If Not Dic.exists(Sarr(i, 1)) Then
        If Rng Is Nothing Then
          Set Rng = .Range("A" & i)
        Else
          Set Rng = Application.Union(Rng, .Range("A" & i))
        End If
      End If
    End If
  Next i
  If Not Rng Is Nothing Then
    Rng.EntireRow.Delete
  End If
End With
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Dear bác HieuCD em sory em trả lời muộn em vào link diễn đàn cứ báo NotFound Error 404. mãi giờ mới được
Code dele đã ok rồi bác ạ.
Nhưng em gặp phải vấn đề sub GPE khi em sửa code thêm cột cần cập nhật từ DATA cho sheet CONTROLLER nó không chạy được.
Em thấy code cập nhật các cột theo DATA của bác rất hay em rất muốn triển khai thêm cho sheet khác
trong file đính kèm em có thêm 1 sheet UX, em muốn các cột STUVW tại CONTROLLER cập nhật theo MNOPQ tại sheet UX
và giữ nguyên CONTROLLER khi dữ liệu UX bị mất. em đã thử copy code của bác ra file khác để thực hành nhưng
em bị vướng em không hiểu gì về cấu trúc vòng lặp cả. Rất mong bác giúp em.
 

File đính kèm

Upvote 0
Dear bác HieuCD em sory em trả lời muộn em vào link diễn đàn cứ báo NotFound Error 404. mãi giờ mới được
Code dele đã ok rồi bác ạ.
Nhưng em gặp phải vấn đề sub GPE khi em sửa code thêm cột cần cập nhật từ DATA cho sheet CONTROLLER nó không chạy được.
Em thấy code cập nhật các cột theo DATA của bác rất hay em rất muốn triển khai thêm cho sheet khác
trong file đính kèm em có thêm 1 sheet UX, em muốn các cột STUVW tại CONTROLLER cập nhật theo MNOPQ tại sheet UX
và giữ nguyên CONTROLLER khi dữ liệu UX bị mất. em đã thử copy code của bác ra file khác để thực hành nhưng
em bị vướng em không hiểu gì về cấu trúc vòng lặp cả. Rất mong bác giúp em.
xem file nhưng không rỏ bạn muốn làm gì, bạn phải nói rỏ toàn bộ từ đầu từng vấn đề và nếu cần thì cho ví dụ, lúc đó mới hiểu ý bạn được
 
Upvote 0
xem file nhưng không rỏ bạn muốn làm gì, bạn phải nói rỏ toàn bộ từ đầu từng vấn đề và nếu cần thì cho ví dụ, lúc đó mới hiểu ý bạn được
sr bác.
1. Em muốn bác sửa giúp em sub GPE vì nó chỉ lấy được dữ liệu mới khi click lần 1 nhưng click lần 2 nó không cập nhật được hết các cột J,K,M,N từ CONTROLLER theo DATA mà chỉ cập nhật được duy nhất cột K thôi.
2. Em muốn cập nhật dữ liệu từ sheet CONTROLLER với các cột S,T,U,V,W tương ứng theo các cột M,N,O,P,Q của sheet UX và Nếu dữ liệu UX có bị xóa thì sheet CONTROLLER vẫn được giữ nguyên.
em đã tô màu xanh và đỏ các sheet để bác dễ nhìn. các sheet đều có cột SKU để làm khóa chính.
Mong là bác hiểu những gì em viết.

Cám ơn bác rất nhiều
 

File đính kèm

Upvote 0
sr bác.
1. Em muốn bác sửa giúp em sub GPE vì nó chỉ lấy được dữ liệu mới khi click lần 1 nhưng click lần 2 nó không cập nhật được hết các cột J,K,M,N từ CONTROLLER theo DATA mà chỉ cập nhật được duy nhất cột K thôi.
2. Em muốn cập nhật dữ liệu từ sheet CONTROLLER với các cột S,T,U,V,W tương ứng theo các cột M,N,O,P,Q của sheet UX và Nếu dữ liệu UX có bị xóa thì sheet CONTROLLER vẫn được giữ nguyên.
em đã tô màu xanh và đỏ các sheet để bác dễ nhìn. các sheet đều có cột SKU để làm khóa chính.
Mong là bác hiểu những gì em viết.
Cám ơn bác rất nhiều
mình dùng excel 2007, các file excel 2013 trở về sau có sử dụng các định dạng đặc biệt là bị xử hết, nên các màu không thấy gì hết
để tiết kiệm dung lượng gởi lên diễn đàn và dể theo dõi kết quả, bạn tạo file mới lưu lại với đuôi là .xls, copy vài chục dòng và dán vào, trong đó có đủ các ví dụ về các khả năng có thể xảy ra, tô màu phân biệt và nói rỏ yêu cầu, lúc đó mình mới hình dung được hết các vấn đề được
 
Upvote 0
mình dùng excel 2007, các file excel 2013 trở về sau có sử dụng các định dạng đặc biệt là bị xử hết, nên các màu không thấy gì hết
để tiết kiệm dung lượng gởi lên diễn đàn và dể theo dõi kết quả, bạn tạo file mới lưu lại với đuôi là .xls, copy vài chục dòng và dán vào, trong đó có đủ các ví dụ về các khả năng có thể xảy ra, tô màu phân biệt và nói rỏ yêu cầu, lúc đó mình mới hình dung được hết các vấn đề được

Em đã save file như bác nói nhưng mà khi save .xls nó lên đến 7.2MB không load được. nên em chỉ copy ví dụ và thêm comment để bác dễ hình dung.
em rất muốn bác hiểu và hình dung là trong suốt quá trình từ đầu đến giờ bác đã giúp em làm được gần xong rồi
bây giờ chỉ còn việc cập nhật dữ liệu từ sheet này qua sheet khác và không bị mất đi khi dữ liệu tại sheet nguồn bị xóa.
code bác chuyển cho em bình thường vẫn chạy được ở định dạng xlsb. vì trước bác cũng đưa cho em ở định dang xls sau đó em đưa sang xlsb vẫn ok.
chi là lần này em thêm vào code như sau nên nó mới không chạy được, em đã notes màu đỏ code bên dưới.
Sub GPE()Dim DR As Range, Rng As Range, Sarr(), Dic As Object, DicD As Object
Dim i As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set DicD = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set DR = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
Sarr = Sheets("CONTROLLER").Range("A2:N" & LastR).Value (em sửa chữ M sang N)
For i = 1 To UBound(Sarr)
Tmp = Sarr(i, 1)
If Not Dic.exists(Tmp) Then Dic.Add (Tmp), ""
Next i
For i = 1 To R - 1
Tmp = DR(i, 1).Value
If Not Dic.exists(Tmp) Then
If DR(i, 11) >= "02" And DR(i, 11) <= "33" Then
k = k + 1
If Rng Is Nothing Then
Set Rng = Range(DR(i, 1), DR(i, 18))
Else
Set Rng = Application.Union(Rng, Range(DR(i, 1), DR(i, 18)))
End If
End If
Else
If Not DicD.exists(Tmp) Then DicD.Add (Tmp), _
Array(DR(i, 10).Value, DR(i, 11).Value, DR(i, 12).Value, DR(i, 13).Value, DR(i, 14).Value) Em Thêm DR(i, 14).Value
End If
Next i
Dim Var As Variant
For i = 1 To UBound(Sarr)
If DicD.exists(Sarr(i, 1)) Then
Var = DicD.Item(Sarr(i, 1))
If Sarr(i, 11) < 95 Then
Sarr(i, 11) = Format(Var(1), "@@")
End If
If Sarr(i, 11) <= 35 Then
Sarr(i, 10) = Var(0)
Sarr(i, 12) = Var(2)
Sarr(i, 13) = Var(3)
Sarr(i, 14) = Var(4) ( em Thêm mới)
End If
End If
Next i
Sheets("CONTROLLER").Range("I2").Resize(LastR - 1).NumberFormat = "@"
Sheets("CONTROLLER").Range("K2").Resize(LastR - 1).NumberFormat = "@"
Sheets("CONTROLLER").Range("A2").Resize(LastR - 1, 13) = Sarr
If Not Rng Is Nothing Then
Sheets("NEW").Range("A2:R20000").ClearContents
Rng.Copy Sheets("NEW").Range("A2")
Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
Else
MsgBox ("Updated")
End If
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Upvote 0
bạn kiểm tra lại code
Mã:
Sub GPE()
Dim DR As Range, Rng As Range, Dic As Object, Dic35 As Object, Dic95 As Object
Dim Sarr(), S_UX(), UXarr(), i As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set Dic35 = CreateObject("Scripting.Dictionary")
Set Dic95 = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set DR = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
Sarr = Sheets("CONTROLLER").Range("A2:N" & LastR).Value
S_UX = Sheets("CONTROLLER").Range("S2:W" & LastR).Value
UXarr = Sheets("UX").Range("A2:Q" & Sheets("UX").Range("A65500").End(xlUp).Row).Value
For i = 1 To UBound(Sarr)
  Tmp = Sarr(i, 1)
  Dic.Add (Tmp), i
  If Sarr(i, 11) < 95 Then
    Dic95.Add (Tmp), i
    If Sarr(i, 11) <= 35 Then Dic35.Add (Tmp), i
  End If
Next i
For i = 1 To R - 1
  Tmp = DR(i, 1).Value
  If Not Dic.exists(Tmp) Then
    If DR(i, 11) >= "02" And DR(i, 11) <= "33" Then
      If Rng Is Nothing Then
        Set Rng = Range(DR(i, 1), DR(i, 18))
      Else
        Set Rng = Application.Union(Rng, Range(DR(i, 1), DR(i, 18)))
      End If
    End If
  Else
    If Dic95.exists(Tmp) Then
      k = Dic95.Item(Tmp)
      Sarr(k, 11) = Format(DR(i, 11), "@@")
      If Dic35.exists(Tmp) Then
        k = Dic35.Item(Tmp)
        Sarr(k, 10) = DR(i, 10)
        Sarr(k, 12) = DR(i, 12)
        Sarr(k, 13) = DR(i, 13)
        Sarr(k, 14) = DR(i, 14)
      End If
    End If
  End If
Next i
For i = 1 To UBound(UXarr)
  Tmp = UXarr(i, 1)
  If Dic.exists(Tmp) Then
    n = Dic.Item(Tmp)
    S_UX(n, 1) = UXarr(i, 13)
    S_UX(n, 2) = UXarr(i, 14)
    S_UX(n, 3) = UXarr(i, 15)
    S_UX(n, 4) = UXarr(i, 16)
    S_UX(n, 5) = UXarr(i, 17)
  End If
Next i
If k Then
  Sheets("CONTROLLER").Range("I2").Resize(LastR - 1).NumberFormat = "@"
  Sheets("CONTROLLER").Range("K2").Resize(LastR - 1).NumberFormat = "@"
  Sheets("CONTROLLER").Range("A2").Resize(LastR - 1, 14) = Sarr
  MsgBox ("Old Row Is Updated From Data")
End If
If n Then
  Sheets("CONTROLLER").Range("S2").Resize(LastR - 1, 5) = S_UX
  MsgBox ("Old Row Is Updated From UX")
End If
Sheets("NEW").Range("A2:R20000").ClearContents
If Not Rng Is Nothing Then
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
  MsgBox ("Updated New Row")
Else
  MsgBox ("No Row Inserted")
End If
Application.ScreenUpdating = True
End Sub
 
Upvote 0
bạn kiểm tra lại code
Mã:
Sub GPE()
Dim DR As Range, Rng As Range, Dic As Object, Dic35 As Object, Dic95 As Object
Dim Sarr(), S_UX(), UXarr(), i As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set Dic35 = CreateObject("Scripting.Dictionary")
Set Dic95 = CreateObject("Scripting.Dictionary")
R = Sheets("DATA").Range("A65500").End(xlUp).Row
Set DR = Sheets("DATA").Range("A2:R" & R)
LastR = Sheets("CONTROLLER").Range("A65500").End(xlUp).Row
Sarr = Sheets("CONTROLLER").Range("A2:N" & LastR).Value
S_UX = Sheets("CONTROLLER").Range("S2:W" & LastR).Value
UXarr = Sheets("UX").Range("A2:Q" & Sheets("UX").Range("A65500").End(xlUp).Row).Value
For i = 1 To UBound(Sarr)
  Tmp = Sarr(i, 1)
  Dic.Add (Tmp), i
  [COLOR=#ff0000]If Sarr(i, 10) < 95 Then[/COLOR]
    Dic95.Add (Tmp), i
    [COLOR=#ff0000]If Sarr(i, 10) <= 35 Then Dic35.Add (Tmp), i[/COLOR]
  End If
Next i
For i = 1 To R - 1
  Tmp = DR(i, 1).Value
  If Not Dic.exists(Tmp) Then
   [COLOR=#ff0000]If DR(i, 10) >= "02" And DR(i, 10) <= "33" Then[/COLOR]
      If Rng Is Nothing Then
        Set Rng = Range(DR(i, 1), DR(i, 18))
      Else
        Set Rng = Application.Union(Rng, Range(DR(i, 1), DR(i, 18)))
      End If
    End If
  Else
    If Dic95.exists(Tmp) Then
      k = Dic95.Item(Tmp)
      [COLOR=#ff0000]Sarr(k, 10) = Format(DR(i, 10), "@@")[/COLOR]
      If Dic35.exists(Tmp) Then
        k = Dic35.Item(Tmp)
        [COLOR=#ff0000]Sarr(k, 10) = DR(i, 11)[/COLOR]
        Sarr(k, 12) = DR(i, 12)
        Sarr(k, 13) = DR(i, 13)
        Sarr(k, 14) = DR(i, 14)
      End If
    End If
  End If
Next i
For i = 1 To UBound(UXarr)
  Tmp = UXarr(i, 1)
  If Dic.exists(Tmp) Then
    n = Dic.Item(Tmp)
    S_UX(n, 1) = UXarr(i, 13)
    S_UX(n, 2) = UXarr(i, 14)
    S_UX(n, 3) = UXarr(i, 15)
    S_UX(n, 4) = UXarr(i, 16)
    S_UX(n, 5) = UXarr(i, 17)
  End If
Next i
If k Then
  Sheets("CONTROLLER").Range("I2").Resize(LastR - 1).NumberFormat = "@"
  [COLOR=#ff0000]Sheets("CONTROLLER").Range("J2").Resize(LastR - 1).NumberFormat = "@"[/COLOR]
  Sheets("CONTROLLER").Range("A2").Resize(LastR - 1, 14) = Sarr
  MsgBox ("Old Row Is Updated From Data")
End If
If n Then
  Sheets("CONTROLLER").Range("S2").Resize(LastR - 1, 5) = S_UX
  MsgBox ("Old Row Is Updated From UX")
End If
Sheets("NEW").Range("A2:R20000").ClearContents
If Not Rng Is Nothing Then
  Rng.Copy Sheets("NEW").Range("A2")
  Rng.Copy Sheets("CONTROLLER").Range("A" & LastR + 1)
  MsgBox ("Updated New Row")
Else
  MsgBox ("No Row Inserted")
End If
Application.ScreenUpdating = True
End Sub

Cám ơn bác em đã chạy ngon rồi. Nếu em muốn đổi cột liệu có đổi được không bác. em chỉ đổi vị trí cột STATUS của các sheet DATA, NEW, CONTROLLER từ K về J sau đó
em sửa lại code em đã bôi màu. nó báo lỗi ngay từ If Sarr(i, 10) < 95 Then. em rất xin lỗi vì đã hỏi vặt bác nhưng em chẳng biết nhờ ai nữa.
 
Upvote 0
Cám ơn bác em đã chạy ngon rồi. Nếu em muốn đổi cột liệu có đổi được không bác. em chỉ đổi vị trí cột STATUS của các sheet DATA, NEW, CONTROLLER từ K về J sau đó
em sửa lại code em đã bôi màu. nó báo lỗi ngay từ If Sarr(i, 10) < 95 Then. em rất xin lỗi vì đã hỏi vặt bác nhưng em chẳng biết nhờ ai nữa.
mình cũng không biết tại sao bị lỗi
bạn chạy code, khi báo lỗi, bạn rà chuột vào dòng lệnh lỗi, chổ Sarr(i, 10) xem nó hiện kết quả là gì mới biết được, hoặc bạn gởi file xem sao
giờ mình bận, thứ 2 mới rảnh
 
Upvote 0
mình cũng không biết tại sao bị lỗi
bạn chạy code, khi báo lỗi, bạn rà chuột vào dòng lệnh lỗi, chổ Sarr(i, 10) xem nó hiện kết quả là gì mới biết được, hoặc bạn gởi file xem sao
giờ mình bận, thứ 2 mới rảnh

Dear Bác HieuCD. em đã xóa hết dữ liệu sheet CONTROLLER và chạy lại thì nó không báo lỗi nữa.
em nghĩ có lẽ nó chạy được rồi em hi vọng nó ko có vấn đề gì. cám ơn bác rất nhiều.
 
Upvote 0
mình cũng không biết tại sao bị lỗi
bạn chạy code, khi báo lỗi, bạn rà chuột vào dòng lệnh lỗi, chổ Sarr(i, 10) xem nó hiện kết quả là gì mới biết được, hoặc bạn gởi file xem sao
giờ mình bận, thứ 2 mới rảnh

Bác HieuCD ơi. nếu em click button GPE mà bên sheet CONTROLLER em ẩn một số cột đi thì nó sẽ copy và cập nhật sai hết vị trí. liệu có cách nào khắc phục không bác.
 
Upvote 0
Bác HieuCD ơi. nếu em click button GPE mà bên sheet CONTROLLER em ẩn một số cột đi thì nó sẽ copy và cập nhật sai hết vị trí. liệu có cách nào khắc phục không bác.
đầu sub bạn dùng lệnh để Unhide cột
Mã:
Cells.EntireColumn.Hidden = False
cuối sub bạn dùng code dạng sau để ẩn cột
Mã:
Columns("[COLOR=#ff0000]E:G[/COLOR]").EntireColumn.Hidden = True
 
Upvote 0
đầu sub bạn dùng lệnh để Unhide cột
Mã:
Cells.EntireColumn.Hidden = False
cuối sub bạn dùng code dạng sau để ẩn cột
Mã:
Columns("[COLOR=#ff0000]E:G[/COLOR]").EntireColumn.Hidden = True
đối với dòng khi em lọc có dùng được cách này không bác
 
Upvote 0
đầu sub bạn dùng lệnh để Unhide cột
Mã:
Cells.EntireColumn.Hidden = False
cuối sub bạn dùng code dạng sau để ẩn cột
Mã:
Columns("[COLOR=#ff0000]E:G[/COLOR]").EntireColumn.Hidden = True
Ôi nó đơ không chạy được bác ạ. bác giúp em với áp dụng cả dòng và cột.
em cám ơn
 
Upvote 0
đối với dòng phải biết bạn ẩn bằng cách nào mới làm được
tốt nhất bạn bỏ ẩn dòng và cột thủ công trước khi chạy code

Em cũng làm như bác nói mỗi khi chạy là em bỏ hết lọc đi. Nhưng nhiều khi em quên em ko bỏ lọc và ẩn em chạy nó bị nhầm hết dữ liệu. vậy là em lại phải làm bằng tay lại
từ đầu phát ốm. bây giờ em chỉ muốn bác giúp em check điều kiện nếu như có cột ẩn và các dòng bị lọc thì cảnh báo và không chạy code nữa. cho đến kho thỏa mãn điều kiện thì code được chạy.
 
Upvote 0
Em cũng làm như bác nói mỗi khi chạy là em bỏ hết lọc đi. Nhưng nhiều khi em quên em ko bỏ lọc và ẩn em chạy nó bị nhầm hết dữ liệu. vậy là em lại phải làm bằng tay lại
từ đầu phát ốm. bây giờ em chỉ muốn bác giúp em check điều kiện nếu như có cột ẩn và các dòng bị lọc thì cảnh báo và không chạy code nữa. cho đến kho thỏa mãn điều kiện thì code được chạy.
bạn thêm đoạn code màu đỏ vào đầu code xem sao
Mã:
Sub GPE()
Dim DR As Range, Rng As Range, Dic As Object, Dic35 As Object, Dic95 As Object
Dim Sarr(), S_UX(), UXarr(), i As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set Dic35 = CreateObject("Scripting.Dictionary")
Set Dic95 = CreateObject("Scripting.Dictionary")
[COLOR=#ff0000]Sheets("DATA"[/COLOR][COLOR=#ff0000]).Rows.Hidden = False
Sheets("DATA").Columns.Hidden = False
Sheets("DATA").AutoFilterMode = False
Sheets("CONTROLLER").Rows.Hidden = False
Sheets("CONTROLLER").Columns.[/COLOR][COLOR=#ff0000]Hidden = False[/COLOR]
[COLOR=#ff0000]Sheets("CONTROLLER").AutoFilterMode = False[/COLOR]
R = Sheets("DATA").Range("A65500").End(xlUp).Row
......
 
Lần chỉnh sửa cuối:
Upvote 0
Anh HieuCD,

Có thể viết gọn lại như vầy:
Mã:
'Hủy dòng ẩn:
.Rows.Hidden = False
'Hủy cột ẩn:
.Columns.Hidden = False
'Hiện dòng bị lọc (=Clear Filter)
.ShowAllData
 
Upvote 0
Anh HieuCD,
Có thể viết gọn lại như vầy:
Mã:
'Hủy dòng ẩn:
.Rows.Hidden = False
'Hủy cột ẩn:
.Columns.Hidden = False
'Hiện dòng bị lọc (=Clear Filter)
.ShowAllData
cám ơn bạn, 2 lệnh đầu chạy tốt, riêng .ShowAllData nếu đã showall rồi, showall lần kế sẽ bị lổi
 
Upvote 0
bạn thêm đoạn code màu đỏ vào đầu code xem sao
Mã:
Sub GPE()
Dim DR As Range, Rng As Range, Dic As Object, Dic35 As Object, Dic95 As Object
Dim Sarr(), S_UX(), UXarr(), i As Long, R As Long, LastR As Long, Tmp As String
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")
Set Dic35 = CreateObject("Scripting.Dictionary")
Set Dic95 = CreateObject("Scripting.Dictionary")
[COLOR=#ff0000]Sheets("DATA"[/COLOR][COLOR=#ff0000]).Rows.Hidden = False
Sheets("DATA").Columns.Hidden = False
Sheets("DATA").AutoFilterMode = False
Sheets("CONTROLLER").Rows.Hidden = False
Sheets("CONTROLLER").Columns.[/COLOR][COLOR=#ff0000]Hidden = False[/COLOR]
[COLOR=#ff0000]Sheets("CONTROLLER").AutoFilterMode = False[/COLOR]
R = Sheets("DATA").Range("A65500").End(xlUp).Row
......
Tuy nó có chậm hơn trước 1 chút thôi nhưng nó đảm bảo chính xác bác ạ.cám ơn bác cám ơn các bác rất nhiều.
 
Upvote 0

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

Back
Top Bottom