M.n giúp e làm công thức tìm kiếm bằng VBA (giống Vlookup) với ạ (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

bhtrong2808

Thành viên mới
Tham gia
18/9/23
Bài viết
13
Được thích
-2
Em muốn tạo 1 VBA có thể giúp tìm kiếm dữ liệu từ sheet 2 điền kết quả sang sheet 1. Cụ thể trong file Excel này em muốn code VBA của e có thể:
1. Bỏ qua tìm kiếm những cột đã có kết quả Điện Năng, Tiền tệ, km.
2. Tìm kiếm theo mã trạm của cột B trả về kết quả Điện Năng, Tiền tệ , km
3. Các kết quả này được lấy từ sheet 2. và kết quả đã lấy sẽ không tự động xóa khi dữ liệu sheet 2 bị xóa. tức không tự động cập nhật lại dữ liệu nữa nếu đã có kết quả.
Em cảm ơn ạ.
 

File đính kèm

Test thử đoạn code này xem sao

Mã:
Option Explicit
Sub vlookup()
Dim lr&, col&, rng As Range, ce As Range
Set rng = Sheets("Sheet2").Range("A2:T100000")
Sheets("Sheet1").Activate
lr = Cells(Rows.Count, "B").End(xlUp).Row
For Each ce In Range("D3:F" & lr)
    With ce
        If .Value = "" Then
            col = IIf(.Column = 4, 13, IIf(.Column = 5, 17, 19))
            .Value = Evaluate("=IFERROR(VLOOKUP(" & Cells(.Row, 2).Value & "," & "Sheet2!" & rng.Address & "," & col & ",0),"""")")
        End If
    End With
Next
End Sub
 

File đính kèm

Test thử đoạn code này xem sao

Mã:
Option Explicit
Sub vlookup()
Dim lr&, col&, rng As Range, ce As Range
Set rng = Sheets("Sheet2").Range("A2:T100000")
Sheets("Sheet1").Activate
lr = Cells(Rows.Count, "B").End(xlUp).Row
For Each ce In Range("D3:F" & lr)
    With ce
        If .Value = "" Then
            col = IIf(.Column = 4, 13, IIf(.Column = 5, 17, 19))
            .Value = Evaluate("=IFERROR(VLOOKUP(" & Cells(.Row, 2).Value & "," & "Sheet2!" & rng.Address & "," & col & ",0),"""")")
        End If
    End With
Next
End Sub
quá là tuyệt vời luôn ạ. hihi. e cảm ơn bác nhiều lắm ahehehehehe!! xD
Bài đã được tự động gộp:

Test thử đoạn code này xem sao

Mã:
Option Explicit
Sub vlookup()
Dim lr&, col&, rng As Range, ce As Range
Set rng = Sheets("Sheet2").Range("A2:T100000")
Sheets("Sheet1").Activate
lr = Cells(Rows.Count, "B").End(xlUp).Row
For Each ce In Range("D3:F" & lr)
    With ce
        If .Value = "" Then
            col = IIf(.Column = 4, 13, IIf(.Column = 5, 17, 19))
            .Value = Evaluate("=IFERROR(VLOOKUP(" & Cells(.Row, 2).Value & "," & "Sheet2!" & rng.Address & "," & col & ",0),"""")")
        End If
    End With
Next
End Sub
e cũng k có nhiều. mời bác cốc cafe nhé ạ. e donate momo nha.
Bài đã được tự động gộp:

quá là tuyệt vời luôn ạ. hihi. e cảm ơn bác nhiều lắm ahehehehehe!! xD
Bài đã được tự động gộp:


e cũng k có nhiều. mời bác cốc cafe nhé ạ. e donate momo nha.
QR momo của bác có vấn đề ạ,.
 
Lần chỉnh sửa cuối:
Hàm có sẵn không dùng, lại đi sài VBA làm gì ta?!
 
Lần chỉnh sửa cuối:
Thử làm đi rồi nói tiếp.

Tiếng Việt, từ đồng nghĩa với "dùng" viết là "xài"
"sài" có hai nghĩa:
1. sài đẹn (bệnh hoạn)
2. con sài là một giống chó rừng.
Bắt bẻ ba cái tiểu tiết để làm gì. Vùng miền thôi.
Ý tôi là sao mình không dùng hàm có sẵn, mà phải đi viết code cho Vlookup. Chắc gì đã hơn mấy kỹ sư của Bill Gates
 
Lần chỉnh sửa cuối:
Ụa, code cũng đang dùng VLOOKUP mà, có chăng chỉ giản lược vài thao tác bằng tay thôi :D
Chứ có phải thay thế Function VLOOKUP đâu mà hay hoặc dở hơn;
 
Bắt bẻ ba cái tiểu tiết để làm gì. Vùng miền thôi.
Ý tôi là sao mình không dùng hàm có sẵn, mà phải đi viết code cho Vlookup. Chắc gì đã hơn mấy kỹ sư của Bill Gates
nếu bạn đọc kĩ bài viết của mình sẽ hiểu vì sao k xài vlookup. điều kiện 3 của mình vlookup k làm đc. cảm ơn bạn đã lướt qua! chưa kể các file excel chứa 10.000 dòng đều có công thức thì data nó sẽ khủng cỡ nào. file đó sợ k mở nổi.
 
Bắt bẻ ba cái tiểu tiết để làm gì. Vùng miền thôi.
Ý tôi là sao mình không dùng hàm có sẵn, mà phải đi viết code cho Vlookup. Chắc gì đã hơn mấy kỹ sư của Bill Gates
Lại cái màn tự ái vặt, lo cãi cối cho nên mất chú ý vào vấn đề chính.
Đọc kỹ lại cái câu "Thử làm đi rồi nới tiếp". Đã thử chưa? Chưa thử thì chỉ là nói bừa.
 
nếu bạn đọc kĩ bài viết của mình sẽ hiểu vì sao k xài vlookup. điều kiện 3 của mình vlookup k làm đc. cảm ơn bạn đã lướt qua! chưa kể các file excel chứa 10.000 dòng đều có công thức thì data nó sẽ khủng cỡ nào. file đó sợ k mở nổi.
Lại ẩu :D
Bạn không làm được chứ không phải người khác không làm được. Nếu như chỉ là
PHP:
        If .Value = "" Then
            col = IIf(.Column = 4, 13, IIf(.Column = 5, 17, 19))
            .Value = Evaluate("=IFERROR(VLOOKUP(" & Cells(.Row, 2).Value & "," & "Sheet2!" & rng.Address & "," & col & ",0),"""")")
        End If
thì làm cái cột phụ kèm điều kiện = "" thì Vlookup, còn không thì lấy giá trị từ cột gốc;
1 tỷ dòng đầu tiên lọc các giá trị trống để giảm tính toán, tính xong thì ráp, không thì tách bảng, tách sheet, tách file;
Dĩ nhiên là vì "làm được", chứ còn mất công và mất thời gian.
 
Lại ẩu :D
Bạn không làm được chứ không phải người khác không làm được. Nếu như chỉ là
PHP:
        If .Value = "" Then
            col = IIf(.Column = 4, 13, IIf(.Column = 5, 17, 19))
            .Value = Evaluate("=IFERROR(VLOOKUP(" & Cells(.Row, 2).Value & "," & "Sheet2!" & rng.Address & "," & col & ",0),"""")")
        End If
thì làm cái cột phụ kèm điều kiện = "" thì Vlookup, còn không thì lấy giá trị từ cột gốc;
1 tỷ dòng đầu tiên lọc các giá trị trống để giảm tính toán, tính xong thì ráp, không thì tách bảng, tách sheet, tách file;
Dĩ nhiên là vì "làm được", chứ còn mất công và mất thời gian.
ok bn do mình ko làm đc. mình thích dùng vba được không ạ. Bạn giỏi! chúc mừng bạn ;)))
 
...
Dĩ nhiên là vì "làm được", chứ còn mất công và mất thời gian.
1. VBA đối với dân xin code ở đây là nó chỉ cần "bấm một phát". Những người xin code thường là do lười thết kế lại bảng tính, hay lười thao tác thủ công.

2. Một trong những lý do tôi dị ứng với dân hay viết tắt là vì họ dùng ngôn ngữ mạng quen; mà mạng thì phần lớn là dân côn đồ (họ tự khoe tính cách của mình là "giang hồ"). Nói chuyện với họ rất dễ được vào quán Ếch xào chửi.
 
Lại ẩu :D
Bạn không làm được chứ không phải người khác không làm được. Nếu như chỉ là
PHP:
        If .Value = "" Then
            col = IIf(.Column = 4, 13, IIf(.Column = 5, 17, 19))
            .Value = Evaluate("=IFERROR(VLOOKUP(" & Cells(.Row, 2).Value & "," & "Sheet2!" & rng.Address & "," & col & ",0),"""")")
        End If
thì làm cái cột phụ kèm điều kiện = "" thì Vlookup, còn không thì lấy giá trị từ cột gốc;
1 tỷ dòng đầu tiên lọc các giá trị trống để giảm tính toán, tính xong thì ráp, không thì tách bảng, tách sheet, tách file;
Dĩ nhiên là vì "làm được", chứ còn mất công và mất thời gian.
Bạn này nói đúng nè. Vlookup nhiều điều kiện thì làm thêm cột phụ và nối chuổi là được.
 
thì làm cái cột phụ kèm điều kiện = "" thì Vlookup, còn không thì lấy giá trị từ cột gốc;
1 tỷ dòng đầu tiên lọc các giá trị trống để giảm tính toán, tính xong thì ráp, không thì tách bảng, tách sheet, tách file;
Dĩ nhiên là vì "làm được", chứ còn mất công và mất thời gian.
Bạn này nói đúng nè. Vlookup nhiều điều kiện thì làm thêm cột phụ và nối chuổi là được.
Mọi người không để ý điều kiện 3 của bạn ấy à?
3. Các kết quả này được lấy từ sheet 2. và kết quả đã lấy sẽ không tự động xóa khi dữ liệu sheet 2 bị xóa. tức không tự động cập nhật lại dữ liệu nữa nếu đã có kết quả.
Em cảm ơn ạ.
Sau khi VLOOKUP thì có bước là lưu giá trị và xóa công thức (tương đương lệnh copy/paste value), và bước này đòi hỏi VBA.
 
1. VBA đối với dân xin code ở đây là nó chỉ cần "bấm một phát". Những người xin code thường là do lười thết kế lại bảng tính, hay lười thao tác thủ công.

2. Một trong những lý do tôi dị ứng với dân hay viết tắt là vì họ dùng ngôn ngữ mạng quen; mà mạng thì phần lớn là dân côn đồ (họ tự khoe tính cách của mình là "giang hồ"). Nói chuyện với họ rất dễ được vào quán Ếch xào chửi.
Cái này bác nhận xét sai. Dân mạng hay viết tắt thường là tuổi teen, viết vậy mới nhanh, chêm thêm tiếng anh nữa mới ngầu. Không có chợ búa, giang hồ, giang nắng chi ở đây cả nhé bác.
Đã thành thói quen, muốn sửa cũng phải từ từ chứ bác. Họ hay nói: "muốn nhanh thì cứ phải từ từ!"
Bài đã được tự động gộp:

Lại cái màn tự ái vặt, lo cãi cối cho nên mất chú ý vào vấn đề chính.
Đọc kỹ lại cái câu "Thử làm đi rồi nới tiếp". Đã thử chưa? Chưa thử thì chỉ là nói bừa.
Sorry bác!
Tại đọc cái tiêu đề mà ko xem file+nội dung.
 
Lần chỉnh sửa cuối:
...Sorry bác!
Tại đọc cái tiêu đề mà ko xem file+nội dung.
Lại ngôn ngữ tiên.
Từ sorry đi trước một danh từ/đại danh từ thì nó làm tĩnh từ diễn tả trạng thái của danh từ/đại danh từ ấy. Và sorry tĩnh từ có nghĩa là "tội nghiệp", hay "khốn nạn" theo tiếng Bắc.
Từ sorry mà người ta hay NÓI trước danh từ/đại danh từ thực ra nó có một dấu ngắt (chấm hay phẩy). Lúc ấy thì nó không phải là tĩnh từ, mà là một từ trong các phản ứng của người nói (tức là xin lỗi)
Dân tiên nghe người ta nói, cứ ngỡ hai từ này đi sát nhau. Vì lúc nói, đâu có ai nói lên "chấm, phẩy,.."

Văn phạm và chính tả học xong ở lớp 7. Thời gian trưởng thành sau đó đủ để "từ từ" chúng thoái hóa thành ngôn ngữ tiên.
 
Lần chỉnh sửa cuối:
Mọi người không để ý điều kiện 3 của bạn ấy à?
Anh làm em thực sự tò mò luôn á. Phải tải xuống xem thử. Cái EVALUE trên diễn đàn cũng nói nhiều mà.
Nếu em dùng công thức: =IFERROR(VLOOKUP($B4,Sheet2!$A$2:$T$100000,D$1,0),"")
Dòng D1:F1 cũng có thể index từ table dựa theo D2:F2
Hay em có đang hiểu nhầm gì không ?

1701346449784.png
 
Không sao đâu bạn. Ông già khó tính đó ai mà không biết!
Biết nhưng mà biết chưa hết.
- Nói năng đàng hoàng thì vấn đề sẽ được tôi giải thích kỹ lưỡng. Ăn nói hời hợt thì tôi chỉ giải thích khi thấy có người cần học.

Điển hình, nếu bạn chịu khó nói đàng hoàng thì tôi đã giải thích rõ tại sao bài này phải VBA. Nếu chịu khó đọc bài người khác cho kỹ thì tôi đã giải thích code ở bài #2.

Riêng với thớt, nếu chịu khó viets rõ, đừng viết tắt thì tôi đã chỉ cho một vài cách khác.
 
Hình như điều kiện 3 là xóa bỏ sheet2 thì kết quả sheet1 vẫn tồn tại ấy. Nên chỉ có thể là giá trị. Lại đoán mò. :wallbash: :wallbash: :wallbash:
Em đồng ý với bác ạ.Ý tưởng làm file này của e tức là lấy kết quả là value chứ k phải hàm. vs cả e có nói bên trên nữa là nếu đặt công thức dài và phức tạp. file chứa hơn 10000 dòng ( file chính của e thì lượng hàm sẽ x3 tức ~ 30k cells chứa hàm) chưa kể định dạng trong file nữa. sẽ rất là nặng. như kia thì lúc cần e chỉ cần chỉnh lại code vba "rng" ví dụ auto update data cho 200-300 dòng mới cập nhật vào sẽ rất tiện. cũng bỏ qua đc các bước copy paste value mất tgian. công việc mà thuận tiện và đơn giản thì nên áp dụng. các file nhẹ e cũng ưu tiên xài hàm chứ không phải là k làm đc ạ.
 
Lần chỉnh sửa cuối:
Em đồng ý với bác ạ.Ý tưởng làm file này của e tức là lấy kết quả là value chứ k phải hàm. vs cả e có nói bên trên nữa là nếu đặt công thức dài và phức tạp. file chứa hơn 10000 dòng ( file chính của e thì lượng hàm sẽ x3 tức ~ 30k cells chứa hàm) chưa kể định dạng trong file nữa. sẽ rất là nặng. như kia thì lúc cần e chỉ cần chỉnh lại code vba "rng" ví dụ auto update data cho 200-300 dòng mới cập nhật vào sẽ rất tiện. cũng bỏ qua đc các bước copy paste value mất tgian. công việc mà thuận tiện và đơn giản thì nên áp dụng. các file nhẹ e cũng ưu tiên xài hàm chứ không phải là k làm đc ạ.
Thường thì khi dùng VBA thì hạn chế dùng hàm excel nhất nếu được. Thế nó mới truyên nghiệp.
 
Thường thì khi dùng VBA thì hạn chế dùng hàm excel nhất nếu được. Thế nó mới truyên nghiệp.
Lệ này ở đâu vậy?

Chú: bình thường thì tôi đã chỉ cách dùng rồi. Nhưng tôi bản tính tôi kém hào phóng như mọi người. Xem giải thích ở bài #21.
 
Thường thì khi dùng VBA thì hạn chế dùng hàm excel nhất nếu được. Thế nó mới truyên nghiệp.
Muốn truyên nghiệp thì đầu tiên phải truyên cần.
Mà muốn có 1 tập thể truyên cần, thì phải tuyên chuyền rộng rãi, và phải có cách chuyền cảm hứng.
 
Lệ này ở đâu vậy?

Chú: bình thường thì tôi đã chỉ cách dùng rồi. Nhưng tôi bản tính tôi kém hào phóng như mọi người. Xem giải thích ở bài #21.
Lệ này theo trường phái truyên nghiệp mà bác.
Nếu như em viết được thì em sẽ không dùng Vlookup. Em sẽ theo trường phái For next.

Bác cũng nên theo trường phái này, vì nó là "cho tiếp". Người xưa có câu "Hãy cho đi để rồi mất hết". --=0 --=0 --=0
 
Lệ này theo trường phái truyên nghiệp mà bác.
Nếu như em viết được thì em sẽ không dùng Vlookup. Em sẽ theo trường phái For next.

Bác cũng nên theo trường phái này, vì nó là "cho tiếp". Người xưa có câu "Hãy cho đi để rồi mất hết".
Thế nào là "viết được"? Định nghĩa "được" rất tương đối.
Nếu tôi "viết được" thì tôi chả dùng cái gì, của ai cả.
Rất tiếc, VBA không phải là loại ngôn ngữ của lập trình nghiêm chỉnh. Không có cách truy cập trị theo địa chỉ. Không có kỹ thuật chuyền ống (piping). Script tốt hơn nhiều.

"tiếp" của bạn là tiếp tục hay tiếp thu?
Bạn thích "tục" cho nên ở môi trường nào cũng được. Tôi thích "thu" cho nên môi trường phải tương đối lịch sự một chút.
 
Mượn topic này chen vô nhờ vả chút hén!
Tôi có 1 vấn đề cần xử lý mà không làm được. Nhờ bác @VetMini hướng dẫn cách làm (VBA) được không nha. Hoặc viết luôn code thì càng tốt.
1. Sheets trích lọc KQ từ sheet 1. Điều kiện: từ ngày đến ngày, theo nhiều chủ thể mã nhà cung cấp, nguồn gốc....
2. Trích lọc ra kết quả: loại bỏ giá trị trùng và cộng tổng theo hàng (mã, tên, ncc, nguồn gốc, tổng sl). Tất nhiên sheet lọc KQ tính tổng không dùng công thức trên sheet.
Mong bác đào tạo thêm nhá. Cảm ơn bác!
 
Test thử đoạn code này xem sao

Mã:
Option Explicit
Sub vlookup()
Dim lr&, col&, rng As Range, ce As Range
Set rng = Sheets("Sheet2").Range("A2:T100000")
Sheets("Sheet1").Activate
lr = Cells(Rows.Count, "B").End(xlUp).Row
For Each ce In Range("D3:F" & lr)
    With ce
        If .Value = "" Then
            col = IIf(.Column = 4, 13, IIf(.Column = 5, 17, 19))
            .Value = Evaluate("=IFERROR(VLOOKUP(" & Cells(.Row, 2).Value & "," & "Sheet2!" & rng.Address & "," & col & ",0),"""")")
        End If
    End With
Next
End Sub
Hay quá. Em cũng cần dạng này để lọc dữ liệu.
 
Thế bạn muốn pho-nách là gì?
cho ... tiếp là boa (buộc boa)? nghĩa này thì tôi đồng ý với bạn. Thu nhập cỡ tôi chắc chắn là "cho đi để rồi mất hết". Một tháng lương "nách" ba quán bia là hết.
 

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

Back
Top Bottom