Hỏi về vlookup trong vba (1 người xem)

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

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

cup5000

Thành viên mới
Tham gia
14/9/11
Bài viết
40
Được thích
2
mình đang có nhu cầu xài hàm vlookup tự động trong vba, nhưng cứ dính lỗi 1004 không tìm thấy dữ liệu, các bạn giúp mình chữa lỗi ( mặc dù đã dùng on error go to nhưg lỗi xuất hiện lạ lùng vào lần lập thứ 2, các bác xem sẽ rõi)
ps: mình mún kg tìm thấy dữ liệu hiện ra NA##

Mã:
Sub TU_DONG_UPDATE_SOP_TO_EXCEL()


Dim A As Long ' GIA TRI TUAN THU 1 TRONG FILE EXCEL CAN UPDATE
Dim B As Long ' GIA TRI TUAN THU 2
Dim C As Long ' GIA TRI TUAN THU 3
Dim D As Long ' GIA TRI TUAN THU 4
Dim I As Long ' GIA TRI ROW CHAY
Dim GTT As String 'GIA TRI TIM
Dim Y As Long ' DONG CUOI
Dim myrange As Range


Set myrange = Sheets("SHEET1").Range("A1:C500")
Dim LASTROW As Long 'DONG CUOI CUNG CHUA DUNG LIEU TRONG EXCEL CAN UPDATE


Worksheets("Apr. plan").Activate


Y = Range("A" & Rows.Count).End(xlUp).Row


Worksheets("sheet1").Activate
Range("A1:e5000").Activate


Set myrange = Range("A1:C500")


Worksheets("Apr. plan").Activate
For I = 7 To Y


    GTT = Range("D" & I).Value


On Error Resume Next
    A = Application.WorksheetFunction.VLookup(GTT, myrange, 2, False) ' cause an error
    If Err.Number <> 0 Then
        A = 10101
    End If
MsgBox A
Next I


End Sub

lỗi khi chạy tới i =8
 

File đính kèm

Lần chỉnh sửa cuối:
mình đang có nhu cầu xài hàm vlookup tự động trong vba, nhưng cứ dính lỗi 1004 không tìm thấy dữ liệu, các bạn giúp mình chữa lỗi ( mặc dù đã dùng on error go to nhưg lỗi xuất hiện lạ lùng vào lần lập thứ 2, các bác xem sẽ rõi)
ps: mình mún kg tìm thấy dữ liệu hiện ra NA##

Mã:
Sub TU_DONG_UPDATE_SOP_TO_EXCEL()

Dim A As Long ' GIA TRI TUAN THU 1 TRONG FILE EXCEL CAN UPDATE
Dim B As Long ' GIA TRI TUAN THU 2
Dim C As Long ' GIA TRI TUAN THU 3
Dim D As Long ' GIA TRI TUAN THU 4
Dim I As Long ' GIA TRI ROW CHAY
Dim GTT As String 'GIA TRI TIM
Dim Y As Long ' DONG CUOI
Dim myrange As Range


Set myrange = Sheets("SHEET1").Range("A1:C500")
Dim LASTROW As Long 'DONG CUOI CUNG CHUA DUNG LIEU TRONG EXCEL CAN UPDATE


Worksheets("Apr. plan").Activate


Y = Range("A" & Rows.Count).End(xlUp).Row


Set myrange = Sheets("SHEET1").Range("A1:C500")


For I = 7 To Y
On Error GoTo loi


    GTT = Range("A" & I)


    
    A = Application.WorksheetFunction.VLookup(GTT, myrange, 2, False)


loi:
   
   A = 1
   


Next I


End Sub

lỗi khi chạy tới i =8
Code 1 đàng, file 1 đàng, biết sao mà test đây?
Trong code của bạn có đoạn Worksheets("Apr. plan").Activate ---> Vậy Worksheets("Apr. plan") là sheet nào đây?
 
Upvote 0
chết xin lỗi, up nhầm

