Giúp em sửa code thay hàm vlookup (1 người xem)

Liên hệ QC

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

gamegamegamegame

Thành viên hoạt động
Tham gia
5/6/15
Bài viết
144
Được thích
5
CODE FILE EM NHƯ THẾ NÀY
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range, Rng As Range
If Target.Column <> 1 Then Exit Sub 'DEM DO COT TOI MA HANG SHEET 1
For Each Cll In Intersect(Target, [A:A]) '[A:A]mh Sheet1
If Cll <> "" Then
Set Rng = Sheet2.[A:A].Find(Cll, LookAt:=xlWhole) '[A:A] MA HANG SHEET2
If Rng Is Nothing Then
Cll.Offset(, 0).ClearContents
Else
Cll.Offset(, 1) = Rng.Offset(, 1) 'chon dong ten hang ben quang ly hang
Cll.Offset(, 2) = Rng.Offset(, 2) ' chon dong don gia ben quang ly hang



End If
End If
End If

Next
End Sub

EM MUỐN NẾU MH BẰNG 0 THÌ TÊN HÀNG VÀ GIÁ SẼ KHÔNG HIỆN LÊN THÌ PHẢI CÀI CODE IF NHƯ THẾ NÀO VÀO ĐOẠN CODE TRÊN
XIN CÁC THẦY CHỈ DẠY
 

File đính kèm

CODE FILE EM NHƯ THẾ NÀY
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range, Rng As Range
If Target.Column <> 1 Then Exit Sub 'DEM DO COT TOI MA HANG SHEET 1
For Each Cll In Intersect(Target, [A:A]) '[A:A]mh Sheet1
If Cll <> "" Then
Set Rng = Sheet2.[A:A].Find(Cll, LookAt:=xlWhole) '[A:A] MA HANG SHEET2
If Rng Is Nothing Then
Cll.Offset(, 0).ClearContents
Else
Cll.Offset(, 1) = Rng.Offset(, 1) 'chon dong ten hang ben quang ly hang
Cll.Offset(, 2) = Rng.Offset(, 2) ' chon dong don gia ben quang ly hang



End If
End If
End If

Next
End Sub

EM MUỐN NẾU MH BẰNG 0 THÌ TÊN HÀNG VÀ GIÁ SẼ KHÔNG HIỆN LÊN THÌ PHẢI CÀI CODE IF NHƯ THẾ NÀO VÀO ĐOẠN CODE TRÊN
XIN CÁC THẦY CHỈ DẠY

Sao lại phải xài vòng lặp?
Mã:
Private Sub Worksheet_Change(ByVal target As Range)
Dim Rng As Range
Application.EnableEvents = False
    If Not Intersect(target, [A2:A100]) Is Nothing Then ' gioi hang vung nhap lieu tu A2:A100
        If target <> "" Then
            Set Rng = Sheet2.[A:A].Find(target, LookAt:=xlWhole) '[A:A] MA HANG SHEET2
            If Rng Is Nothing Then
                target.ClearContents: MsgBox "ko co gia tri nay!"
            Else
                target.Offset(, 1) = Rng.Offset(, 1) 'chon dong ten hang ben quang ly hang
                target.Offset(, 2) = Rng.Offset(, 2) ' chon dong don gia ben quang ly hang
            End If
        End If
     End If
Application.EnableEvents = True
End Sub
 
Upvote 0
Sao lại phải xài vòng lặp?
Mã:
Private Sub Worksheet_Change(ByVal target As Range)
Dim Rng As Range
Application.EnableEvents = False
    If Not Intersect(target, [A2:A100]) Is Nothing Then ' gioi hang vung nhap lieu tu A2:A100
        If target <> "" Then
            Set Rng = Sheet2.[A:A].Find(target, LookAt:=xlWhole) '[A:A] MA HANG SHEET2
            If Rng Is Nothing Then
                target.ClearContents: MsgBox "ko co gia tri nay!"
            Else
                target.Offset(, 1) = Rng.Offset(, 1) 'chon dong ten hang ben quang ly hang
                target.Offset(, 2) = Rng.Offset(, 2) ' chon dong don gia ben quang ly hang
            End If
        End If
     End If
Application.EnableEvents = True
End Sub


Ý em là MUỐNG cài thêm một cái if nữa nếu MH =0 THÌ TÊN HÀNG VÀ GIÁ XE KO HIỆN LÊN
 
