Chuyển hàm thành VBA Code (1 người xem)

Liên hệ QC

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

Duong gia

Thành viên thường trực
Tham gia
15/1/07
Bài viết
352
Được thích
118
Nhờ các bạn chuyển giúp mình hàm sau thành VBA Code: =IF(ISERROR(VLOOKUP(F9;SCT_HH;VLOOKUP(D9;SCT_TK;5;0)+3;0));0;VLOOKUP(F9;SCT_HH;VLOOKUP(D9;SCT_TK;5;0)+3;0)) Bắt đầu từ dòng J9. Khi F9 hoặc D9 thay đổi thì nó sẽ đưa ra một giá bán tương ứng. Các bác chuyển giúp sang CODE để khi mình cập nhật mã khách hàng (Cột D), mã hàng hóa (Cột F) thì Cột J sẽ tự động đưa ra một giá tương ứng cho khách hàng đó. Tương tự dữ liệu này bắt đầu từ dòng 9 trở đi đến 1200. Cám ơn nhiều!
 
Lần chỉnh sửa cuối:
Mình mù mờ công thức lắm!

Bạn hãy cho biết địa chỉ của vùng SCT_HH & SCT_TK giúp cái, nha;
 
Upvote 0
Nếu không bí mật, đưa file lên cho dễ hình dung.
 
Upvote 0
Nhờ các bạn chuyển giúp mình hàm sau thành VBA Code:
=IF(ISERROR(VLOOKUP(F9;SCT_HH;VLOOKUP(D9;SCT_TK;5;0)+3;0));0;VLOOKUP(F9;SCT_HH;VLOOKUP(D9;SCT_TK;5;0)+3;0))
Bắt đầu từ dòng J9. Khi F9 hoặc D9 thay đổi thì nó sẽ đưa ra một giá bán tương ứng.
Các bác chuyển giúp sang CODE để khi mình cập nhật mã khách hàng (Cột D), mã hàng hóa (Cột F) thì Cột J sẽ tự động đưa ra một giá tương ứng cho khách hàng đó. Tương tự dữ liệu này bắt đầu từ dòng 9 trở đi đến 1200. Cám ơn nhiều!
Cái này mà viết UDF theo Find() là hay nhất. Bạn nên giả lập file. Tự tạo ra demo hơi phê.
1/ Phải xét đến VLOOKUP(D9;SCT_TK;5;0) có Isna ie phải kiểm tra countif(Range("SCT_TK").offset(0,1),D9) >0 ...
2/ Mới xét đến ...
 
Upvote 0
Phải hơn 1 giờ mới giả lập được file!

Cái này mà viết UDF theo Find() là hay nhất.

Đừng nghe hắn; So với 2 hàm VOOLKUP() lồng nhau chăng nữa vẫn nhanh hơn UDF, chắc vậy!

1/ Phải xét đến VLOOKUP(D9;SCT_TK;5;0) có Isna ie phải kiểm tra countif(Range("SCT_TK").offset(0,1),D9) >0 ...
2/ Mới xét đến ...

Điều này Hắn hoàn toàn đúng; Bạn hãy xét đến macro sự kiện trong file đính kèm như sau:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Union(Columns(4), Columns("F:F"))) Is Nothing Then
   Dim KHg As Range, HgH As Range, Sh As Worksheet, sRng As Range
   Dim Col As Byte
   
   Set Sh = Worksheets("Chuan")
   Set KHg = Sh.Range(Sh.[g4], Sh.[g65500].End(xlUp))
   Set HgH = Sh.Range(Sh.[A4], Sh.[A65500].End(xlUp))
   Set sRng = KHg.Find(Cells(Target.Row, 4).Value, , xlFormulas, xlWhole)
   If sRng Is Nothing Then
      Cells(Target.Row, "L") = "Chua Co Khach Hang Nay!"
   Else
      Col = sRng.Offset(, 1).Value
      Set sRng = HgH.Find(Cells(Target.Row, 6).Value)
      If sRng Is Nothing Then
         Cells(Target.Row, "L") = "Chua Co Ma Hang Nay!"
      Else
         Cells(Target.Row, "L") = sRng.Offset(, Col).Value
      End If
   End If
 End If
End Sub
 

File đính kèm