đã úpdate lại file, anh em xem giúp
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Ai rảnh rỗi test thử file ở bài 1 xem thế nào
Thật tình tôi không tài nào hiểu nỗi file này nó bị bệnh gì nữa. Tôi test thử với dòng lệnh đơn giản thế này:
Mã:
Sub TU_DONG_UPDATE_SOP_TO_EXCEL()
  Dim Arr
  With Sheets("Apr. plan").Range("D7:H100")
    Arr = .Value
    .Value = Arr
    MsgBox "Finish"
  End With
End Sub
Vậy mà nó cũng bị "treo"
Không hiểu nỗi
 
Upvote 0
Ai rảnh rỗi test thử file ở bài 1 xem thế nào
Thật tình tôi không tài nào hiểu nỗi file này nó bị bệnh gì nữa. Tôi test thử với dòng lệnh đơn giản thế này:
Mã:
Sub TU_DONG_UPDATE_SOP_TO_EXCEL()
  Dim Arr
  With Sheets("Apr. plan").Range("D7:H100")
    Arr = .Value
    .Value = Arr
    MsgBox "Finish"
  End With
End Sub
Vậy mà nó cũng bị "treo"
Không hiểu nỗi

Ha... ha... Tìm ra rồi
Lâu lâu bác Bill cũng chơi trò kỳ cục khó hiểu
Ai tìm ra được vấn đề nói thử xem ---> Trò này cũng "quái chiêu" phết
Ẹc... Ẹc...
 
Upvote 0
nếu dùng công thức thì chúng ta sẽ dùng hàm vlookup(giá trị cần dò, mãng cần dò, ô cần lấy, dò tương đối hay tuyệt đối) gõ vào ô cần xuất kết quả
 
Upvote 0
nếu dùng công thức thì chúng ta sẽ dùng hàm vlookup(giá trị cần dò, mãng cần dò, ô cần lấy, dò tương đối hay tuyệt đối) gõ vào ô cần xuất kết quả

Trời má ơi!
Bạn không hiểu tôi nói gì sao?
Công thức gì? Bạn trực tiếp vào file tôi xem thử
(ai chẳng biết cú pháp hàm VLOOKUP, bạn đưa lên làm gì)
 
Upvote 0
Ha... ha... Tìm ra rồi
Lâu lâu bác Bill cũng chơi trò kỳ cục khó hiểu
Ai tìm ra được vấn đề nói thử xem ---> Trò này cũng "quái chiêu" phết
Ẹc... Ẹc...

>

=

Trong range nên bị lỗi!

--------------------------------------------------
Test lại thì chỉ có dấu bằng (=) mới phát sinh lỗi!
 
Lần chỉnh sửa cuối:
Upvote 0
hức, thiệt kg hiểu, em chỉ cố gọi hàm êxcel vào vba và xử lý thêm lỗi 1004 thui hix
 
Upvote 0
Test lại thì chỉ có dấu bằng (=) mới phát sinh lỗi!

Chưa chắc đâu! Tôi test cell có dấu = chẳng lỗi gì cả
-------------------------
hức, thiệt kg hiểu, em chỉ cố gọi hàm êxcel vào vba và xử lý thêm lỗi 1004 thui hix
Trước khi viết hàm vào VBA, ít ra bạn cũng hình dung được khi gõ trên bảng tính phải gõ thế nào chứ! Chả lẽ cứ viết bừa
Đấy mới là cái tôi cần và đang chở bạn trả lời
 
Upvote 0
thành công ui, dùng mãng
Mã:
Sub TU_DONG_UPDATE_SOP_TO_EXCEL()




Dim GTT As String 'GIA TRI TIM
Dim Y As Long ' DONG CUOI
Dim myrange As Range








Dim LASTROW As Long 'DONG CUOI CUNG CHUA DUNG LIEU TRONG EXCEL CAN UPDATE




Worksheets("Apr. plan").Activate




Y = Range("A" & Rows.Count).End(xlUp).Row




Worksheets("sheet1").Activate
Dim SheetsValues()
SheetsValues = Range("A1:E2000").Value




Worksheets("Apr. plan").Activate


'tuan thu 1
For I = 7 To Y


    GTT = Range("D" & I).Value
    A = 0
    
    For J = 1 To 2000
        If GTT = SheetsValues(J, 1) Then
        A = SheetsValues(J, 2)
                End If
     Next J
   Range("ax" & I).Value = A
     
