Giúp dùm mình viết code thay thế hàm vlookup và code update (2 người xem)

Liên hệ QC

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

phucuongn

Thành viên mới
Tham gia
25/7/09
Bài viết
15
Được thích
5
Chào các anh chị trên diễn đàn ! mình có một vấn đề nhờ các anh chị giúp mình
Mình có một file gồm 3 sheet (data, chitiet,tonghop)
mình muốn khi nhập dữ liệu ở sheet chitiet thì sheet này dò tìm ở sheet data để lấy dữ liệu qua
sau đó mình nhấn nút send thì các dữ liệu ở sheet chitiet sẽ gửi qua sheet tonghop để lưu lại hàng ngày
đồng thời xóa dữ liệu ở sheet chitiet
Nhờ các anh chị giúp mình viết code thay thế hàm vlookup và code update khi nhấn nút send
cám ơn các anh chị rất nhiều
 

File đính kèm

1/ Hàm VLOOKUP trong VBA :
....
With Sheets("ChiTiet")
.Range("B7")=WorksheetFunction.Vlookup(.Range("A7"),Sheets("data").Range("A2:R500"),4,0)
.....
End With

2/ Cập nhật
....
n = Sheets("TongHop").Range("A65000").End(xlUp).Row
For i = 1 To 16
Sheets("TongHop").Cells(n+1,i)=Sheets("ChiTiet").Cells(7,i)
Next
 
Upvote 0
Cụ thể hơn nữa cho bạn đây

Vì cột 'A' trong trang 'Chi tiet' có dữ liệu đến dòng 26; Vậy cho nên quy trình vận hành có đổi chuyển xíu, như sau:

Để xóa các records đã nhập & chuyển sang 'Tong hop', ta cần chọn [C3] & {ENTER} là xuất hiện hộp thoại & ta OK là xong.
 

File đính kèm

Upvote 0
Chào Bạn ! Cám ơn bạn rất nhiều. Nhưng còn phần send và xóa nhờ bạn sửa lại giúp mình một chút nha
Phần vlookup bạn đã làm theo đúng theo ý của mình rồi .
Phần cập nhật bạn sửa lại giúp mình một chút
File của bạn khi bấm nút send nó chỉ có copy qua có cột ngày thôi các cột khác nó không qua sheet "tonghop"
còn khi xóa thì hơi bị rắc rối. Nếu lỡ tay chọn ngay ô [C3] & {ENTER} thì dữ liệu bị xóa hết chưa có kịp send.
Nhờ bạn sửa lại giúp là
Khi nhấn nút SEND thì xuất hiện hộp hội thoại xác nhận "Yes" hay "No" nếu Yes thì copy dữ liệu từ sheet chitiet qua sheet tonghop
đồng thời sẽ xóa luôn dữ liệu ở sheet chitiet . bạn viết thêm giúp ở [C3] mình muốn hiện ngày hệ thống nhưng có thể sửa lại được
cám ơn bạn rất nhiều .
 
Upvote 0
Theo mình thì không cần xóa sau khi chép đâu

Mà bạn nhập ngày mới vô C3 thì dữ liệu ngày cũ sẽ bị xóa; Còn không thì để xem, cũng sẽ tiên việc biết rằng dữ liệu đó đã được nhập rồi.

Còn đây là thêm 3 dòng lệnh hỏi bạn việc chép dòng mà bạn đã chọn hay không:

PHP:
Option Explicit
Sub TongHop()
 Dim Sh As Worksheet, Rws As Long, MyColor As Byte
 
 Set Sh = Sheets("Tong hop"):       Rws = Selection.Row
0 MyColor = MsgBox("Ban Càn Chép Dòng " & Rws, vbYesNo + vbQuestion, "GPE")
1 If MyColor = 6 Then
   MyColor = [b3].Interior.ColorIndex + 1
   With Sh.[C65500].End(xlUp).Offset(1)
      .Offset(, -1).Value = [c3].Value
      .Resize(, 4).Value = Cells(Rws, "B").Resize(, 16).Value
   End With
   If MyColor > 42 Then MyColor = 34
   [b3].Interior.ColorIndex = MyColor
9 End If
End Sub
Nếu chưa muốn chéo thì báo cho nó biết, bằng cách nhấn vô 'No', để nó không chép.

Bạn thêm 3 dòng lệnh có đánh số, hay copy & chép đè lên toàn bộ macro cũ