Upvote 0
Không cần dùng Find đâu Thi Nghi ơi, cái nhanh nhất vẫn lài cái hàm cơ hữu của nó. Lệnh find hữu hiệu hơn khi phải tìm kiếm nhiều dòng, trường hợp này chỉ tìm trên mỗi vùng đúng 1 dòng mà thôi.
Mình cho vẫn sử dụng tối đa công thức cũ nhưng gộp lại thành hàm UDF mà thôi. Riêng trong hàm để tránh lỗi, tốt nhất là đếm D9 trên SCT_TK>0 và F9 trên SCT_HH>0 và D9<>"",F9<>""
 
Upvote 0
Cái nhanh nhất vẫn lài cái hàm cơ hữu của nó. Lệnh find hữu hiệu hơn khi phải tìm kiếm nhiều dòng, trường hợp này chỉ tìm trên mỗi vùng đúng 1 dòng mà thôi.

Vậy bạn có có suy nghĩ rằng, tại sao tác gia Topic lại yêu cầu chuyển sang macro không?
Theo mình, vì dữ liệu của bạn ấy qua ư nhiều dòng; nếu là vạn dòng thì hàm cơ hữu của bạn chưa chắc bằng macro. (Mình cũng chưa thử đâu, . . . --=0 --=0 --=0)
 
Upvote 0
Đây là điều mà từ đầu chưa ai nói cho rõ, kể cả các ý kiến dùng UDF cũng không hợp lý. Cái bạn ấy muốn bỏ là không phải gắn hàng vạn công thức tìm kiếm này vào trang tính. Chỉ cần trên 1 dòng 2 cái ô Fn và Dn không trống thì điền cho cái giá vào đó (Điền bằng giá trị chứ không phải công thức)UDF chỉ đỡ hoa mắt thôi còn vẫn phải gắn cả cột công thức. Mỗi khi tính toán lại, Exc bớt đi hàng nhiều vạn công thức tính toán. Tốc độ chắc chắn được cải thiện.
Nhưng mình có cảm giác bạn không hiểu ý mình, mình muốn sử dụng luôn cái hàm Vlookup trong code, nó làm luôn 2 động tác là tìm và trả về chứ không phải là không dùng Macro
 
Upvote 0
Hiểu ý bạn chứ, & đã viết giữa chừng hàm tự tạo rồi!

Nhưng suy nghĩ lại, cho cả trang tính nhốc công thức hay hàm tự tạo đều cũng vậy; nên thôi viết tiếp nữa & chờ í tác giả topic ra sao đó. --=0 --=0 --=0

Chúc vui!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Dùng sub chứ bạn gắn vào sự kiện change là quá đẹp cho trường hợp này rồi.
 
Upvote 0
Đừng nghe hắn; So với 2 hàm VOOLKUP() lồng nhau chăng nữa vẫn nhanh hơn UDF, chắc vậy! Điều này Hắn hoàn toàn đúng; Bạn hãy xét đến macro sự kiện trong file đính kèm như sau:
PHP:
Option Explicit Private Sub Worksheet_Change(ByVal Target As Range)  If Not Intersect(Target, Union(Columns(4), Columns("F:F"))) Is Nothing Then    Dim KHg As Range, HgH As Range, Sh As Worksheet, sRng As Range    Dim Col As Byte      Set Sh = Worksheets("Chuan")    Set KHg = Sh.Range(Sh.[g4], Sh.[g65500].End(xlUp))    Set HgH = Sh.Range(Sh.[A4], Sh.[A65500].End(xlUp))    Set sRng = KHg.Find(Cells(Target.Row, 4).Value, , xlFormulas, xlWhole)    If sRng Is Nothing Then       Cells(Target.Row, "L") = "Chua Co Khach Hang Nay!"    Else       Col = sRng.Offset(, 1).Value       Set sRng = HgH.Find(Cells(Target.Row, 6).Value)       If sRng Is Nothing Then          Cells(Target.Row, "L") = "Chua Co Ma Hang Nay!"       Else          Cells(Target.Row, "L") = sRng.Offset(, Col).Value       End If    End If  End If End Sub
Bác làm ơn giải thích hộ đoạn Code trên giúp với. Sao khó hiểu quá. Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Bác làm ơn giải thích hộ đoạn Code trên giúp với. Sao khó hiểu quá. Thanks
Theo tôi, để chuyển công thức thành code 1 cách đơn giản nhất mà không cần phải suy nghĩ nhiều, sao bạn không "bê nguyên" công thức ấy vào code luôn
Chẳng hạn:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, Union(Columns(4), Columns("F:F"))) Is Nothing Then
   With Cells(Target.Row, 13)
     .Value = "=IF(ISERROR(VLOOKUP(RC[-7],HgH,VLOOKUP(RC[-9],KHg,2, 0)+1,0)),0,VLOOKUP(RC[-7],HgH,VLOOKUP(RC[-9],KHg,2,0 )+1,0))"
     .Value = .Value
   End With
 End If