Upvote 0
Ý em là MUỐNG cài thêm một cái if nữa nếu MH =0 THÌ TÊN HÀNG VÀ GIÁ XE KO HIỆN LÊN

chứ theo như hiện nay bạn gõ số 0 vào cột A sheet1 thì nó hiện ra cái gì?

============
code thất là khó hiểu
dòng code này có ý nghĩa gì vậy
Mã:
For Each Cll In Intersect(Target, [A:A])
 
Upvote 0
chứ theo như hiện nay bạn gõ số 0 vào cột A sheet1 thì nó hiện ra cái gì?

============
code thất là khó hiểu
dòng code này có ý nghĩa gì vậy
Mã:
For Each Cll In Intersect(Target, [A:A])

là để ghi được nhiều ô 1 lúc
bạn qua sheet2 copy vùng A5:A7 rồi quay về sheet1 select A2 -> paste
 
Upvote 0
chứ theo như hiện nay bạn gõ số 0 vào cột A sheet1 thì nó hiện ra cái gì?

============
code thất là khó hiểu
dòng code này có ý nghĩa gì vậy
Mã:
For Each Cll In Intersect(Target, [A:A])

CÁI NÀY LÀ EM LẤY TRÊN DIỄN ĐẠT ĐÓ ANH EM DANG HỌC HỌC VIẾT CODE NÊN EM CŨNG KO HIỂU LẮM
MÀ ANH ƠI NẾU MÌNH CHO Ở MH LÀ KO CÓ DỮ LIỆU THÌ MH VÀ TRN HÀNG XE KO HIỆN
KHÔNG CẦN BẤM SỐ 0 THÌ MÌNH PHẢI LÀM SAO VẬY ANH
NO Y NHU CAI HAM THE NAY
=IF(A2=0;"";VLOOKUP(A2;Sheet2!$A$5:$C$7;2;0))
EM LÀ THÀNH VIÊN MỚI CÓ GÌ ANH CHỊ GIÚP
 
Upvote 0
bạn có là thành viên mới hay thành viên già cú đế gì thì cứ nêu rõ các vấn đề lên tự khắc sẽ có người giúp . không cần nói mình là thành viên mới
 
Upvote 0
Hình như code trên nó tìm không tháy bên sheet danh mục hàng thì nó tự Clear mà......sao lại if bằng 0, trừ phi bên danh mục hàng bạn gõ vào cột mã hàng số 0..........

Hay là ý bạn chắc là nói :..............sau khi gõ V16 , code tự động chạy ra tên hàng + giá. Nếu bạn xóa V16 đi, thì tên hàng + giá tự động xóa theo hả...???


đúng rồi ý đó đó có thể giúp mình đc ko , khi mình xóa thì tên hàng và giá cũng xóa theo đó
 
Upvote 0
Thử vậy xem
[GPECODE=vb]
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range, Rng As Range
If Target.Column <> 1 Then Exit Sub 'DEM DO COT TOI MA HANG SHEET 1
For Each Cll In Intersect(Target, [A:A]) '[A:A]mh Sheet1
Set Rng = Sheet2.[A:A].Find(Cll, LookAt:=xlWhole) '[A:A] MA HANG SHEET2
If Cll = "" Then
Cll.Offset(, 1).ClearContents
Cll.Offset(, 2).ClearContents
Else
If Cll <> "" Then
If Rng Is Nothing Then
Cll.Offset(, 0).ClearContents
Else
Cll.Offset(, 1) = Rng.Offset(, 1) 'chon dong ten hang ben quang ly hang
Cll.Offset(, 2) = Rng.Offset(, 2) ' chon dong don gia ben quang ly hang
End If
End If
End If
Next
End Sub
[/GPECODE]


cảm ơn đúng ý mình rồi :-=
 
Upvote 0
Túm nó lại một chút coi.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range, sRng As Range, Rng As Range
Set sRng = Sheet2.Range("A5:A100")
If Not Intersect(Target, Range("A2:A1000")) Is Nothing Then
    For Each Cll In Target
        If Cll = Empty Then
            Cll(, 2).Resize(, 2).ClearContents
        Else
            Set Rng = sRng.Find(Cll, LookAt:=xlWhole)
            If Rng Is Nothing Then
                Cll(, 2) = "TIA TU TIM DI,TUI THUA ROI."
            Else
                Cll(, 2) = Rng(, 2)
                Cll(, 3) = Rng(, 3)
            End If
        End If
    Next Cll