Thân ái & chúc tuần làm việc thành công!
 
Upvote 0
Cám ơn bạn có ý rất hay nhưng do tính chất công việc của mình là
MỘt ngày mình phải in cho từng nhân viên giao hàng trên sheet chitiet
Trên sheet "chitiet" dùng để in cho từng nhân viên giao hàng. MỘt người giao hàng có thể giao nhiều khách hàng
(mình cho từ dòng 7 đến dòng 26) .Sau khi in cho nhân viên A xong thì đến nhân viên B
Do đó dữ liệu của nhân viên A phải copy tòan bộ qua sheet "tonghop" lưu lại và xóa bên sheet chitiet đi để nhập dữ liệu và in cho nhân viên B
Cứ như vậy 1 ngày mình nhập dữ liệu và in cho nhiều nhân viên trên sheet chitiet.
file của bạn chỉ copy được có 1 dòng mà mình chọn .Ý mình muốn copy tòan bộ từ dòng 7 đến dòng 26.
Nhờ bạn sửa lại giúp mỗi lần send thì copy tòan bộ từ dòng 7 đến dòng 26 qua sheet tonghop
Cám ơn bạn rất nhiều
 
Upvote 0
Cảm thấy có lỗi do để bạn chờ lâu!

Bạn dùng con macro này thay cho macro cùng chức năng bên trên:

PHP:
Option Explicit
Sub TongHop()
 Dim Sh As Worksheet, Rws As Long, MyColor As Byte
 Dim Cls As Range, Rng As Range
 
 Set Sh = Sheets("Tong hop")
 Rws = Range([B7], [B7].End(xlDown)).Rows.Count
 MyColor = _
   MsgBox("Ban Càn Chép Sang 'TongHop' " & Rws & " Dòng?", vbYesNo + vbQuestion, "GPE")
 If MyColor = 6 Then
   MyColor = [b3].Interior.ColorIndex + 1
   Set Rng = Sh.[C65500].End(xlUp).Offset(1)
   With Rng
      .Offset(, -1).Resize(Rws).Value = [c3].Value
      .Resize(Rws, 16).Value = Cells(7, "B").Resize(Rws, 16).Value
   End With
5 ' Null Amount If Inv Type<> "Z000"'
   For Each Cls In Rng.Offset(, 5).Resize(Rws)
      If Cls.Value <> "Z000" Then Cls.Offset(, 1).Value = ""
6   Next Cls
   If MyColor > 42 Then MyColor = 34
   [b3].Interior.ColorIndex = MyColor
   [B7].Resize(Rws, 16).Value = ""
 End If
End Sub
Chú í thêm:
Giữa các dòng được đánh số là các lệnh để biến cột [Thành tiền] => Null một khi cột bên trái liền kề không chứa 'Z000'
Nếu không cần thì bạn bỏ hay vô hiệu hóa giúp các dòng đó đi nha.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cám ơn bạn rất nhiều ,bạn đã làm theo đúng ý của mình rồi nhưng khi chạy thử có sai 1 chút nhờ bạn sửa lại giúp nha.
1. Khi dữ liệu ở sheet chitiet có 1 dòng thì thì send nó báo copy đến 65550 dòng lận đó.
2. Nếu bên sheet tonghop chưa có dòng dữ liệu nào thì khi send từ sheet chitiet (có nhiều dòng) thì nó chỉ copy qua có 1 dòng đầu
Khi nào bên sheet tonghop có dữ liệu rồi thì copy mới đúng.
3. Nhờ bạn sửa lại giúp 1 chút nữa nha, mình muốn bỏ cột M "nhân viên giao hàng" cho nó lên [C4] giống như ngày vậy đó vì 1 lần in chỉ có 1 người thôi.
Cám ơn bạn rất nhiều ! xong vụ này mình mời bạn 1 chầu cafe
 
Upvote 0
He,he, sắp được uống càfê rồi, bà con ơi.

Bạn dùng đoạn mã này với các chú í sau:

(1) Bạn chưa nói với tôi là bạn sẽ bỏ hay không bỏ cột 'M' của 'Chi Tiet' đó nha.