End Sub
Lấy y chang công thức của bạn đưa vào, chẳng sửa gì cả
xem file (mượn tạm file của sư phụ)
 

File đính kèm

Upvote 0
Theo tôi, để chuyển công thức thành code 1 cách đơn giản nhất mà không cần phải suy nghĩ nhiều, sao bạn không "bê nguyên" công thức ấy vào code luôn Chẳng hạn:
PHP:
 Private Sub Worksheet_Change(ByVal Target As Range)  If Not Intersect(Target, Union(Columns(4), Columns("F:F"))) Is Nothing Then    With Cells(Target.Row, 13)      .Value = "=IF(ISERROR(VLOOKUP(RC[-7],HgH,VLOOKUP(RC[-9],KHg,2, 0)+1,0)),0,VLOOKUP(RC[-7],HgH,VLOOKUP(RC[-9],KHg,2,0 )+1,0))"      .Value = .Value    End With  End If End Sub
Lấy y chang công thức của bạn đưa vào, chẳng sửa gì cả xem file (mượn tạm file của sư phụ)
Cám ơn bác, tuyệt lắm. Thanks
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bác, tuyệt lắm. Thanks
Nói thật là tôi chẳng hiểu ý bạn muốn làm gì. Vì nếu chỉ cần như Ndu mà phải chuyển thành Code thì hơi uổng công. Sao không gõ luôn công thức vào cho rồi. Vì code của Ndu cũng chỉ là gán nội dung công thức vào 1 ô mà thôi. Và code này cũng không phải là hàm. Theo ý tôi hiểu ban đầu thì cần phải đi xây dựng 1 hàm với 4 tham số truyền vào lần lượt là HH_Lookup_Value, HH_Lookup_Range, TK_Lookup_Value, TK_Lookup_Range. Và khi cần dùng thì chỉ gọi ra để thực thi. Ví dụ tại ô cần tính toán bạn gõ =Test(F9,SCT_HH,D9,SCT_TK) thì sẽ ra kết quả thay cho cái công thức kia.
 
Upvote 0
Nói thật là tôi chẳng hiểu ý bạn muốn làm gì. Vì nếu chỉ cần như Ndu mà phải chuyển thành Code thì hơi uổng công. Sao không gõ luôn công thức vào cho rồi. Vì code của Ndu cũng chỉ là gán nội dung công thức vào 1 ô mà thôi. Và code này cũng không phải là hàm. Theo ý tôi hiểu ban đầu thì cần phải đi xây dựng 1 hàm với 4 tham số truyền vào lần lượt là HH_Lookup_Value, HH_Lookup_Range, TK_Lookup_Value, TK_Lookup_Range. Và khi cần dùng thì chỉ gọi ra để thực thi. Ví dụ tại ô cần tính toán bạn gõ =Test(F9,SCT_HH,D9,SCT_TK) thì sẽ ra kết quả thay cho cái công thức kia.
Tôi hình dung vấn đề như sau:
1> Nếu dùng công thức thường (đã có sẳn trong đầu) thì người ta phải mất công kéo fill công thức đến 1 số dòng nào đó ---> Gọi là dự trử (ví dụ kéo đến dòng 1000 dù chỉ mới nhập liệu có vài chục dòng)
2> Làm thế không có vấn đề, nhưng vô tình sẽ làm tăng dung lượng file không cần thiết
3> Nếu ta dùng phương pháp Copy\PasteSpeccial\Value thì vẫn... mệt, đã vậy lại mất luôn công thức mà ta tốn công xây dựng ban đầu (sau này muốn gõ lại cũng chẳng nhớ mà gõ)
4> Dù có xây dựng 1 hàm người dùng để rút gọn công thức trên thì cũng lại vướng phải trục trặc ở bước 1 (tức lại phải kéo fill công thức, tốn dung lượng)
-------------
Vậy bạn nghĩ xem, có phải phương pháp giữ nguyên công thức trong code, chuyển kết quả thành Value là hửu hiệu không? Nhập đến đâu, kết quả ra đến đó ---> Chả tốn hao dung lượng vì việc fill công thức tí nào
Tôi nghĩ từ cái vòng lẩn quẩn ở 4 bước trên mà có yêu cầu như topic này đây!
-------------
Có chăng là nên xem lại cách bố trí dử liệu (mà tác giả lại không file đưa lên) ---> Biết đâu tìm được phương pháp truy xuất dử liệu hiệu quả hơn!
 