Next I


'tuan thu 2
For I = 7 To Y


    GTT = Range("D" & I).Value
    A = 0
    
    For J = 1 To 2000
        If GTT = SheetsValues(J, 1) Then
        A = SheetsValues(J, 3)
                End If
     Next J
   Range("ay" & I).Value = A
     
Next I


'tuan thu 3


For I = 7 To Y


    GTT = Range("D" & I).Value
    A = 0
    
    For J = 1 To 2000
        If GTT = SheetsValues(J, 1) Then
        A = SheetsValues(J, 4)
                End If
     Next J
   Range("az" & I).Value = A
     
Next I


'tuan thu 4


For I = 7 To Y


    GTT = Range("D" & I).Value
    A = 0
    
    For J = 1 To 2000
        If GTT = SheetsValues(J, 1) Then
        A = SheetsValues(J, 5)
                End If
     Next J
   Range("ba" & I).Value = A
     
Next I








End Sub
 
Upvote 0
em hiểu ý bác, em mới truyền tham số vô thui, truyền tham số lỗi nên em chưa set vaule vào ô nào hết
 
Upvote 0
Ha... ha... Tìm ra rồi
Lâu lâu bác Bill cũng chơi trò kỳ cục khó hiểu
Ai tìm ra được vấn đề nói thử xem ---> Trò này cũng "quái chiêu" phết
Ẹc... Ẹc...

Ở sheet apr.plan ta có ở ô D51 giá trị =<32" ('=<32")
Khi "đập" mảng Arr xuống sheet (.Value = Arr) thì trong quá trình "cố" nhập vào D51 giá trị =<32" thì ta có lỗi.
Theo tôi không nên gõ '=<32" vào D51. Phải gõ <=32"

Theo tôi vì dấu "=" gợi ý đó là công thức, mà rõ ràng công thức kiểu =<32" là công thức sai.
 
Upvote 0
em hiểu ý bác, em mới truyền tham số vô thui, truyền tham số lỗi nên em chưa set vaule vào ô nào hết

Tôi cũng hiểu ý bạn, nhưng cái tôi muốn biết là VÙNG NÀO SẼ ĐƯỢC GÁN
Vì nếu tôi làm bài này thì chả bao giờ viết code kiểu đó cả... Dù dùng mảng cũng không phải viết như vậy luôn
Hic... Mà thôi, bạn đã "thành công" thì cứ y vậy mà chạy cũng được!
 
Upvote 0
Ở sheet apr.plan ta có ở ô D51 giá trị =<32" ('=<32")
Khi "đập" mảng Arr xuống sheet (.Value = Arr) thì trong quá trình "cố" nhập vào D51 giá trị =<32" thì ta có lỗi.
Theo tôi không nên gõ '=<32" vào D51. Phải gõ <=32"

Theo tôi vì dấu "=" gợi ý đó là công thức, mà rõ ràng công thức kiểu =<32" là công thức sai.

Khi giá trị ban đầu gõ vào thì chọn định dạng kiểu Text, nếu mình định dạng tại nơi đến là kiểu Text luôn sẽ không gặp lỗi nữa.
 
Upvote 0
hixx em gà quá, thanks các bác, lần đầu viết vba, gà quá
 
Upvote 0
Ai rảnh rỗi test thử file ở bài 1 xem thế nào
Thật tình tôi không tài nào hiểu nỗi file này nó bị bệnh gì nữa. Tôi test thử với dòng lệnh đơn giản thế này:
Mã:
Sub TU_DONG_UPDATE_SOP_TO_EXCEL()
  Dim Arr
  With Sheets("Apr. plan").Range("D7:H100")
    Arr = .Value
    .Value = Arr
    MsgBox "Finish"
  End With
End Sub
Vậy mà nó cũng bị "treo"
Không hiểu nỗi

Theo em là vì các Cells đang để format number là General --> nên nếu có "= < 32 " nó sẽ hiểu là công thức ,ko phải là text nên bị báo lỗi ở ô này
 