(2) Bạn có vẻ coi thường tiếng mẹ đẻ đó nha, thì đây:
(Tại trang tính 'Tong Hop') cớ sao [B6:C6] không có tiếng Việt, mà các ô khác sau nó trong hàng có đủ vậy?
Bạn fải có chính sách nhất quán trong CSDL mới được. (Thật ra trong bản thử của mình đã chỉnh lại nhưng quên truyền thông đến bạn đó thôi. Giờ bạn chỉnh lại trước khi cho macro chạy, nha.)
PHP:
Option Explicit
Sub TongHop()
 Dim Sh As Worksheet, Rws As Long, MyColor As Byte
 Dim Cls As Range, Rng As Range
 
 Set Sh = Sheets("Tong hop")
 Rws = Range([B7], [B7].End(xlDown)).Rows.Count
1 If Rws > 99 Then Rws = 1
 MyColor = _
   MsgBox("Ban Càn Chép Sang 'TongHop' " & Rws & " Dòng?", vbYesNo + vbQuestion, "GPE")
 If MyColor = 6 Then
   MyColor = [b3].Interior.ColorIndex + 1
   Set Rng = Sh.[C65500].End(xlUp).Offset(1)
   With Rng
      .Offset(, -1).Resize(Rws).Value = [c3].Value
      .Resize(Rws, 16).Value = Cells(7, "B").Resize(Rws, 16).Value
3      .Offset(, 11).Resize(Rws).Value = [c4].Value
   End With
5 ' Null Amount If Inv Type<> "Z000"'
   For Each Cls In Rng.Offset(, 5).Resize(Rws)
      If Cls.Value <> "Z000" Then Cls.Offset(, 1).Value = ""
   Next Cls
   If MyColor > 42 Then MyColor = 34
   [b3].Interior.ColorIndex = MyColor
   [B7].Resize(Rws, 16).Value = ""
 End If
End Sub
 
Upvote 0
Cám ơn bạn rất nhiều, Bạn chuẩn bị sắp xếp thời gian để uống cafe được rồi đó.
Mình mới test thử thấy ok rồi , nhưng thời gian sử dụng lâu dài có trục trặc biết tìm bản ở đâu ?
Thôi hứa thì phải giữ lời ,mình mời bạn uống cafe nha, địa điểm do bạn chọn Đồng Nai, Bình Dương, TP HCM khu vực khác thì mình bó tay
Cám ơn tất cả các bạn nha !
DC mail : cuongnp75@yahoo.com.vn
 
Upvote 0
Giúp mình code cho hàm VLOOKUP này vơí.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Giúp mình code cho hàm VLOOKUP này vơí.
Bạn Record Macro là ra code ngay thôi mà.
Sau khi Record Macro và chỉnh lại một chút (giữ nguyên công thức của bạn) thì được code như sau:
[GPECODE=vb]Sub Macro1()
Sheet1.Range("J6:J" & Sheet1.[I65000].End(xlUp).Row).FormulaR1C1 = "=IF(RC[-1]=0,"""",VLOOKUP(RC[-1],MLNS,3,0))"
End Sub[/GPECODE]
 
Upvote 0
Bạn Record Macro là ra code ngay thôi mà.
Sau khi Record Macro và chỉnh lại một chút (giữ nguyên công thức của bạn) thì được code như sau:
[GPECODE=vb]Sub Macro1()
Sheet1.Range("J6:J" & Sheet1.[I65000].End(xlUp).Row).FormulaR1C1 = "=IF(RC[-1]=0,"""",VLOOKUP(RC[-1],MLNS,3,0))"
End Sub[/GPECODE]
chào anh, em muốn chuyển hàm thành code vba chứ làm theo macro em làm được rồi anh, ví dụ file em gửi có phần change em muốn sau khi nhập số vào thì tự nhảy. trong file có hàm if lồng với hàm vlook up
 
Upvote 0
chào anh, em muốn chuyển hàm thành code vba chứ làm theo macro em làm được rồi anh, ví dụ file em gửi có phần change em muốn sau khi nhập số vào thì tự nhảy. trong file có hàm if lồng với hàm vlook up
Tôi dùng code này cho Sheet1 (tạm thời khóa Sub Worksheet_Change của bạn lại để kiểm tra nhé):
[GPECODE=vb]Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range, Rng As Range
If Target.Column <> 9 Then Exit Sub
For Each Cll In Intersect(Target, [I:I])
If Cll <> "" Then
Set Rng = Sheet2.[A:A].Find(Cll, LookAt:=xlWhole)
If Rng Is Nothing Then
Cll.Offset(, 1).ClearContents
Else
Cll.Offset(, 1) = Rng.Offset(, 2)
End If
End If
Next
End Sub[/GPECODE]
Xin hỏi lại bạn một chút: Trên cột A của Sheet2 có nhiều giá trị trùng nhau, vậy thì bạn muốn xử lý tình huống này như thế nào? Trong code trên, tôi xử lý theo hướng lấy giá trị đầu tiên tìm được.
 
