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