Upvote 0
Tôi hình dung vấn đề như sau:
1> Nếu dùng công thức thường (đã có sẳn trong đầu) thì người ta phải mất công kéo fill công thức đến 1 số dòng nào đó ---> Gọi là dự trử (ví dụ kéo đến dòng 1000 dù chỉ mới nhập liệu có vài chục dòng)
2> Làm thế không có vấn đề, nhưng vô tình sẽ làm tăng dung lượng file không cần thiết
3> Nếu ta dùng phương pháp Copy\PasteSpeccial\Value thì vẫn... mệt, đã vậy lại mất luôn công thức mà ta tốn công xây dựng ban đầu (sau này muốn gõ lại cũng chẳng nhớ mà gõ)
4> Dù có xây dựng 1 hàm người dùng để rút gọn công thức trên thì cũng lại vướng phải trục trặc ở bước 1 (tức lại phải kéo fill công thức, tốn dung lượng)
-------------
Vậy bạn nghĩ xem, có phải phương pháp giữ nguyên công thức trong code, chuyển kết quả thành Value là hửu hiệu không? Nhập đến đâu, kết quả ra đến đó ---> Chả tốn hao dung lượng vì việc fill công thức tí nào
Tôi nghĩ từ cái vòng lẩn quẩn ở 4 bước trên mà có yêu cầu như topic này đây!
-------------
Có chăng là nên xem lại cách bố trí dử liệu (mà tác giả lại không file đưa lên) ---> Biết đâu tìm được phương pháp truy xuất dử liệu hiệu quả hơn!
Những vấn đề trên trong Excel có thể giải quyết đơn giản bằng đối tượng List rồi. Đâu cần phải làm phức tạp thế.
 
Upvote 0
Mình gửi file ví dụ các bạn tham khảo (Xin lỗi chưa ktra hết lỗi)
Ngoài việc điền đơn giá còn kiểm tra mã KH, mã HH

P/S: Mình gà gật buổi trưa nên các bạn đi xa qua rồi.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình gửi file ví dụ các bạn tham khảo (Xin lỗi chưa ktra hết lỗi)
Ngoài việc điền đơn giá còn kiểm tra mã KH, mã HH

P/S: Mình gà gật buổi trưa nên các bạn đi xa qua rồi.
Không rõ cấu trúc file dữ liệu của tác giả topic là như nào. Nhưng nếu là như file của sealand thì tôi mượn tạm file này và làm theo cách sau(Xem trong sheet3). Chứ cách của bạn mà nhập xong người dùng phải đợi con chuột nó quay quay 1 lúc thì khó chịu lắm.
 

File đính kèm

Upvote 0
EM CẦN GHÉP 2 CODE NÀY ĐỂ CHUNG THÌ PHẢI LÀM SAO CÁC ANH?
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Union(Columns(6), Columns("D:D"))) Is Nothing Then
With Cells(Target.Row, 5)
.Value = "=IF(ISNA(VLOOKUP(RC[-1],DVT,3, 0)),0,VLOOKUP(RC[-1],DVT,3,0 ))"
.Value = .Value
End With
End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Union(Columns(8), Columns("D:D"))) Is Nothing Then
With Cells(Target.Row, 7)
.Value = "=IF(ISNA(VLOOKUP(RC[-3],DVT,11, 0)),0,VLOOKUP(RC[-3],DVT,11,0 ))"
.Value = .Value
End With
End If
End Sub
 
Upvote 0
Chắc vầy, bạn thử coi sao

EM CẦN GHÉP 2 CODE NÀY ĐỂ CHUNG THÌ PHẢI LÀM SAO CÁC ANH?

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, Union(Columns(6), Columns("D:D"))) Is Nothing Then
       With Cells(Target.Row, 5)
                  .Value = "=IF(ISNA(VLOOKUP(RC[-1],DVT,3, 0)),0,VLOOKUP(RC[-1],DVT,3,0 ))"
             .Value = .Value
        End With
 '  End If '
