Giúp mình về dữ liệu lớn trong exel (1 người xem)

Liên hệ QC

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

vnlife2000

Thành viên chính thức
Tham gia
3/4/07
Bài viết
71
Được thích
0
Chào anh/chi, mình có dữ liệu lớn cần trích lọc nhưng vì file dữ liệu lớn quá có thể hơn 1.048.576 dòng nên mỗi lần mình dùng hàm vlookup để tra thì load rất là lâu, có cách nào dùng code tra và mở dữ liêu nhanh hơn không.
Một file dữ liệu gồm 2 cột : Mã số và tên
một file dùng để lọc mã số từ file dữ liệu đó
Cảm ơn anh/chi rất nhiều
 

File đính kèm

Lần chỉnh sửa cuối:
Chào anh/chi, mình có dữ liệu lớn cần trích lọc nhưng vì file dữ liệu lớn quá có thể hơn 1.048.576 dòng nên mỗi lần mình dùng hàm vlookup để tra thì load rất là lâu, có cách nào dùng code tra và mở dữ liêu nhanh hơn không.
Một file dữ liệu gồm 2 cột : Mã số và tên
một file dùng để lọc mã số từ file dữ liệu đó
Cảm ơn anh/chi rất nhiều
đặt 2 file trong cùng 1 thư mục
mở file PHIEU.XLSX Save As lại theo tên PHIEU.XLXB hoặc PHIEU.XLXM trong cùng thư mục
chep code sau vào và chạy thử xem sao
Mã:
Sub Vlookup()
Dim Dic As Object, Darr(), Arr(), i As Long, LastR As Long
Application.DisplayAlerts = False
Application.ScreenUpdating = False
'On Error Resume Next
Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  LastR = .Range("A1040000").End(xlUp).Row
  If LastR < 4 Then
    MsgBox ("Khong co du lieu, thoat chuong trinh"): Exit Sub
  End If
  Darr = .Range("A4:B" & LastR).Value
End With
Set Dic = CreateObject("scripting.dictionary")
For i = 1 To UBound(Darr)
  Dic.Add Darr(i, 1), Darr(i, 2)
Next i
ActiveWorkbook.Close False
LastR = Range("A1040000").End(xlUp).Row
If LastR < 4 Then
    MsgBox ("Khong co du lieu, thoat chuong trinh"): Exit Sub
End If
Darr = Range("A4:A" & LastR).Value
ReDim Arr(1 To UBound(Darr), 1 To 1)
For i = 1 To UBound(Arr)
  Arr(i, 1) = Dic.Item(Darr(i, 1))
