Nhờ mọi người giúp viết code sao chép có điều kiện không làm ảnh hưởng đến các ô khác

Liên hệ QC

vuminh1601

Thành viên thường trực
Tham gia
7/9/07
Bài viết
336
Được thích
354
Nghề nghiệp
Kế toán
Công việc hàng tháng mình phải làm là, sao chép số liệu kỳ trước sang kỳ này và cập nhật số liệu đúng hàng và cột. Nếu dùng công thức kéo xuống thì ảnh hưởng đến công thức, số liệu của ô khác. Làm thủ công từng lần copy thì lâu. Mình nhờ các tiền bối giúp cho cái code này với.

1, Tìm trên cột C giá trị dòng = "Cur" thì copy số liệu ở cột F tương ứng. sau đó tìm trên cột C giá trị dòng = "Pre" thì past vào cột E. thực hiện cho toàn bộ dữ liệu.
2,Cập nhật số liệu từ sheet"xuat" vào cột C và D theo tương ứng các mặt hàng ở cột B (VD: như link công thức C8 và D8) cập nhật nhưng không làm ảnh hưởng đến các dòng số liệu khác.

Vấn đề này chắc VBA giải quyết được. Mọi người giúp tôi với. Xin cám ơn!
 

File đính kèm

  • copy past co dieu kien.xls
    38 KB · Đọc: 15
Công việc hàng tháng mình phải làm là, sao chép số liệu kỳ trước sang kỳ này và cập nhật số liệu đúng hàng và cột. Nếu dùng công thức kéo xuống thì ảnh hưởng đến công thức, số liệu của ô khác. Làm thủ công từng lần copy thì lâu. Mình nhờ các tiền bối giúp cho cái code này với.

1, Tìm trên cột C giá trị dòng = "Cur" thì copy số liệu ở cột F tương ứng. sau đó tìm trên cột C giá trị dòng = "Pre" thì past vào cột E. thực hiện cho toàn bộ dữ liệu.
2,Cập nhật số liệu từ sheet"xuat" vào cột C và D theo tương ứng các mặt hàng ở cột B (VD: như link công thức C8 và D8) cập nhật nhưng không làm ảnh hưởng đến các dòng số liệu khác.

Vấn đề này chắc VBA giải quyết được. Mọi người giúp tôi với. Xin cám ơn!
Nếu đúng cấu trúc dữ liệu của bạn như thế có thể dùng code này:
Mã:
Public Sub copy()
    Dim Vung, Cll, VungIt, I
      Set VungIt = Range([b8], [b500].End(xlUp))
        For I = 1 To VungIt.Rows.Count Step 7
            VungIt(I).Offset(0, 1).FormulaR1C1 = "=VLOOKUP(RC[-1],bang,2,0)"
            VungIt(I).Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC[-2],bang,3,0)"
            VungIt(I).Offset(0, 1).Resize(, 2).Value = VungIt(I).Offset(0, 1).Resize(, 2).Value
        Next
                Set Vung = Range([c8], [c1000].End(xlUp))
                    For Each Cll In Vung
                        If Cll = "Cur" Then Cll.Offset(-1, 2).Value = Cll.Offset(0, 3).Value
                    Next
End Sub
"Bi" giờ mới nghĩ ra, câu thứ 2 đâu cần "kót, kiết" gì, cứ dùng Vlookup bình thường thôi mà, híc, đầu óc bị cái gi á.
 

File đính kèm

  • copy vung(1).rar
    19.3 KB · Đọc: 17
Lần chỉnh sửa cuối:
Upvote 0
Nếu đúng cấu trúc dữ liệu của bạn như thế có thể dùng code này:
Mã:
Public Sub copy()
    Dim Vung, Cll, VungIt, I
      Set VungIt = Range([b8], [b500].End(xlUp))
        For I = 1 To VungIt.Rows.Count Step 7
            VungIt(I).Offset(0, 1).FormulaR1C1 = "=VLOOKUP(RC[-1],bang,2,0)"
            VungIt(I).Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC[-2],bang,3,0)"
            VungIt(I).Offset(0, 1).Resize(, 2).Value = VungIt(I).Offset(0, 1).Resize(, 2).Value
        Next
                Set Vung = Range([c8], [c1000].End(xlUp))
                    For Each Cll In Vung
                        If Cll = "Cur" Then Cll.Offset(-1, 2).Value = Cll.Offset(0, 3).Value
                    Next
End Sub
"Bi" giờ mới nghĩ ra, câu thứ 2 đâu cần "kót, kiết" gì, cứ dùng Vlookup bình thường thôi mà, híc, đầu óc bị cái gi á.