End If
Set sRng = Nothing
Set Rng = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Túm nó lại một chút coi.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range, sRng As Range, Rng As Range
Set sRng = Sheet2.Range("A5:A100")
If Not Intersect(Target, Range("A2:A1000")) Is Nothing Then
    For Each Cll In Target
        If Cll = Empty Then
            Cll(, 2).Resize(, 2).ClearContents
        Else
            Set Rng = sRng.Find(Cll, LookAt:=xlWhole)
            If Rng Is Nothing Then
                Cll(, 2) = "TIA TU TIM DI,TUI THUA ROI."
            Else
                Cll(, 2) = Rng(, 2)
                Cll(, 3) = Rng(, 3)
            End If
        End If
    Next Cll
End If
Set sRng = Nothing
Set Rng = Nothing
End Sub

anh oi có đò được từ file khác ko anh
em muống dò từ file book2 sang file book1 dc ko anh
 

File đính kèm

Upvote 0
anh oi có đò được từ file khác ko anh
em muống dò từ file book2 sang file book1 dc ko anh

trong đoạn code mà bạn trích dẫn có dòng
Mã:
[COLOR=#0000BB][FONT=monospace][I]Set sRng [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Sheet2[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I].[/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Range[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"A5:A100"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])[/I][/FONT][/COLOR]
sửa lại thành
Mã:
[COLOR=#0000BB][FONT=monospace][I]Set sRng [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR]Workbooks("Book2.xlsm").Worksheets("Sheet1")[COLOR=#007700][FONT=monospace][I].[/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Range[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"A5:A100"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])[/I][/FONT][/COLOR]
 
Upvote 0
bạn có hiểu đoạn code mà bạn viết ?
nếu bạn không hiểu để mình nói sơ sơ
nếu ở book1 ta ghi 1 giá trị nào đó vào ô A2
sau đó ta copy ô A2 => select vùng A3:A33 => paste
code này giúp bạn mở file book2.xlsm lên và đóng lại liên tục ... 30 lần . nếu file book2.xlsm nhẹ thì không sao . nếu file book2.xlsm nặng 30MB thì sao ????

truy cập vào 1 file excel tôi chọn 1 trong 2 cách : hoặc là đóng hẳn hoặc là mở hẳn chứ tôi không bao giờ chọn kiểu nửa nạc nửa mỡ như này . nhưng đó chỉ là quan điểm cá nhân
 
Upvote 0
trong đoạn code mà bạn trích dẫn có dòng
Mã:
[COLOR=#0000BB][FONT=monospace][I]Set sRng [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Sheet2[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I].[/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Range[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"A5:A100"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])[/I][/FONT][/COLOR]
sửa lại thành
Mã:
[COLOR=#0000BB][FONT=monospace][I]Set sRng [/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]= [/I][/FONT][/COLOR]Workbooks("Book2.xlsm").Worksheets("Sheet1")[COLOR=#007700][FONT=monospace][I].[/I][/FONT][/COLOR][COLOR=#0000BB][FONT=monospace][I]Range[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I]([/I][/FONT][/COLOR][COLOR=#DD0000][FONT=monospace][I]"A5:A100"[/I][/FONT][/COLOR][COLOR=#007700][FONT=monospace][I])[/I][/FONT][/COLOR]


cảm ơn đã chỉ giáo :-=
chúc một ngày tốt lành
có cánh nào không cần mở book2 vẫn lấy đc dữ liệu ko bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Vào cái góc "Cơ Sở Dữ Liệu", tìm mấy bài đố vui đọc thử.
 
Upvote 0
Nhưng vẫn bị lỗi nếu gõ vào Mã hàng mà khi code find sang Book2, nếu mã hàng nãy không có bên book2 thì bị lỗi ngay dòng
.Close False mà tôi chưa biết cách sửa.
Tôi không có test code nhưng nếu bị như bạn nói thì bẫy lỗi cho nó:
[GPECODE=vb]
On Error GoTo hpkhuong
.Close False
hpkhuong: 'MsgBox "Sao no lai bi loi (Vi Ma hang khong có)!!! HIC HIC HIC"[/GPECode]
 
Lần chỉnh sửa cuối:
Upvote 0
bạn cứ đi tìm ở đâu xa xôi . trong khi bài #13 đã chỉ bạn rồi . người ta là tiền bối vẽ đường sẵn , sao bạn không đi ?
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range, sRng As Range, Rng As Range, wb As Workbook
If Not Intersect(Target, Range("A2:A1000")) Is Nothing Then
    Application.ScreenUpdating = False
    Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & "Book2.xlsm", 0, 1)
    Set sRng = wb.Worksheets("Sheet1").Range("A5:A100")
    For Each Cll In Target
        If Cll = Empty Then
            Cll(, 2).Resize(, 2).ClearContents
        Else
            Set Rng = sRng.Find(Cll, LookAt:=xlWhole)
            If Rng Is Nothing Then
                Cll(, 2) = "TIA TU TIM DI,TUI THUA ROI."
            Else
                Cll(, 2) = Rng(, 2)
                Cll(, 3) = Rng(, 3)
            End If
        End If
    Next Cll
    wb.Close False
    Application.ScreenUpdating = True
End If
Set sRng = Nothing
Set Rng = Nothing
End Sub
 
Upvote 0
Trong tường hợp lầy dữ liệu từ file khác thì tôi nghĩ dùng sự kiện ko phải là một sự lựa chọn ko hay
cứ mỗi lần gõ xong là nó chạy, tôi thấy có người đánh máy mấy rất tốc độ........như vậy nó cứ đóng rồi mở...đóng rồi mở?
tôi nghĩ là nên tạo cho nó một cái sub, gõ xong hết bấm một cái
còn vị nào có "số má" thì chơi luôn ADO hay gì đó.....hhihihiih
 
Upvote 0
Hixx! có cách nào bẫy lỗi mà không cần MsgBox thông báo không bác. Có nghĩa là nếu lỗi thì đóng luôn file,chứ đừng hiện MsgBox.
Hiện tại tôi test khi thêm Bẫy lỗi & MsgBox như bác bảo thì cho dù gõ đúng mã hàng hay không đúng : cái MsgBox vẫn xuất hiện..........suốt ah!

Hixxx!!! !$@!!!$@!!!$@!!
Híc. Tôi đã để dấu nháy đơn đằng trước rồi mà (Nghĩa là thích thì để không thì thôi) . Không cần Msgbox vẫn chạy thôi. Mặt khác cũng có cách nghĩ như giống #27 nên chẳng có kiểm tra code làm gì.
 
Upvote 0
Nếu mình đò thêm sheet 2 của book2 qua sheet 1 CUA BOOK1 nữa thì có được ko mọi người
sheet 2 mình thêm
họ và tên
điện thoại
địa chỉ
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
các bạn cho tôi hỏi:
liệu có cách nào dùng vlookup mà không cần mở file?
vì đối với hàm vlookup trên worksheet, nó có thể cập nhật số liệu mà ko cần mở file nguồn,
vậy liệu vba có làm được việc đó ko
giống vậy nè
Mã:
 Set RNG_LOOKUP = "E:\New folder\[Book2.xlsm]Sheet1'!R4C1:R1000C3"
                    Cll.Offset(, 1) = Application.VLookup(Cll.Value, RNG_LOOKUP, 2, 0)
 
Upvote 0
các bạn cho tôi hỏi:
liệu có cách nào dùng vlookup mà không cần mở file?
vì đối với hàm vlookup trên worksheet, nó có thể cập nhật số liệu mà ko cần mở file nguồn,
vậy liệu vba có làm được việc đó ko
giống vậy nè
Mã:
 Set RNG_LOOKUP = "E:\New folder\[Book2.xlsm]Sheet1'!R4C1:R1000C3"
                    Cll.Offset(, 1) = Application.VLookup(Cll.Value, RNG_LOOKUP, 2, 0)

ai mà biết được có cái quỉ gì trong hàm vlookup . ở mấy bài trước bạn có nhắc đến chữ ADO mà sao giờ còn hỏi
cho tôi mượn code ở trên viết thêm 2 dòng
Mã:
If Target.Address = "$B$1" Then
    'With Workbooks.Open(ThisWorkbook.Path & "\Book2.xlsm", 0)
        Sheet1.Range("B2").FormulaR1C1 = "=VLOOKUP(R1C2,[Book2.xlsm]Sheet2!R2C1:R1000C3,2,0)"
        Sheet1.Range("B3").FormulaR1C1 = "=VLOOKUP(R1C2,[Book2.xlsm]Sheet2!R2C1:R1000C3,3,0)"
        Sheet1.Range("B2").Value = Sheet1.Range("B2")
        Sheet1.Range("B3").Value = Sheet1.Range("B3")
    '.Close False
    'End With
    End If
vậy là trong kết quả không còn nhìn thấy vlookup =)) (trả lời cho câu hỏi liệu vba có làm được việc đó ko)
 
Upvote 0
ai mà biết được có cái quỉ gì trong hàm vlookup . ở mấy bài trước bạn có nhắc đến chữ ADO mà sao giờ còn hỏi
cho tôi mượn code ở trên viết thêm 2 dòng
Mã:
If Target.Address = "$B$1" Then
    'With Workbooks.Open(ThisWorkbook.Path & "\Book2.xlsm", 0)
        Sheet1.Range("B2").FormulaR1C1 = "=VLOOKUP(R1C2,[Book2.xlsm]Sheet2!R2C1:R1000C3,2,0)"
        Sheet1.Range("B3").FormulaR1C1 = "=VLOOKUP(R1C2,[Book2.xlsm]Sheet2!R2C1:R1000C3,3,0)"
        Sheet1.Range("B2").Value = Sheet1.Range("B2")
        Sheet1.Range("B3").Value = Sheet1.Range("B3")
    '.Close False
    'End With
    End If
vậy là trong kết quả không còn nhìn thấy vlookup =)) (trả lời cho câu hỏi liệu vba có làm được việc đó ko)