Next i
Range("B4").Resize(UBound(Arr)) = Arr
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Cảm ơn bạn HiếuCD nhưng mình test dữ liệu lớn khoảng 1.040.000 dòng thì cũng rất lâu nhưng khi gặp lỗi kg tìm thấy là báo không có dữ liệu và thoát chương trình, có cách nào khắc phục không bạn? và mình có nhiều hơn số dòng 1.040.000 thì mình làm thêm cột thì mình phải tìm bằng cách nào bạn giúp mình với ạ.
(mình up lại file ở #1 ạ)
 
Cảm ơn bạn HiếuCD nhưng mình test dữ liệu lớn khoảng 1.040.000 dòng thì cũng rất lâu nhưng khi gặp lỗi kg tìm thấy là báo không có dữ liệu và thoát chương trình, có cách nào khắc phục không bạn? và mình có nhiều hơn số dòng 1.040.000 thì mình làm thêm cột thì mình phải tìm bằng cách nào bạn giúp mình với ạ.
(mình up lại file ở #1 ạ)
bạn tìm trong code số 1040000 thay bằng số 1048576 xem sao
nếu nhiều hơn thì gởi lại file với ví dụ các cột dữ liệu
 
bạn tìm trong code số 1040000 thay bằng số 1048576 xem sao
nếu nhiều hơn thì gởi lại file với ví dụ các cột dữ liệu
Viết vầy được không anh HieuCD

Mã:
lastR = .Range("A" & .Rows.Count).End(xlUp).Row
    If .Range("A" & Rows.Count) <> "" Then lastR = lastR + 1 'Phòng trường hợp dòng cuối có dữ liệu
 
Viết vầy được không anh HieuCD

Mã:
lastR = .Range("A" & .Rows.Count).End(xlUp).Row
    If .Range("A" & Rows.Count) <> "" Then lastR = lastR + 1 'Phòng trường hợp dòng cuối có dữ liệu
mình thử rồi, với dữ liệu của file bắt đầu bằng ô A3, nếu tới dòng cuối của sheet có dữ liệu thì kết quả cũng không chính xác
dùng code sau có vẽ ổn
Mã:
lastR = Range("A3").CurrentRegion.RowS.Count + 2
chúc bạn 1 tối vui
 
Chào anh/chi, mình có dữ liệu lớn cần trích lọc nhưng vì file dữ liệu lớn quá có thể hơn 1.048.576 dòng nên mỗi lần mình dùng hàm vlookup để tra thì load rất là lâu, có cách nào dùng code tra và mở dữ liêu nhanh hơn không.
Một file dữ liệu gồm 2 cột : Mã số và tên
một file dùng để lọc mã số từ file dữ liệu đó
Cảm ơn anh/chi rất nhiều
Code này viết trích lọc trên 1 file
Bạn nạp dữ liệu 1tr dòng thử xem thế nào
Mã:
Sub vnlife()
Dim Phieu, NTT, KQ, r, i
Phieu = Sheet1.Range("A4", Sheet1.Range("A4").End(xlDown))
ReDim KQ(1 To UBound(Phieu), 1 To 1)
NTT = Sheet2.Range("A4", Sheet2.Range("B4").End(xlDown))
With CreateObject("scripting.Dictionary")
For r = 1 To UBound(Phieu)
.Item(Phieu(r, 1)) = ""
Next r
For r = 1 To UBound(NTT)
If .exists(NTT(r, 1)) = True Then
i = i + 1
KQ(i, 1) = NTT(r, 2)
End If
Next r
End With
Sheet1.Range("A4", Sheet1.Range("A4").End(xlDown)).Offset(, 1).ClearContents
Sheet1.Range("A4", Sheet1.Range("A4").End(xlDown)).Offset(, 1) = KQ
End Sub
Ngoài ra, nếu làm trên 1 file thì có thể dùng advanced filter cũng giải quyết được vấn đề tốc độ.
 

File đính kèm

Mình đã gửi lại file đính kèm vlookup ở #1 đó bạn hiếu. Bạn xem giúp mình.
 
Mình đã gửi lại file đính kèm vlookup ở #1 đó bạn hiếu. Bạn xem giúp mình.
 
Mình đã gửi lại file đính kèm vlookup ở #1 đó bạn hiếu. Bạn xem giúp mình.
bạn chạy thử code, trong đó nếu dữ liệu nguồn nếu nhiều thì nhập tiếp vào cột D và E, cùng hàng đầu cột A và B
Mã:
Sub Vlookup()
Dim Dic As Object, Darr(), Arr(), i As Long, LastKQ As Long, LastNg As Long
Application.DisplayAlerts = False
Application.ScreenUpdating = False
'On Error Resume Next
LastKQ = Range("A3").CurrentRegion.Rows.Count + 2
If LastKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  LastNg = .Range("A3").CurrentRegion.Rows.Count + 2
  If LastNg < 4 Then
    MsgBox ("Khong co du lieu nguon, thoat chuong trinh"): Exit Sub
  End If
  Darr = .Range("A4:B" & LastNg).Value
  For i = 1 To UBound(Darr)
    Dic.Add Darr(i, 1), Darr(i, 2)
  Next i
' du lieu nhieu, nhap them vao cot D va E
  LastNg = .Range("D3").CurrentRegion.Rows.Count + 2
  If LastNg >= 4 Then
    Darr = .Range("A4:B" & LastNg).Value
    For i = 1 To UBound(Darr)
      Dic.Add Darr(i, 1), Darr(i, 2)
    Next i
  End If
End With
ActiveWorkbook.Close False


Darr = Range("A4:A" & LastKQ).Value
ReDim Arr(1 To UBound(Darr), 1 To 1)
For i = 1 To UBound(Arr)
  Arr(i, 1) = Dic.Item(Darr(i, 1))
Next i
Range("B4").Resize(UBound(Arr)) = Arr
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 

File đính kèm

bạn chạy thử code, trong đó nếu dữ liệu nguồn nếu nhiều thì nhập tiếp vào cột D và E, cùng hàng đầu cột A và B
Mã:
Sub Vlookup()
Dim Dic As Object, Darr(), Arr(), i As Long, LastKQ As Long, LastNg As Long
Application.DisplayAlerts = False
Application.ScreenUpdating = False
'On Error Resume Next
LastKQ = Range("A3").CurrentRegion.Rows.Count + 2
If LastKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  LastNg = .Range("A3").CurrentRegion.Rows.Count + 2
  If LastNg < 4 Then
    MsgBox ("Khong co du lieu nguon, thoat chuong trinh"): Exit Sub
  End If
  Darr = .Range("A4:B" & LastNg).Value
  For i = 1 To UBound(Darr)
    Dic.Add Darr(i, 1), Darr(i, 2)
  Next i
' du lieu nhieu, nhap them vao cot D va E
  LastNg = .Range("D3").CurrentRegion.Rows.Count + 2
  If LastNg >= 4 Then
    Darr = .Range("A4:B" & LastNg).Value
    For i = 1 To UBound(Darr)
      Dic.Add Darr(i, 1), Darr(i, 2)
    Next i
  End If
End With
ActiveWorkbook.Close False


Darr = Range("A4:A" & LastKQ).Value
ReDim Arr(1 To UBound(Darr), 1 To 1)
For i = 1 To UBound(Arr)
  Arr(i, 1) = Dic.Item(Darr(i, 1))
Next i
Range("B4").Resize(UBound(Arr)) = Arr
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Mình vừa test thử bằng cách bỏ dữ liệu và cột D và E thì báo lỗi run time 457. Bạn Hiếu kiểm tra giúp mình với và mình có thử nếu nhỡ file dữ liệu có trùng dữ liệu thì khi chạy nó cũng báo lỗi như trên, bạn có thể code thêm nếu có trùng dữ liệu tìm kiếm tức có 2 dòng Mã giống nhau thì vẫn cho ra kq 1 trong 2 cái và nếu như tìm không có mã thì vẫn view ra cột tên trong file Phiếu ( view câu "khong co"). Cảm ơn bạn Hiếu nhiều lắm.
 
Mình vừa test thử bằng cách bỏ dữ liệu và cột D và E thì báo lỗi run time 457. Bạn Hiếu kiểm tra giúp mình với và mình có thử nếu nhỡ file dữ liệu có trùng dữ liệu thì khi chạy nó cũng báo lỗi như trên, bạn có thể code thêm nếu có trùng dữ liệu tìm kiếm tức có 2 dòng Mã giống nhau thì vẫn cho ra kq 1 trong 2 cái và nếu như tìm không có mã thì vẫn view ra cột tên trong file Phiếu ( view câu "khong co"). Cảm ơn bạn Hiếu nhiều lắm.
bạn chỉnh lại code
lưu ý chổ màu đỏ chỉ chọn 1 trong 2 và giống nhau của cả 2 đoạn lệnh
Mã:
Sub Vlookup()
Dim Dic As Object, Darr(), Arr(), i As Long, LastKQ As Long, LastNg As Long, Tmp
Application.DisplayAlerts = False
Application.ScreenUpdating = False
'On Error Resume Next
LastKQ = Range("A3").CurrentRegion.Rows.Count + 2
If LastKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  LastNg = .Range("A3").CurrentRegion.Rows.Count + 2
  If LastNg < 4 Then
    MsgBox ("Khong co du lieu nguon, thoat chuong trinh"): Exit Sub
  End If
  Darr = .Range("A4:B" & LastNg).Value
  For i = 1 To UBound(Darr)
    Tmp = Darr(i, 1)
'Ban chon mot trong 2 cách lay giá tri dau hoac cuoi, o 2 dong lenh duoi
[COLOR=#ff0000]    If Not Dic.exists(Tmp) Then Dic.Add Tmp, Darr(i, 2) 'Lay giá tri dau[/COLOR]
[COLOR=#ff0000]    'Dic.Item(Tmp) = Darr(i, 2) 'Lay gia tri cuoi[/COLOR]
  Next i
' du lieu nhieu, nhap them vao cot D va E
  LastNg = .Range("D3").CurrentRegion.Rows.Count + 2
  If LastNg >= 4 Then
    Darr = .Range("D4:E" & LastNg).Value
    For i = 1 To UBound(Darr)
      Tmp = Darr(i, 1)
'Ban chon mot trong 2 cách lay giá tri o 2 dong lenh duoi
[COLOR=#ff0000]      If Not Dic.exists(Tmp) Then Dic.Add Tmp, Darr(i, 2) 'Lay giá tri dau[/COLOR]
[COLOR=#ff0000]      'Dic.Item(Tmp) = Darr(i, 2) 'Lay gia tri cuoi[/COLOR]
    Next i
  End If
End With
ActiveWorkbook.Close False


Darr = Range("A4:A" & LastKQ).Value
ReDim Arr(1 To UBound(Darr), 1 To 1)
For i = 1 To UBound(Arr)
  Tmp = Darr(i, 1)
  If Dic.exists(Tmp) Then
    Arr(i, 1) = Dic.Item(Darr(i, 1))
  Else
    Arr(i, 1) = "Khong Co"
  End If
Next i
Range("B4").Resize(UBound(Arr)) = Arr
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
bạn chỉnh lại code
lưu ý chổ màu đỏ chỉ chọn 1 trong 2 và giống nhau của cả 2 đoạn lệnh
Mã:
Sub Vlookup()
Dim Dic As Object, Darr(), Arr(), i As Long, LastKQ As Long, LastNg As Long, Tmp
Application.DisplayAlerts = False
Application.ScreenUpdating = False
'On Error Resume Next
LastKQ = Range("A3").CurrentRegion.Rows.Count + 2
If LastKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  LastNg = .Range("A3").CurrentRegion.Rows.Count + 2
  If LastNg < 4 Then
    MsgBox ("Khong co du lieu nguon, thoat chuong trinh"): Exit Sub
  End If
  Darr = .Range("A4:B" & LastNg).Value
  For i = 1 To UBound(Darr)
    Tmp = Darr(i, 1)
'Ban chon mot trong 2 cách lay giá tri dau hoac cuoi, o 2 dong lenh duoi
[COLOR=#ff0000]    If Not Dic.exists(Tmp) Then Dic.Add Tmp, Darr(i, 2) 'Lay giá tri dau[/COLOR]
[COLOR=#ff0000]    'Dic.Item(Tmp) = Darr(i, 2) 'Lay gia tri cuoi[/COLOR]
  Next i
' du lieu nhieu, nhap them vao cot D va E
  LastNg = .Range("D3").CurrentRegion.Rows.Count + 2
  If LastNg >= 4 Then
    Darr = .Range("D4:E" & LastNg).Value
    For i = 1 To UBound(Darr)
      Tmp = Darr(i, 1)
'Ban chon mot trong 2 cách lay giá tri o 2 dong lenh duoi
[COLOR=#ff0000]      If Not Dic.exists(Tmp) Then Dic.Add Tmp, Darr(i, 2) 'Lay giá tri dau[/COLOR]
[COLOR=#ff0000]      'Dic.Item(Tmp) = Darr(i, 2) 'Lay gia tri cuoi[/COLOR]
    Next i
  End If
End With
ActiveWorkbook.Close False


Darr = Range("A4:A" & LastKQ).Value
ReDim Arr(1 To UBound(Darr), 1 To 1)
For i = 1 To UBound(Arr)
  Tmp = Darr(i, 1)
  If Dic.exists(Tmp) Then
    Arr(i, 1) = Dic.Item(Darr(i, 1))
  Else
    Arr(i, 1) = "Khong Co"
  End If
Next i
Range("B4").Resize(UBound(Arr)) = Arr
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Cảm ơn bạn Hiếu, code bạn chạy ok nhưng khi chạy với nhiều dòng thì bấm run phải đợi gần 3 phút mới ra kết quả, bởi vậy nên khi chạy code cảm giác như đang bị "treo" exel, bạn Hiếu có thể code khi bấm chạy hiện thông báo đang thực hiện, vui lòng đợi, và có thể chạy thêm tiến trình phần trăm hoàn thành để mình biết khi tiến trình hoàn thành lệnh được không ạ. Cảm ơn bạn nhiều.
 
Cảm ơn bạn Hiếu, code bạn chạy ok nhưng khi chạy với nhiều dòng thì bấm run phải đợi gần 3 phút mới ra kết quả, bởi vậy nên khi chạy code cảm giác như đang bị "treo" exel, bạn Hiếu có thể code khi bấm chạy hiện thông báo đang thực hiện, vui lòng đợi, và có thể chạy thêm tiến trình phần trăm hoàn thành để mình biết khi tiến trình hoàn thành lệnh được không ạ. Cảm ơn bạn nhiều.
vụ % nầy mình không rành, chỉ hiện thông báo thôi
 

File đính kèm

Hiện thông báo cũng được bạn ạ. bạn giúp mình code với.
 
Cảm ơn bạn Hiếu, code bạn chạy ok nhưng khi chạy với nhiều dòng thì bấm run phải đợi gần 3 phút mới ra kết quả, bởi vậy nên khi chạy code cảm giác như đang bị "treo" exel, bạn Hiếu có thể code khi bấm chạy hiện thông báo đang thực hiện, vui lòng đợi, và có thể chạy thêm tiến trình phần trăm hoàn thành để mình biết khi tiến trình hoàn thành lệnh được không ạ. Cảm ơn bạn nhiều.

Thử code mới (vẫn dựa chính trên code của bác HieuCD, nên tên file và bố trí dữ liệu vẫn vậy) này với dữ liệu lớn xem có nhanh lên không

hiện file kèm để cả 2 code

code cũ - sao xanh - chạy cho thời gian ở C1
code mới - sao vàng - chạy cho thời gian ở D1

Bạn thử chạy xem có cải thiện tốc độ chút nào không ? có tới 3 phút không? so sánh xem

Sau đó nếu cần thì gắn % thêm sau
 

File đính kèm

Thử code mới (vẫn dựa chính trên code của bác HieuCD, nên tên file và bố trí dữ liệu vẫn vậy) này với dữ liệu lớn xem có nhanh lên không

hiện file kèm để cả 2 code

code cũ - sao xanh - chạy cho thời gian ở C1
code mới - sao vàng - chạy cho thời gian ở D1

Bạn thử chạy xem có cải thiện tốc độ chút nào không ? có tới 3 phút không? so sánh xem

Sau đó nếu cần thì gắn % thêm sau
Cảm ơn bạn winvista, mình vừa chạy code bạn và đúng là nhanh hơn đáng kể: 251s vs 23s. Bạn giúp mình gắn % với ạ. Cảm ơn bạn winvista và bạn Hiếu nhiều lắm.
 
Cảm ơn bạn winvista, mình vừa chạy code bạn và đúng là nhanh hơn đáng kể: 251s vs 23s. Bạn giúp mình gắn % với ạ. Cảm ơn bạn winvista và bạn Hiếu nhiều lắm.

Đã gắn ProgressBar % . Nó sẽ làm chậm chương trình đi 1 chút đó,

Nếu vẫn thích thì lấy cái file kèm này, nhưng tôi nghĩ 23s là đợi tốt
 

File đính kèm

Lần chỉnh sửa cuối:
Ah, tôi chưa xóa bỏ cái hình chữ nhật của HieuCD cũ, bạn thực hiện xóa như sau

trong file Phieu
- bấm F5 -> chọn Special.. -> chọn Objetct -->OK
- giữ Shift bỏ chọn 2 ngôi sao xanh và vàng
- bấm Delete để xóa hình chữ nhật ẩn đó đi
cho nhẹ file
 
Bạn winvista ơi, mình vửa test lại, code của bạn cho ra kết quả thiếu nếu như cột A của sheet Phieu có 2 số trùng thì nó chỉ hiện ra cuối thôi. bạn xem lại giúp mình
 
Mình muốn lấy luôn bạn ah nếu file Phieu có gì thì cũng view đầy đủ dùng trùng dữ liệu. code của bạn hiếu hôm trước là trường hợp file dữ liệu trùng thì chọn 1 trong 2, còn file kết quả (phiếu) mình cần lấy hết bạn ah.
 
Mình muốn lấy luôn bạn ah nếu file Phieu có gì thì cũng view đầy đủ dùng trùng dữ liệu. code của bạn hiếu hôm trước là trường hợp file dữ liệu trùng thì chọn 1 trong 2, còn file kết quả (phiếu) mình cần lấy hết bạn ah.

xem file kèm, đã sửa,
hoặc cứ dùng cái của HieuCD vẫn có trong file đó,
tất cả đều có tiến trình %
 

File đính kèm

Lần chỉnh sửa cuối:
Mình vừa chạy nếu như file phiếu có nhiều dòng thì báo lỗi run time 9.. subscript out of range, bạn xem sửa giúp mình với ạ.
 
Chào anh/chi, mình có dữ liệu lớn cần trích lọc nhưng vì file dữ liệu lớn quá có thể hơn 1.048.576 dòng nên mỗi lần mình dùng hàm vlookup để tra thì load rất là lâu, có cách nào dùng code tra và mở dữ liêu nhanh hơn không.
Một file dữ liệu gồm 2 cột : Mã số và tên
một file dùng để lọc mã số từ file dữ liệu đó
Cảm ơn anh/chi rất nhiều

Để cải tiến tốc độ file excel lớn của bạn thì không nên dùng các hàm tìm kiếm, kể cả thay thế bằng VBA. Hãy dùng SQL và nhập liệu nâng cao thay thế.
 
Dùng sql như thế nào vậy bạn Nguyên Duy Tuấn? bạn giúp mình với.
 
Mình vừa chạy nếu như file phiếu có nhiều dòng thì báo lỗi run time 9.. subscript out of range, bạn xem sửa giúp mình với ạ.
uhm, đây file mới này thử còn sai không

SQL: thì bỏ lun excel đi nhé, dùng làm gì excel nữa, nhưng ... vấn đề là nhưng...
 

File đính kèm

File phieu trên 50 dòng là báo lỗi liền bạn ah. Bạn xen lại giúp mình
 
Dùng sql như thế nào vậy bạn Nguyên Duy Tuấn? bạn giúp mình với.

Sử dụng SQL trong Excel là một phương pháp rất mới với người làm Excel thuần tuý vì trong Excel không có công cụ và hàm mạnh để làm tốt việc này. Với người biết ít về Excel nhưng biết chút về IT với SQL thì thường không nhận ra điều tuyệt vời khi kết hợp gữa Excel và SQL. Tôi chia sẻ bạn bài học đầu tiên tôi dạy về sql trong Excel và báo cáo động. Trong video này tôi cũng phân tích vì sao Excel với công thức thông thường chạy chậm.

[video=youtube;OIECCAJP7UA]https://www.youtube.com/watch?v=OIECCAJP7UA&list=PLZi2tdQERHM09nzkoiavJO4pHcED1NmOQ&index=4[/video]
 
Lần chỉnh sửa cuối:
Xem nhanh ví dụ
[video=youtube;NlPP4jzkWOY]https://www.youtube.com/watch?v=NlPP4jzkWOY[/video]
 
err.jpg
có thể file dư liệu bạn nhỏ, còn file mình hơn 1tr dòng, mình chạy báo lỗi vậy, bạn xem giúp mình
 
uhm, khi phiếu có nhiều mã trùng thì dẫn đến bị lỗi vậy. Thay bằng cái này

Không hiểu bài toán gốc của bạn sao, tại sao phiếu lại có nhiều mã trùng vậy
 

File đính kèm

Bạn xem lại giúp mình, bị sai khi dữ liệu cần tìm có nằm trong 2 cột D và E. Bạn thêm code giúp mình vài cột nữa trong file dữ liệu: G:H ; J:K ; M:N . Cảm ơn bạn.
uhm, khi phiếu có nhiều mã trùng thì dẫn đến bị lỗi vậy. Thay bằng cái này

Không hiểu bài toán gốc của bạn sao, tại sao phiếu lại có nhiều mã trùng vậy
 
bạn chạy thử code nầy xem có nhanh hơn không
Mã:
Sub Vlookup()
Dim DRng As Range, SRng As Range, Rng As Range, Arr(), Dic As Object, i As Long, LastKQ As Long, LastR As Long, LastC As Integer, Tmp
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
LastKQ = Range("A3").CurrentRegion.Rows.Count + 2
If LastKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Set SRng = Range("A4:A" & LastKQ)
ReDim Arr(1 To SRng.Rows.Count, 1 To 1)
Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  LastR = .Range("A3").CurrentRegion.Rows.Count + 2
  If LastR < 4 Then
    MsgBox ("Khong co du lieu nguon, thoat chuong trinh"): Exit Sub
  End If
  LastC = Range("XX4").End(xlToLeft).Column
  For j = 1 To LastC Step 3
    Set DRng = Range(Cells(1, j), Cells(LastR, j))
    If k > 0 Then
      n = 0
      For i = 1 To k
        Set Rng = DRng.Find(SRng(Dic.Item(i), 1), DRng(3, 1), xlValues, xlWhole)
        If Not Rng Is Nothing Then
          Arr(Dic.Item(i), 1) = DRng(Rng.Row, 2).Value
        Else
          n = n + 1
          Dic.Item(n) = Dic.Item(i)
        End If
      Next i
      If n = 0 Then Exit For
      k = n
    Else
      For i = 1 To UBound(Arr)
        Set Rng = DRng.Find(SRng(i, 1), DRng(3, 1), xlValues, xlWhole)
        If Not Rng Is Nothing Then
          Arr(i, 1) = DRng(Rng.Row, 2).Value
        Else
          k = k + 1
          Dic.Item(k) = i
          Arr(i, 1) = "Khong tim thay du lieu"
        End If
      Next i
      If k = 0 Then Exit For
    End If
  Next j
End With
ActiveWorkbook.Close False
Range("B4").Resize(UBound(Arr)) = Arr
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Code này chạy là treo cứng luôn bạn Hiếu ơi.
bạn chạy thử code nầy xem có nhanh hơn không
Mã:
Sub Vlookup()
Dim DRng As Range, SRng As Range, Rng As Range, Arr(), Dic As Object, i As Long, LastKQ As Long, LastR As Long, LastC As Integer, Tmp
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
LastKQ = Range("A3").CurrentRegion.Rows.Count + 2
If LastKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Set SRng = Range("A4:A" & LastKQ)
ReDim Arr(1 To SRng.Rows.Count, 1 To 1)
Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  LastR = .Range("A3").CurrentRegion.Rows.Count + 2
  If LastR < 4 Then
    MsgBox ("Khong co du lieu nguon, thoat chuong trinh"): Exit Sub
  End If
  LastC = Range("XX4").End(xlToLeft).Column
  For j = 1 To LastC Step 3
    Set DRng = Range(Cells(1, j), Cells(LastR, j))
    If k > 0 Then
      n = 0
      For i = 1 To k
        Set Rng = DRng.Find(SRng(Dic.Item(i), 1), DRng(3, 1), xlValues, xlWhole)
        If Not Rng Is Nothing Then
          Arr(Dic.Item(i), 1) = DRng(Rng.Row, 2).Value
        Else
          n = n + 1
          Dic.Item(n) = Dic.Item(i)
        End If
      Next i
      If n = 0 Then Exit For
      k = n
    Else
      For i = 1 To UBound(Arr)
        Set Rng = DRng.Find(SRng(i, 1), DRng(3, 1), xlValues, xlWhole)
        If Not Rng Is Nothing Then
          Arr(i, 1) = DRng(Rng.Row, 2).Value
        Else
          k = k + 1
          Dic.Item(k) = i
          Arr(i, 1) = "Khong tim thay du lieu"
        End If
      Next i
      If k = 0 Then Exit For
    End If
  Next j
End With
ActiveWorkbook.Close False
Range("B4").Resize(UBound(Arr)) = Arr
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Code này chạy là treo cứng luôn bạn Hiếu ơi.
chạy code nầy xem sao? không được là bỏ của chạy lấy người
Mã:
Sub Vlookup()
Dim Darr(), Sarr(), Arr(), Dic As Object, i As Long, RKQ As Long, R As Long, C As Integer, Tmp As String
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
RKQ = Range("A3").CurrentRegion.Rows.Count - 1
If RKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("A4").Resize(RKQ).Value
ReDim Arr(1 To RKQ, 1 To 1)
For i = 1 To RKQ
  Tmp = Sarr(i, 1)
  If Not Dic.exists(Tmp) Then
    Dic.Add Tmp, 1
    Dic.Add Tmp & "#" & 1, i
  Else
    k = Dic.Item(Tmp) + 1
    Dic.Item(Tmp) = k
    Dic.Add Tmp & "#" & k, i
  End If
Next i


Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  C = .Range("XX4").End(xlToLeft).Column
  R = .Range("A3").CurrentRegion.Rows.Count - 1
  Darr = .Range("A4").Resize(R, C).Value
End With
ActiveWorkbook.Close False
For j = 1 To C Step 3
  For i = 1 To R
    Tmp = Darr(i, j)
    If Tmp = "" Then Exit For
    If Dic.exists(Tmp) Then
      For k = 1 To Dic.Item(Tmp)
        n = n + 1
        Arr(Dic.Item(Darr(i, j) & "#" & k), 1) = Darr(i, j + 1)
      Next k
      If n = RKQ Then GoTo Thoat
    End If
  Next i
Next j
Thoat:
Range("B4").Resize(RKQ) = Arr
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Bạn xem lại giúp mình, bị sai khi dữ liệu cần tìm có nằm trong 2 cột D và E. Bạn thêm code giúp mình vài cột nữa trong file dữ liệu: G:H ; J:K ; M:N . Cảm ơn bạn.

Chú lần sau: bạn yêu cầu mọi thứ rõ ràng từ đầu nhé, cứ thêm thế này thì mệt mọi người giúp, và hăng hái quan tâm đến vấn đề của mình lên (cứ chìm xuồng khi mọi người bàn và hỏi lại)

Xem file gửi kèm có đủ các thứ rồi đó, không hạn chế cặp cột số liệu ở file DULIEU sao cho đúng form A,B, D,E, G,H, J,K....
 

File đính kèm

chạy code nầy xem sao? không được là bỏ của chạy lấy người
Mã:
Sub Vlookup()
Dim Darr(), Sarr(), Arr(), Dic As Object, i As Long, RKQ As Long, R As Long, C As Integer, Tmp As String
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
RKQ = Range("A3").CurrentRegion.Rows.Count - 1
If RKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("A4").Resize(RKQ).Value
ReDim Arr(1 To RKQ, 1 To 1)
For i = 1 To RKQ
  Tmp = Sarr(i, 1)
  If Not Dic.exists(Tmp) Then
    Dic.Add Tmp, 1
    Dic.Add Tmp & "#" & 1, i
  Else
    k = Dic.Item(Tmp) + 1
    Dic.Item(Tmp) = k
    Dic.Add Tmp & "#" & k, i
  End If
Next i


Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  C = .Range("XX4").End(xlToLeft).Column
  R = .Range("A3").CurrentRegion.Rows.Count - 1
  Darr = .Range("A4").Resize(R, C).Value
End With
ActiveWorkbook.Close False
For j = 1 To C Step 3
  For i = 1 To R
    Tmp = Darr(i, j)
    If Tmp = "" Then Exit For
    If Dic.exists(Tmp) Then
      For k = 1 To Dic.Item(Tmp)
        n = n + 1
        Arr(Dic.Item(Darr(i, j) & "#" & k), 1) = Darr(i, j + 1)
      Next k
      If n = RKQ Then GoTo Thoat
    End If
  Next i
Next j
Thoat:
Range("B4").Resize(RKQ) = Arr
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Code này đổi thuật toán --> cho phép tốc độ cải thiện đáng kể.
 
Cảm ơn bạn Hiếu code chạy nhanh hơn rất nhiều.
chạy code nầy xem sao? không được là bỏ của chạy lấy người
Mã:
Sub Vlookup()
Dim Darr(), Sarr(), Arr(), Dic As Object, i As Long, RKQ As Long, R As Long, C As Integer, Tmp As String
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
RKQ = Range("A3").CurrentRegion.Rows.Count - 1
If RKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("A4").Resize(RKQ).Value
ReDim Arr(1 To RKQ, 1 To 1)
For i = 1 To RKQ
  Tmp = Sarr(i, 1)
  If Not Dic.exists(Tmp) Then
    Dic.Add Tmp, 1
    Dic.Add Tmp & "#" & 1, i
  Else
    k = Dic.Item(Tmp) + 1
    Dic.Item(Tmp) = k
    Dic.Add Tmp & "#" & k, i
  End If
Next i


Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  C = .Range("XX4").End(xlToLeft).Column
  R = .Range("A3").CurrentRegion.Rows.Count - 1
  Darr = .Range("A4").Resize(R, C).Value
End With
ActiveWorkbook.Close False
For j = 1 To C Step 3
  For i = 1 To R
    Tmp = Darr(i, j)
    If Tmp = "" Then Exit For
    If Dic.exists(Tmp) Then
      For k = 1 To Dic.Item(Tmp)
        n = n + 1
        Arr(Dic.Item(Darr(i, j) & "#" & k), 1) = Darr(i, j + 1)
      Next k
      If n = RKQ Then GoTo Thoat
    End If
  Next i
Next j
Thoat:
Range("B4").Resize(RKQ) = Arr
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Bạn kiểm tra lại giúp mình, nếu như gặp trường hợp tra mã bên data bị bỏ trống một ô thì kết quả kiểm tra nhảy sai và rất nhiều mã không cho ra kết quả. Cam on ban.
 
Bạn kiểm tra lại giúp mình, nếu như gặp trường hợp tra mã bên data bị bỏ trống một ô thì kết quả kiểm tra nhảy sai và rất nhiều mã không cho ra kết quả. Cam on ban.

"Bạn"=? là ai?
Data là ở file DULIEU? hay ở đâu?
Hỏi ai, bài nào code nào thì cần trích dẫn lại.

Chữ đỏ cần viết thận trọng nhất thì lại qua loa, đúng là cám dành cho heo và ơn ... dành cho ....
 
Lần chỉnh sửa cuối:
Bạn winvista và bạn hiếu. DATA là file dữ liệu bạn, vài ngày nay mình ktra chạy đúng, nhưng với điều kiện là cột mã file dữ liệu kg bị trống một ô nào đó, này mình tạm khắc phục bằng cách kiểm tra lại có cột nào trống kg mình thêm vào, nhưng hôm nay mình vừa phát hiện ra là nếu mình gõ bằng tay vào cột mã file dulieu thì code của winvista kg tìm thấy nhưng code bạn hiếu lại tìm thấy và đúng. còn code bạn hiếu thì mỗi lần tìm kiếm xong dòng cuối cùng nó lại thêm vài dòng ở dưới cho dù dòng đó kg có mã để dò.
"Bạn"=? là ai?
Data là ở file DULIEU? hay ở đâu?
Hỏi ai, bài nào code nào thì cần trích dẫn lại.

Chữ đỏ cần viết thận trọng nhất thì lại qua loa, đúng là cám dành cho heo và ơn ... dành cho ....
 
Bạn winvista và bạn hiếu. DATA là file dữ liệu bạn, vài ngày nay mình ktra chạy đúng, nhưng với điều kiện là cột mã file dữ liệu kg bị trống một ô nào đó, này mình tạm khắc phục bằng cách kiểm tra lại có cột nào trống kg mình thêm vào, nhưng hôm nay mình vừa phát hiện ra là nếu mình gõ bằng tay vào cột mã file dulieu thì code của winvista kg tìm thấy nhưng code bạn hiếu lại tìm thấy và đúng. còn code bạn hiếu thì mỗi lần tìm kiếm xong dòng cuối cùng nó lại thêm vài dòng ở dưới cho dù dòng đó kg có mã để dò.

Không hiểu bạn nói gì. Nếu trống đã điền vào thì sẽ có kết quả như ý
tại sao Data ở DULIEU lại không liên tục, lại có dòng trống vậy?
 
Trống do lỗi nhập liệu từ ứng dụng, nhưng lỗi trống mình đã nhập vào rồi nhưng code bạn vẫn phát sinh lỗi nếu như trong mã file PHIEU, nếu nhập tay vào thì dòng mã đó tìm kg ra, cho kết quả trống. bạn xem giúp mình.
Không hiểu bạn nói gì. Nếu trống đã điền vào thì sẽ có kết quả như ý
tại sao Data ở DULIEU lại không liên tục, lại có dòng trống vậy?
 
Trống do lỗi nhập liệu từ ứng dụng, nhưng lỗi trống mình đã nhập vào rồi nhưng code bạn vẫn phát sinh lỗi nếu như trong mã file PHIEU, nếu nhập tay vào thì dòng mã đó tìm kg ra, cho kết quả trống. bạn xem giúp mình.

Bạn kiệm lời quá, muốn giúp cũng khó.

+ gõ tay ở file "Phieu.." bạn phải lưu ý là mã là dạng text có số 0 ở đâu, nên khi gõ phải thêm dấu nháy trên ví dụ: '0100100061
vì không có excel sẽ hiểu là number và bỏ số 0 ===> không trùng mã nào nên kết quả trống

+ lần sau bạn nên nói chi tiết, hình ảnh, file số liệu kèm đê minh họa, không có sao mà hiểu
 
Mình gõ số không có số 0 ở đầu bạn ah mà nó tìm cũng kg ra luôn.
Bạn kiệm lời quá, muốn giúp cũng khó.

+ gõ tay ở file "Phieu.." bạn phải lưu ý là mã là dạng text có số 0 ở đâu, nên khi gõ phải thêm dấu nháy trên ví dụ: '0100100061
vì không có excel sẽ hiểu là number và bỏ số 0 ===> không trùng mã nào nên kết quả trống

+ lần sau bạn nên nói chi tiết, hình ảnh, file số liệu kèm đê minh họa, không có sao mà hiểu
 
Bạn winvista và bạn hiếu. DATA là file dữ liệu bạn, vài ngày nay mình ktra chạy đúng, nhưng với điều kiện là cột mã file dữ liệu kg bị trống một ô nào đó, này mình tạm khắc phục bằng cách kiểm tra lại có cột nào trống kg mình thêm vào, nhưng hôm nay mình vừa phát hiện ra là nếu mình gõ bằng tay vào cột mã file dulieu thì code của winvista kg tìm thấy nhưng code bạn hiếu lại tìm thấy và đúng. còn code bạn hiếu thì mỗi lần tìm kiếm xong dòng cuối cùng nó lại thêm vài dòng ở dưới cho dù dòng đó kg có mã để dò.
thêm vài dòng đưới có lẽ bạn nhập thêm ở dòng 1 và 2 dữ liệu gì đó
bạn chạy lại code đã điều chỉnh dòng và có thể tăng thêm tốc độ xử lý
Mã:
Sub Vlookup()
Dim Darr(), Sarr(), Arr(), R(), Dic As Object, i As Long, RKQ As Long
Dim C As Integer, j As Integer, k As Integer, Tmp As String
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
If Range("A1048576") <> "" Then
  RKQ = 1048576 - 3
Else
  RKQ = Range("A1048576").End(xlUp).Row - 3
End If
If RKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("A4").Resize(RKQ).Value
ReDim Arr(1 To RKQ, 1 To 1)
For i = 1 To RKQ
  Tmp = Sarr(i, 1)
  If Tmp <> "" Then
    If Not Dic.exists(Tmp) Then
      Dic.Add Tmp, 1
      Dic.Add Tmp & "#" & 1, i
    Else
      k = Dic.Item(Tmp) + 1
      Dic.Item(Tmp) = k
      Dic.Add Tmp & "#" & k, i
    End If
  End If
Next i


Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  C = .Range("XX4").End(xlToLeft).Column
  ReDim R(1 To C)
  For j = 1 To C Step 3
    If .Cells(1048576, j) <> "" Then
      R(j) = 1048576 - 3
    Else
      R(j) = .Cells(1048576, j).End(xlUp).Row - 3
    End If
  Next j
  Darr = .Range("A4").Resize(R(1), C).Value
End With
ActiveWorkbook.Close False
For j = 1 To C Step 3
  For i = 1 To R(j)
    Tmp = Darr(i, j)
    If Dic.exists(Tmp) Then
      For k = 1 To Dic.Item(Tmp)
        n = n + 1
        Arr(Dic.Item(Darr(i, j) & "#" & k), 1) = Darr(i, j + 1)
      Next k
      Dic.Remove (Tmp)
      If n = RKQ Then GoTo Thoat
    End If
  Next i
Next j
Thoat:
Range("B4").Resize(RKQ) = Arr
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Mình vừa test code hiện tại chạy đúng chưa thấy lỗi. cảm ơn bạn Hiếu

Mình vừa test code hiện tại chạy đúng chưa thấy lỗi. cảm ơn bạn Hiếu
thêm vài dòng đưới có lẽ bạn nhập thêm ở dòng 1 và 2 dữ liệu gì đó
bạn chạy lại code đã điều chỉnh dòng và có thể tăng thêm tốc độ xử lý
Mã:
Sub Vlookup()
Dim Darr(), Sarr(), Arr(), R(), Dic As Object, i As Long, RKQ As Long
Dim C As Integer, j As Integer, k As Integer, Tmp As String
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = True
Application.DisplayAlerts = False
Application.ScreenUpdating = False
If Range("A1048576") <> "" Then
  RKQ = 1048576 - 3
Else
  RKQ = Range("A1048576").End(xlUp).Row - 3
End If
If RKQ < 4 Then
    MsgBox ("Khong co du lieu Ma de lay ten, thoat chuong trinh"): Exit Sub
End If
Set Dic = CreateObject("scripting.dictionary")
Sarr = Range("A4").Resize(RKQ).Value
ReDim Arr(1 To RKQ, 1 To 1)
For i = 1 To RKQ
  Tmp = Sarr(i, 1)
  If Tmp <> "" Then
    If Not Dic.exists(Tmp) Then
      Dic.Add Tmp, 1
      Dic.Add Tmp & "#" & 1, i
    Else
      k = Dic.Item(Tmp) + 1
      Dic.Item(Tmp) = k
      Dic.Add Tmp & "#" & k, i
    End If
  End If
Next i


Workbooks.Open Filename:=ThisWorkbook.Path & "\DULIEU.XLSX", ReadOnly:=True
With ActiveWorkbook.Sheets("NNT")
  C = .Range("XX4").End(xlToLeft).Column
  ReDim R(1 To C)
  For j = 1 To C Step 3
    If .Cells(1048576, j) <> "" Then
      R(j) = 1048576 - 3
    Else
      R(j) = .Cells(1048576, j).End(xlUp).Row - 3
    End If
  Next j
  Darr = .Range("A4").Resize(R(1), C).Value
End With
ActiveWorkbook.Close False
For j = 1 To C Step 3
  For i = 1 To R(j)
    Tmp = Darr(i, j)
    If Dic.exists(Tmp) Then
      For k = 1 To Dic.Item(Tmp)
        n = n + 1
        Arr(Dic.Item(Darr(i, j) & "#" & k), 1) = Darr(i, j + 1)
      Next k
      Dic.Remove (Tmp)
      If n = RKQ Then GoTo Thoat
    End If
  Next i
Next j
Thoat:
Range("B4").Resize(RKQ) = Arr
'Sheets("Phieu").Shapes("Rounded Rectangle 1").Visible = False
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
 
Bạn xem lại code giúp mình, nếu bị trường hợp gặp một dòng trống trong file phieu thì nó dừng kg chạy nữa. và nếu gõ mã vào có khi nó tìm được có khi kg tìm đc bạn ah, mình gõ kg có số 0 ở trước. Và trước khi tìm thì xóa dữ liệu dò trước đó đi. Cảm ơn bạn
Không hiểu bạn nói gì. Nếu trống đã điền vào thì sẽ có kết quả như ý
tại sao Data ở DULIEU lại không liên tục, lại có dòng trống vậy?
 
Lần chỉnh sửa cuối:
Bạn xem lại code giúp mình, nếu bị trường hợp gặp một dòng trống trong file phieu thì nó dừng kg chạy nữa. và nếu gõ mã vào có khi nó tìm được có khi kg tìm đc bạn ah, mình gõ kg có số 0 ở trước. Và trước khi tìm thì xóa dữ liệu dò trước đó đi. Cảm ơn bạn

* Chú ý dòng đỏ sau
Bạn kiệm lời quá, muốn giúp cũng khó.

+ gõ tay ở file "Phieu.." bạn phải lưu ý là mã là dạng text có số 0 ở đâu, nên khi gõ phải thêm dấu nháy trên ví dụ: '0100100061
vì không có excel sẽ hiểu là number và bỏ số 0 ===> không trùng mã nào nên kết quả trống

+ lần sau bạn nên nói chi tiết, hình ảnh, file số liệu kèm đê minh họa, không có sao mà hiểu
muốn có kết quả tra được thì mã ở PHIEU phải giống mã bên DULIEU, không giống thì tất nhiên không có kết quả

* Không hiểu câu màu xanh này là sao?
Bạn xem lại code giúp mình, nếu bị trường hợp gặp một dòng trống trong file phieu thì nó dừng kg chạy nữa. và nếu gõ mã vào có khi nó tìm được có khi kg tìm đc bạn ah, mình gõ kg có số 0 ở trước. Và trước khi tìm thì xóa dữ liệu dò trước đó đi. Cảm ơn bạn


* Có code trên của HieuCD (code này đã cải thiện tốc đô rùi) chưa thỏa mãn yêu cầu của bạn sao? Nếu rui cần chi code nữa
 
Lần chỉnh sửa cuối:
Mình biết vấn để số 0 ở trước cho nên nếu như mình muốn test số 0 thì thêm dấu nháy ' roi, nhưng vấn đề mình hỏi là mình gõ và tìm số không có số '0 trước vẫn kg tìm ra kết quả nhưng cũng có trường hợp mình gõ vào lại tìm được kq, chính vì vậy nên mình test đủ kiểu để cho ra kq đúng như ý, và cũng vì muốn đc kết quả chính xác nên mình phải dùng cả 2 code chạy và so kq chứ mỗi lần chạy kq cả hơn 5000 dòng kg ktra hết đc bạn ah.
* Chú ý dòng đỏ sau

muốn có kết quả tra được thì mã ở PHIEU phải giống mã bên DULIEU, không giống thì tất nhiên không có kết quả

* Không hiểu câu màu xanh này là sao?



* Có code trên của HieuCD (code này đã cải thiện tốc đô rùi) chưa thỏa mãn yêu cầu của bạn sao? Nếu rui cần chi code nữa
 
Mình biết vấn để số 0 ở trước cho nên nếu như mình muốn test số 0 thì thêm dấu nháy ' roi, nhưng vấn đề mình hỏi là mình gõ và tìm số không có số '0 trước vẫn kg tìm ra kết quả nhưng cũng có trường hợp mình gõ vào lại tìm được kq, chính vì vậy nên mình test đủ kiểu để cho ra kq đúng như ý, và cũng vì muốn đc kết quả chính xác nên mình phải dùng cả 2 code chạy và so kq chứ mỗi lần chạy kq cả hơn 5000 dòng kg ktra hết đc bạn ah.

Rất tiếc , bạn nói không có file minh họa nên tôi chỉ biết phán thôi, tóm lại bạn phải nhập mã giống hệt mã trong DULIEU thì mới có kết quả
 
Trả về khổ chủ

đầy đủ cả
+ dòng trống ở cả DULIEU, và PHIEU
+ xet số 0 hay không số 0 (nếu bỏ tích chọn cái này, thì chương trình chạy nhanh hơn chút)
vv
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn xem file này, mình gõ nhưng có mã thì tra ra, mã kg tra ra
http://www.mediafire.com/file/qmidu80ao7d97ib/Vloopup_error+go.rar

2 mã này
[TABLE="width: 142"]
[TR]
[TD]2300109989[/TD]
[/TR]
[TR]
[TD]2400112537[/TD]
[/TR]
[/TABLE]
có trong FILE dữ liệu đâu mà có kết quả??? bạn phải tự search xem trong DULIEU có hay không thì mới đúng

thử gõ
[TABLE="width: 142"]
[TR]
[TD="class: xl66, width: 142, align: right"]2016131277[/TD]
[/TR]
[/TABLE]

sẽ có kết quả
 
2 file mới đây bạn ơi và mình phát hiện ra rằng nếu như file dữ liệu mình gõ và file phiếu mình gõ sẽ ra kq đúng, còn nếu như file dữ liệu mình copy nhưng file phiếu mình gõ sẽ kg ra kq.
http://www.mediafire.com/file/82cccgtacjt1m2w/go+loi.rar
2 mã này
[TABLE="width: 142"]
[TR]
[TD]2300109989[/TD]
[/TR]
[TR]
[TD]2400112537[/TD]
[/TR]
[/TABLE]
có trong FILE dữ liệu đâu mà có kết quả??? bạn phải tự search xem trong DULIEU có hay không thì mới đúng

thử gõ
[TABLE="width: 142"]
[TR]
[TD="class: xl66, width: 142, align: right"]2016131277[/TD]
[/TR]
[/TABLE]

sẽ có kết quả
 
Thử cái mới này xem có khác biệt gì không

báo lại nhé,

dĩ nhiên mã không có thì sẽ không có
 

File đính kèm

Thử cái mới này xem có khác biệt gì không

báo lại nhé,

dĩ nhiên mã không có thì sẽ không có

Nhớ phản hồi sớm

sửa sao thành 2 bài mới lạ
 
Mình test đang thấy chạy đúng rồi bạn, mình test thêm vài ngày nữa có lỗi gi nữa kg, cảm ơn winvista nhiều.

Đó nhờ có đưa cặp file gây lỗi ra thì mới phát hiện được (dữ liệu lúc là text lúc là number) và xử lý.
Nhớ lần sau có lỗi thì phải nói chi tiết , tình huống lỗi, số liệu, dữ liệu minh họa, hình ảnh file kèm...
Vì nếu không thì chúng ta chỉ làm mất thời gian của nhau (người giúp lại phải mò kim đáy bể)
 

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

Back
Top Bottom