Em cám ơn bác concogia đã giúp em, Nhưng em muốn thực hiện bước 1 trước bác ạ. Tức là copy cái dòng có chữ "cur" sau đó past lên dòng có chữ "Pre" ở cột E trước (Vì giá trị dòng "Cur" trên cột F được link từ công thức phía trên xuống. Bác xem F12=F8 mà F8=C8/D8 như vậy phải past value từ F12 lên E11 trước. Sau đó mới thực hiện bứơc 2 là cập nhật cột C và D từ Sheet"xuat".

Câu 2 mà dùng Vlookup thông thường kéo "dẹt" xuống hỏng hết các ô khác bác ạ.

EM sửa lại code của bác như thế này được không ah?

Option Explicit
Public Sub copy()
Dim Vung, Cll, VungIt, I
Set Vung = Range([c8], [c1000].End(xlUp))
For Each Cll In Vung
If Cll = "Cur" Then Cll.Offset(-1, 2).Value = Cll.Offset(0, 3).Value
Next
Set VungIt = Range([b8], [b500].End(xlUp))
For I = 1 To VungIt.Rows.Count Step 7
VungIt(I).Offset(0, 1).FormulaR1C1 = "=VLOOKUP(RC[-1],bang,2,0)"
VungIt(I).Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC[-2],bang,3,0)"
VungIt(I).Offset(0, 1).Resize(, 2).Value = VungIt(I).Offset(0, 1).Resize(, 2).Value
Next
End Sub


Bác giải giúp cho em đoạn này với
For I = 1 To VungIt.Rows.Count Step 7
VungIt(I).Offset(0, 1).FormulaR1C1 = "=VLOOKUP(RC[-1],bang,2,0)"
VungIt(I).Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC[-2],bang,3,0)"
VungIt(I).Offset(0, 1).Resize(, 2).Value = VungIt(I).Offset(0, 1).Resize(, 2).Value

Em mới "vọc vạch" xem nên chưa hiểu. cả cái name đôngh này nữa bang=OFFSET(xuat!$B$4,1,0,COUNTA(xuat!$B$5:$B$500),4) Tại vì E chỉ biết như giá trị bang phải là một mảng trong VLOOKUP
 
Upvote 0
Công việc hàng tháng mình phải làm là, sao chép số liệu kỳ trước sang kỳ này và cập nhật số liệu đúng hàng và cột. Nếu dùng công thức kéo xuống thì ảnh hưởng đến công thức, số liệu của ô khác. Làm thủ công từng lần copy thì lâu. Mình nhờ các tiền bối giúp cho cái code này với.

1, Tìm trên cột C giá trị dòng = "Cur" thì copy số liệu ở cột F tương ứng. sau đó tìm trên cột C giá trị dòng = "Pre" thì past vào cột E. thực hiện cho toàn bộ dữ liệu.
Với dữ liệu như file của bạn thì câu 1 này ta dùng AutoFilter trong nháy mắt
- AutoFiler cột C theo điều kiện = Pre
- Quét chọn cột E, từ dưới dòng tiêu đề đến dòng cuối cùng có dữ liệu
- Gõ vào thanh Formula công thức =F12 rồi bấm Ctrl + Enter

untitled.JPG

- Tiếp theo, Show All cột C
--------------
Nếu viết code, ta cũng dựa trên các thao tác như vậy, khỏi vòng lập
 
Upvote 0
Em cám ơn bác concogia đã giúp em, Nhưng em muốn thực hiện bước 1 trước bác ạ. Tức là copy cái dòng có chữ "cur" sau đó past lên dòng có chữ "Pre" ở cột E trước (Vì giá trị dòng "Cur" trên cột F được link từ công thức phía trên xuống. Bác xem F12=F8 mà F8=C8/D8 như vậy phải past value từ F12 lên E11 trước. Sau đó mới thực hiện bứơc 2 là cập nhật cột C và D từ Sheet"xuat".

Câu 2 mà dùng Vlookup thông thường kéo "dẹt" xuống hỏng hết các ô khác bác ạ.

EM sửa lại code của bác như thế này được không ah?

Option Explicit
Public Sub copy()
Dim Vung, Cll, VungIt, I
Set Vung = Range([c8], [c1000].End(xlUp))
For Each Cll In Vung
If Cll = "Cur" Then Cll.Offset(-1, 2).Value = Cll.Offset(0, 3).Value
Next
Set VungIt = Range([b8], [b500].End(xlUp))
For I = 1 To VungIt.Rows.Count Step 7
VungIt(I).Offset(0, 1).FormulaR1C1 = "=VLOOKUP(RC[-1],bang,2,0)"
VungIt(I).Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC[-2],bang,3,0)"
VungIt(I).Offset(0, 1).Resize(, 2).Value = VungIt(I).Offset(0, 1).Resize(, 2).Value
Next
End Sub


Bác giải giúp cho em đoạn này với
For I = 1 To VungIt.Rows.Count Step 7
VungIt(I).Offset(0, 1).FormulaR1C1 = "=VLOOKUP(RC[-1],bang,2,0)"
VungIt(I).Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC[-2],bang,3,0)"
VungIt(I).Offset(0, 1).Resize(, 2).Value = VungIt(I).Offset(0, 1).Resize(, 2).Value