Upvote 0
Khi giá trị ban đầu gõ vào thì chọn định dạng kiểu Text, nếu mình định dạng tại nơi đến là kiểu Text luôn sẽ không gặp lỗi nữa.

Cái này thì liên quan gì tới câu trả lời của tôi nhỉ?
Bạn chú ý là tôi trả lời cụ thể cho bài cụ thể. Bạn thử kiểm tra xem hiện thời trong tập tin của chủ topic định dạng của ô D51 là thế nào nhé.
Theo tôi nên viết thế nào cho tốt nhất, giảm tới mức tối thiểu khả năng sẩy ra lỗi,
tăng sức đề kháng cho code với những "chưởng" khác nhau. Sao lại viết =<32 mà không viết <=32?
 
Upvote 0
Cái này thì liên quan gì tới câu trả lời của tôi nhỉ?
Bạn chú ý là tôi trả lời cụ thể cho bài cụ thể. Bạn thử kiểm tra xem hiện thời trong tập tin của chủ topic định dạng của ô D51 là thế nào nhé.
Theo tôi nên viết thế nào cho tốt nhất, giảm tới mức tối thiểu khả năng sẩy ra lỗi,
tăng sức đề kháng cho code với những "chưởng" khác nhau. Sao lại viết =<32 mà không viết <=32?

em cũng hay viết < = hoặc > =, vì trong tất cả các tài liệu lập trình , toán tử so sánh đều là < = dịch ra là " nhỏ hơn hoặc bằng " , chứ có thấy ai nói là " bằng hoặc nhỏ hơn đâu "
 
Upvote 0
em cũng hay viết < = hoặc > =, vì trong tất cả các tài liệu lập trình , toán tử so sánh đều là < = dịch ra là " nhỏ hơn hoặc bằng " , chứ có thấy ai nói là " bằng hoặc nhỏ hơn đâu "

Cái này thì đúng rồi. Toán tử là <= chứ không có cái gọi là =<

Mà thực ra nói "hay viết <=" cũng chưa chuẩn. Mà phải nhấn mạnh là "phải viết <="

Trong VBE nếu bạn viết

Mã:
if a =< b then ...

thì ngay lập tức nó sửa thành

Mã:
if a <= b then

Nhưng nếu trong Delphi bạn viết

Mã:
if a =< b then ...

thì nó chả sửa gì cả. Nhưng bạn không thể compile được project. Bởi không có cái gọi là "=<". Compiler không hiểu "=<" là cái của khỉ gì.
 
Upvote 0
hix hỏi ngu cái, nếu mún handle cái lỗi kg tìm thấy dzữ liệu trong gọi hàm vlookup thì như thế nào (code trang đầu lun)
 
Upvote 0
hix hỏi ngu cái, nếu mún handle cái lỗi kg tìm thấy dzữ liệu trong gọi hàm vlookup thì như thế nào (code trang đầu lun)

Làm vầy:
Mã:
Dim A
On Error Resume Next
A = WorksheetFunction.Vlookup(.....)
On Error Goto 0
...................
Nhưng trong VBA, để tìm kiếm ta có thể dùng Find Method, mắc gì phải VLOOKUP cho rách việc chứ
 
Upvote 0
Cái này thì liên quan gì tới câu trả lời của tôi nhỉ?
Bạn chú ý là tôi trả lời cụ thể cho bài cụ thể. Bạn thử kiểm tra xem hiện thời trong tập tin của chủ topic định dạng của ô D51 là thế nào nhé.
Theo tôi nên viết thế nào cho tốt nhất, giảm tới mức tối thiểu khả năng sẩy ra lỗi,
tăng sức đề kháng cho code với những "chưởng" khác nhau. Sao lại viết =<32 mà không viết <=32?

Oh không, Thầy nói thì hoàn toàn chính xác rồi, tuy nhiên em muốn nói đến khi người ta cố tình không phải viết kiểu lớn hơn hoặc bằng hay bé hơn hoặc bằng, mà người ta muốn nói đến dấu "suy ra" (=>), nếu vô tình bị lỗi thì chỉ làm cách định dạng nơi đến mà thôi.
 
Upvote 0

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

Back
Top Bottom