' End Sub '
'Private Sub Worksheet_Change(ByVal Target As Range) '
   ElseIf Not Intersect(Target, Union(Columns(8), Columns("D:D"))) Is Nothing Then   '<=|'
      With Cells(Target.Row, 7)
            .Value = "=IF(ISNA(VLOOKUP(RC[-3],DVT,11, 0)),0,VLOOKUP(RC[-3],DVT,11,0 ))"
      .Value = .Value
      End With
 End If
 End Sub
 
Upvote 0
code trên em muốn nó điền vào cột E thì kết quả đúng
code dưới em muốn nó điền vào cột G nhưng không ra gì cả!
 
Upvote 0
code trên em muốn nó điền vào cột E thì kết quả đúng
code dưới em muốn nó điền vào cột G nhưng không ra gì cả!

Dòng If đầu nói rằng: Bạn đụng vô dòng nào đó thuộc cột 'D' & cột thứ 6 thì cột thứ 5 thuộc dòng đó sẽ được điền dữ liệu

Dòng lệnh ElseIf nói rằng bạn dụng vô dòng nào đó thuộc cột 8 thì giá trị sẽ được điền vô cột 7 cùng dòng;
(Ở dòng này có nói đến cột 'D', nhưng để chơi thôi; Nếu bạn đụng vô cột này thì VBA sẽ fải thi hành theo dòng lệnh If() trước ở trên rồi.)

Mình e rằng sửa nhiều quá bạn không nhận ra thôi. . . . .

Thân ái
 
Upvote 0
Nếu chỉ chọn dòng d thôi thì điền dử liệu vào cột 5 và cột 7 được không bạn
 
Upvote 0
Sửa giúp mình cái nào hyen17 ơi, thanks
 
Upvote 0
Mình thấy ghép thế này cũng được
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 Then
With Target.Offset(, 1)
.Value = "=IF(ISNA(VLOOKUP(RC[-1],DVT,3, 0)),0,VLOOKUP(RC[-1],DVT,3,0 ))"
.Value = .Value
End With
ElseIf Target.Column = 8 Then
With Target.Offset(, -1)
.Value = "=IF(ISNA(VLOOKUP(RC[-3],DVT,11, 0)),0,VLOOKUP(RC[-3],DVT,11,0 ))"
.Value = .Value
End With
End If
End Sub
Lưu ý: Mình chuyển theo nguyên mẫu nên công đoan không có kết quả (Hình như code phải là: .Value = "=IF(ISNA(VLOOKUP(RC[-4],DVT,11, 0)),0,VLOOKUP(RC[-4],DVT,11,0 ))"
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là đoạn mã sẽ điền dữ liệu vô cột 5 & 7 1 khi bạn đụng vô cột 'D'

Sửa giúp mình cái nào hyen17 ơi, thanks
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
  If Not Intersect(Target, Columns("D:D")) Is Nothing Then
      With Cells(Target.Row, 5)
           .Value = "=IF(ISNA(VLOOKUP(RC[-1],DVT,3, 0)),0,VLOOKUP(RC[-1],DVT,3,0 ))"
           .Value = .Value
     End With
    With Cells(Target.Row, 7)
           .Value = "=IF(ISNA(VLOOKUP(RC[-3],DVT,11, 0)),0,VLOOKUP(RC[-3],DVT,11,0 ))"
           .Value = .Value
     End With

  End If
End Sub

(Tuy chưa chỉnh chu lắm, nhưng bạn cần hiểu chúng cái đã)

Chúc thành công.
 
Upvote 0
Tốt rồi, cảm ơn các bạn nhiều nhiều
 
Upvote 0
HELP mọi người giúp em chuyển hàm thành code vba trên sheet1 với kiểu change.
 

File đính kèm

Upvote 0
HELP mọi người giúp em chuyển hàm thành code vba trên sheet1 với kiểu change.
Có 1 câu hỏi mà bạn gởi ở 3 topic khác nhau. Nếu không ai trả lời thì bạn nên xem lại câu hỏi của mình đi. Có gởi thêm 100 lần nữa cũng vậy thôi
 
Upvote 0

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

Back
Top Bottom