Em mới "vọc vạch" xem nên chưa hiểu. cả cái name đôngh này nữa bang=OFFSET(xuat!$B$4,1,0,COUNTA(xuat!$B$5:$B$500),4) Tại vì E chỉ biết như giá trị bang phải là một mảng trong VLOOKUP
Cái name bang mình dùng offset để sau này bạn vô tư thêm dữ lệu mà không cần sửa địa chỉ (nó là một mảng 2 chiều với số cột cố định là 4, và số dòng linh động tùy dữ liệu nhập vào _ dữ liệu phải liên tục nhé bạn )
For I = 1 To VungIt.Rows.Count Step 7
- Cho biến I chạy từ 1 đến số hàng của vùng có tên VungIT (trong bài từ cell B8 trở xuống dưới tới hết dữ liệu, bước nhảy là 7: I=1, I=8, I=15...)
VungIt(I).Offset(0, 1).FormulaR1C1 = "=VLOOKUP(RC[-1],bang,2,0)"
VungIt(I):=> nếu I=1 thì đây là cell B8,Offset(0, 1): nhích qua bên phải 1 cell=> cell C8, gán công thức Vlookup.....
VungIt(I).Offset(0, 2).FormulaR1C1 = "=VLOOKUP(RC[-2],bang,3,0)"
-Giống phần trên
VungIt(I).Offset(0, 1).Resize(, 2).Value = VungIt(I).Offset(0, 1).Resize(, 2).Value
_Làm triệt tiêu công thức, nếu bạn muốn trong bảng có công thức Vloo.. ở C8, D8 ...thì xóa dòng này đi
Hy vọng bạn hiểu và làm ok, cứ sửa thoải mái cái code vì nó là của bạn mà, khi nào chạy như ý thì ngừng, còn chưa ổn thì .....làm tiếp
Híc, mình cũng võ vẽ như bạn thôi, "hổng" biết giải thích "zị" bạn có ok 'hông" nữa
Thân
Híc, viết xong bài này mới thấy bài của Thầy Ndu, mở topic khuyến khích người ta học viết về vòng lặp For..next, có bài để thực hành rồi lại khuyên "hổng nên" xài vòng lặp, ngộ
 
Lần chỉnh sửa cuối:
Upvote 0
Híc, viết xong bài này mới thấy bài của Thầy Ndu, mở topic khuyến khích người ta học viết về vòng lặp For..next, có bài để thực hành rồi lại khuyên "hổng nên" xài vòng lặp, ngộ
Học là 1 chuyện, ứng dụng lại là chuyện khác mà anh!
Chẳng lẽ anh học lái xe 4 bánh thì buộc lúc nào muốn di chuyển anh cũng phải... lái xe sao? (đi bộ nếu thấy quá gần)
Em nghĩ chọn giải pháp phù hợp cũng là TƯ DUY đấy!
Ẹc... Ẹc...
 
Upvote 0
Với dữ liệu như file của bạn thì câu 1 này ta dùng AutoFilter trong nháy mắt
- AutoFiler cột C theo điều kiện = Pre
- Quét chọn cột E, từ dưới dòng tiêu đề đến dòng cuối cùng có dữ liệu
- Gõ vào thanh Formula công thức =F12 rồi bấm Ctrl + Enter

View attachment 50702

- Tiếp theo, Show All cột C
--------------
Nếu viết code, ta cũng dựa trên các thao tác như vậy, khỏi vòng lập

Bác ơi phải pastvalue cơ ah! nếu chỉ là công thức thì đặt công thức một lần cho các tháng sau OK. Nếu pastvalue bác có cao kiến gì không? (thực ra trước đó em bật macro lên rồi làm thủ công copy rồi pastvalue lặp đi lặp lại cho toàn bộ dữ liệu, sang tháng sau chạy macro này cũng được) Nhưng tự thấy như vậy chưa thoả mãn muốn học hỏi cách làm của ACE trên GPE.
 
Upvote 0
Bác ơi phải pastvalue cơ ah! nếu chỉ là công thức thì đặt công thức một lần cho các tháng sau OK. Nếu pastvalue bác có cao kiến gì không? (thực ra trước đó em bật macro lên rồi làm thủ công copy rồi pastvalue lặp đi lặp lại cho toàn bộ dữ liệu, sang tháng sau chạy macro này cũng được) Nhưng tự thấy như vậy chưa thoả mãn muốn học hỏi cách làm của ACE trên GPE.
Thì bạn cứ Paste bằng tay, chẳng lẽ không được sao?
(Đương nhiên, trước khi copy\paste, hãy hủy AutoFilter)
 
Upvote 0
Web KT
Back
Top Bottom