một bài học hay cho mọi người tham khảo
 
Upvote 0
Thử sửa lại vậy đi:
[GPECODE=vb]
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Dim Cll As Range, Rng As Range
If Target.Address = "$B$1" Then
With Workbooks.Open(ThisWorkbook.Path & "\Book2.xlsm", 0)
Sheet1.Range("B2").FormulaR1C1 = "=VLOOKUP(R1C2,[Book2.xlsm]Sheet2!R2C1:R1000C3,2,0)"
Sheet1.Range("B3").FormulaR1C1 = "=VLOOKUP(R1C2,[Book2.xlsm]Sheet2!R2C1:R1000C3,3,0)"
.Close False
End With
End If
If Target.Column <> 1 Then Exit Sub
With Workbooks.Open(ThisWorkbook.Path & "\Book2.xlsm", 0)
For Each Cll In Intersect(Target, [A5:A1000])
Set Rng = Workbooks("Book2.xlsm").Worksheets("Sheet1").[A5:A1000].Find(Cll, LookAt:=xlWhole)
If Cll = "" Then
Cll.Offset(, 1).ClearContents
Cll.Offset(, 2).ClearContents
Else
If Cll <> "" Then
If Rng Is Nothing Then
Cll.Offset(, 0).ClearContents
Else
Cll.Offset(, 1) = Rng.Offset(, 1)
Cll.Offset(, 2) = Rng.Offset(, 2)
End If
End If
End If
Next
On Error Resume Next
.Close False
End With
Application.ScreenUpdating = True
End Sub
[/GPECODE]


cảm ơn bạn đã đóng góp ý kiến
 
Upvote 0
ai mà biết được có cái quỉ gì trong hàm vlookup . ở mấy bài trước bạn có nhắc đến chữ ADO mà sao giờ còn hỏi
cho tôi mượn code ở trên viết thêm 2 dòng
Mã:
If Target.Address = "$B$1" Then
    'With Workbooks.Open(ThisWorkbook.Path & "\Book2.xlsm", 0)
        Sheet1.Range("B2").FormulaR1C1 = "=VLOOKUP(R1C2,[Book2.xlsm]Sheet2!R2C1:R1000C3,2,0)"
        Sheet1.Range("B3").FormulaR1C1 = "=VLOOKUP(R1C2,[Book2.xlsm]Sheet2!R2C1:R1000C3,3,0)"
        Sheet1.Range("B2").Value = Sheet1.Range("B2")
        Sheet1.Range("B3").Value = Sheet1.Range("B3")
    '.Close False
    'End With
    End If
vậy là trong kết quả không còn nhìn thấy vlookup =)) (trả lời cho câu hỏi liệu vba có làm được việc đó ko)

hay
nhưng ko phải cái mình tìm
 
Upvote 0

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

Back
Top Bottom