Upvote 0
em cảm ơn anh, cái MLNS là em đặt tên define name mục đích là nếu cột i bắt đầu từ i6 = 0 thì để ký tự rỗng, còn >0 thì dò trong MLNS trong đó có 3 cột thì tương ứng với cell cột i sheet 1 thì lấy giá trị MLNS điền vào các giá trị cột A, B sheet 2 không ảnh hưởng đến việc lấy giá trị của cột C
 
Upvote 0
em cảm ơn anh, cái MLNS là em đặt tên define name mục đích là nếu cột i bắt đầu từ i6 = 0 thì để ký tự rỗng, còn >0 thì dò trong MLNS trong đó có 3 cột thì tương ứng với cell cột i sheet 1 thì lấy giá trị MLNS điền vào các giá trị cột A, B sheet 2 không ảnh hưởng đến việc lấy giá trị của cột C
Nãy giờ tôi "nghiền ngẫm" từng từ trong bài của bạn mà thiệt tình là tôi chẳng hiểu bạn đang viết cái gì cả (hình như tôi dốt văn quá mất rồi!
Tôi muốn bạn xác nhận lại: Trường hợp cột A của Sheet2 có nhiều giá trị trùng nhau thì bạn xử lý ra sao? Chẳng hạn: Tại ô I6 của Sheet1, tôi nhập số 5 thì ô J6 phải lấy giá trị nào trong 2 số: 99 và 8?
Thêm nữa, cột B trên Sheet2 có đóng vai trò gì trong bài toán tìm kiếm này không?
 
Upvote 0
Nãy giờ tôi "nghiền ngẫm" từng từ trong bài của bạn mà thiệt tình là tôi chẳng hiểu bạn đang viết cái gì cả (hình như tôi dốt văn quá mất rồi!
Tôi muốn bạn xác nhận lại: Trường hợp cột A của Sheet2 có nhiều giá trị trùng nhau thì bạn xử lý ra sao? Chẳng hạn: Tại ô I6 của Sheet1, tôi nhập số 5 thì ô J6 phải lấy giá trị nào trong 2 số: 99 và 8?
Thêm nữa, cột B trên Sheet2 có đóng vai trò gì trong bài toán tìm kiếm này không?

em cảm ơn anh, bài này của em là khi nhập giá trị vào cột i sheet thì giá trị cột A sheet2 là tương ứng. còn giá trị thì chỉ lấy 1 lần chẳng hạn đã lấy 99 thì chỉ lấy 99 ko lấy 8 nữa. em thử code của anh rồi nó chạy như mong muốn của em. em cảm ơn anh nhiều. anh cho em biết ym của anh với có gì cho em được hỏi và học code từ anh với.
 
Upvote 0
em cảm ơn anh, bài này của em là khi nhập giá trị vào cột i sheet thì giá trị cột A sheet2 là tương ứng. còn giá trị thì chỉ lấy 1 lần chẳng hạn đã lấy 99 thì chỉ lấy 99 ko lấy 8 nữa. em thử code của anh rồi nó chạy như mong muốn của em. em cảm ơn anh nhiều. anh cho em biết ym của anh với có gì cho em được hỏi và học code từ anh với.
Code chạy đúng như mong muốn của bạn là tốt rồi.

Tôi không có dùng Y!M và nói chung là các phần mềm chat. Có vấn đề gì, chúng ta cùng trao đổi trên GPE luôn. Thực ra thì tôi cũng đang học, và tôi cũng muốn được học nhiều hơn từ các thành viên khác, chắc gì cách giải quyết của tôi đã hay?! Có thể các thành viên khác có nhiều cách giải quyết hay hơn. Vì vậy, nếu chúng ta trao đổi các vấn đề ở trên này thì cả tôi, bạn và nhiều thành viên khác cùng được học hỏi lẫn nhau. Vậy nhé!

Thân mến!
 
Upvote 0
Web KT

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

Back
Top Bottom