Code vlookup 2 chiều

Duong.bach

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
28 Tháng ba 2020
Bài viết
9
Được thích
1
Điểm
15
Tuổi
27
Các pro giúp em code vlookup 2 chiều với ô D1 và E1, source cột A và B với ạ. Như kiểu nhập D1 là 1 thì E1 trả 11 và nhập E1 là 12 thì D1 trả về e ý ạ.
Cảm ơn all
 

File đính kèm

CHAOQUAY

Thành viên tích cực
Tham gia ngày
24 Tháng tám 2018
Bài viết
1,084
Được thích
1,132
Điểm
360
@Duong.bach
Chuột phải vào sheet tab --> chọn view code --> dán code dưới đây
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim sArr
Dim i As Integer
sArr = Range("A1").CurrentRegion
If Target.Address = "$D$1" Then
    If Target <= 10 And Target >= 1 Then
        Range("F1") = sArr(Target, 2)
        Columns(5).Delete
    End If
End If
If Target.Address = "$E$1" Then
    If Target >= 11 And Target <= 20 Then
        Range("C1") = sArr(Target Mod 10, 1)
        Columns(4).Delete
        Columns(3).Insert
    End If
End If
End Sub
 

Duong.bach

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
28 Tháng ba 2020
Bài viết
9
Được thích
1
Điểm
15
Tuổi
27
@Duong.bach
Chuột phải vào sheet tab --> chọn view code --> dán code dưới đây
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim sArr
Dim i As Integer
sArr = Range("A1").CurrentRegion
If Target.Address = "$D$1" Then
    If Target <= 10 And Target >= 1 Then
        Range("F1") = sArr(Target, 2)
        Columns(5).Delete
    End If
End If
If Target.Address = "$E$1" Then
    If Target >= 11 And Target <= 20 Then
        Range("C1") = sArr(Target Mod 10, 1)
        Columns(4).Delete
        Columns(3).Insert
    End If
End If
End Sub
Cảm ơn pro rất nhiều
Tiện bác cho em hỏi code em viết như này vấn đề ở đâu mà k chạy dc,viết đơn lẻ từng cái thì đúng mà
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$1" Then
x = Application.VLookup(Range("d1"), Range("a1:b10"), 2, 0)
Range("e1").Value = x
End If
If Target.Address = "$E$1" Then
Range("d1").Formula = "=INDEX(Sheet2!A1:A12,MATCH(Sheet2!E1,Sheet2!B1:B12,0))"
End If
End Sub
Bài đã được tự động gộp:

Cảm ơn pro rất nhiều
Tiện bác cho em hỏi code em viết như này vấn đề ở đâu mà k chạy dc,viết đơn lẻ từng cái thì đúng mà
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$1" Then
x = Application.VLookup(Range("d1"), Range("a1:b10"), 2, 0)
Range("e1").Value = x
End If
If Target.Address = "$E$1" Then
Range("d1").Formula = "=INDEX(Sheet2!A1:A12,MATCH(Sheet2!E1,Sheet2!B1:B12,0))"
End If
End Sub
Ôi bác ơi, ý em ko phải là cái source nó liên tiếp như thế, nó phải nó số bất kỳ cơ. bác có code nào tổng quát kiểu như theo cell ko
 
Lần chỉnh sửa cuối:

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,072
Được thích
4,521
Điểm
860
Cảm ơn pro rất nhiều
Tiện bác cho em hỏi code em viết như này vấn đề ở đâu mà k chạy dc,viết đơn lẻ từng cái thì đúng mà
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$D$1" Then
x = Application.VLookup(Range("d1"), Range("a1:b10"), 2, 0)
Range("e1").Value = x
End If
If Target.Address = "$E$1" Then
Range("d1").Formula = "=INDEX(Sheet2!A1:A12,MATCH(Sheet2!E1,Sheet2!B1:B12,0))"
End If
End Sub
Bài đã được tự động gộp:


Ôi bác ơi, ý em ko phải là cái source nó liên tiếp như thế, nó phải nó số bất kỳ cơ. bác có code nào tổng quát kiểu như theo cell ko
Thử sửa lại thế này xem
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$D$1" Then
        Application.EnableEvents = False
        Range("e1").Value = Application.VLookup(Range("d1"), Range("a1:b10"), 2, 0)
        Application.EnableEvents = True
    End If
    If Target.Address = "$E$1" Then
        Application.EnableEvents = False
        Range("d1").Formula = "=INDEX(Sheet2!A1:A12,MATCH(Sheet2!E1,Sheet2!B1:B12,0))"
        Application.EnableEvents = True
    End If
End Sub
 

Duong.bach

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia ngày
28 Tháng ba 2020
Bài viết
9
Được thích
1
Điểm
15
Tuổi
27
Thử sửa lại thế này xem
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$D$1" Then
        Application.EnableEvents = False
        Range("e1").Value = Application.VLookup(Range("d1"), Range("a1:b10"), 2, 0)
        Application.EnableEvents = True
    End If
    If Target.Address = "$E$1" Then
        Application.EnableEvents = False
        Range("d1").Formula = "=INDEX(Sheet2!A1:A12,MATCH(Sheet2!E1,Sheet2!B1:B12,0))"
        Application.EnableEvents = True
    End If
End Sub
Cảm ơn bác, cái này mới đúng mong muốn của em nè.
2 cái lệnh bác thêm vào nó có ý nghĩa như nào vậy ạ ? Nếu không có 2 lệnh đó thì code nó chạy dc đúng 1 lần
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,072
Được thích
4,521
Điểm
860
Cảm ơn bác, cái này mới đúng mong muốn của em nè.
2 cái lệnh bác thêm vào nó có ý nghĩa như nào vậy ạ ?
Do cái sự kiện Worksheet_Change sẽ xảy ra khi giá trị trong ô thay đổi. Vậy thì khi D1 thay đổi bạn tính E1 (Lúc này đã có ô thay đổi giá trị) lúc này sự kiện Worksheet_Change tiếp tục chạy mà E1 thay đổi bạn lại tính D1 (Lúc này đã có ô thay đổi giá trị), Worksheet_Change tiếp tục chạy bạn tính E1 ... Nó chạy mãi. Chính vì vậy lệnh Application.EnableEvents = False sẽ tắt tự kiện Worksheet_Change và tính gía trị cho ô D1 hoặc E1 sau đó cho nó hoạt động trở lại bằng lệnh Application.EnableEvents = True
 
Top Bottom