Cái này nhất thiết phải dùng code bạn? Mình dùng hàm như sau. Tuy nhiên mình không hiểu ý bạn trong file mình có đánh dấu đỏ và ghi chú. Bạn xem thử nhé.Rất mong các anh, em trên GPE xem và giúp về nhập kho có điều kiện, mong muốn được ghi rõ trong file đính kèm. Cám ơn
---Cái này nhất thiết phải dùng code bạn? Mình dùng hàm như sau. Tuy nhiên mình không hiểu ý bạn trong file mình có đánh dấu đỏ và ghi chú. Bạn xem thử nhé.
---Ý bạn là thế này phải không: Mỗi lần lập phiếu nhập kho tại sheet "Nhap", thì sheet "TonKho" sẽ được cập nhật ?
Đương nhiên đã tính đến vấn đề này, sau khi chạy code : in phiếu nhập kho, lưu vào kho theo điều kiện, sau cùng dữ liệu đã bị xóa trắng nên không thể có trường hợp cập nhật lần nữa ( phiếu trống)- Sau khi bạn lập phiếu nhập kho số 1 rồi thực hiện cập nhật Sheet "TonKho" (bằng cách nhấp chuột vào nút lệnh hay v.v...), Nếu lỡ quên, bạn thực hiện cập nhật lần nữa => Số liệu tồn kho sẽ sai !
Phiếu nhập kho được xử dụng như Form (dùng bảng tính) nên chỉ xử dụng 1 sheetBạn phải thường xuyên lập nhiều phiếu nhập kho, mỗi phiếu nhập kho lập trên 1 sheet, dẫn đến cần rất nhiều sheet
Access mình tệ lắm (nói chung cái nào cũng tệ ).Bạn nên dùng Access để thực hiện công việc theo dõi tồn kho thì hay hơn
Rất mong các anh, em trên GPE xem và giúp về nhập kho có điều kiện, mong muốn được ghi rõ trong file đính kèm. Cám ơn
Sub test()
Dim Cll As Range, Fcll As Range
For Each Cll In Range("i5", [i1000].End(xlUp))
If Cll = "NK" Then
With Sheets("TonKho")
On Error Resume Next
Set Fcll = .[a:a].Find(Cll(1, 2))
If Fcll Is Nothing Then
With .[a1000].End(xlUp)(2)
.Value = Cll(1, 2)
.Offset(, 2) = Cll(1, -3) * Cll(1, 0)
.Offset(, 4) = Cll(1, -6)
End With
Else: Fcll(1, 3) = Fcll(1, 3) + Cll(1, -3) * Cll(1, 0)
End If
End With
End If
Next Cll
End Sub
---Đứng tại sheet Nhap anh chạy thử code này coi sao :
PHP:Sub test() Dim Cll As Range, Fcll As Range For Each Cll In Range("i5", [i1000].End(xlUp)) If Cll = "NK" Then With Sheets("TonKho") On Error Resume Next Set Fcll = .[a:a].Find(Cll(1, 2)) If Fcll Is Nothing Then With .[a1000].End(xlUp)(2) .Value = Cll(1, 2) .Offset(, 2) = Cll(1, -3) * Cll(1, 0) .Offset(, 4) = Cll(1, -6) End With Else: Fcll(1, 3) = Fcll(1, 3) + Cll(1, -3) * Cll(1, 0) End If End With End If Next Cll End Sub
Và viết như thế này:With Sheets("TonKho")
On Error Resume Next
Set Fcll = .[a:a].Find(Cll(1, 2))
If Fcll Is Nothing Then
With .[a1000].End(xlUp)(2)
.Value = Cll(1, 2)
.Offset(, 2) = Cll(1, -3) * Cll(1, 0)
.Offset(, 4) = Cll(1, -6)
End With
Có khi nào báo lỗi chổ "đỏ"này không?For Each Cll In Range("i5", [i1000].End(xlUp))
---
Hướng dẫn dùm chổ "đỏ đỏ"này ptlong04x1 ơi, không hiểu nổi (viết tắt quá!)
Và viết như thế này:Mã:With Sheets("TonKho") On Error Resume Next [COLOR=Blue]'Nếu gặp lỗi thì thực hiện lệnh kế tiếp'[/COLOR] Set Fcll = .[a:a].Find(Cll(1, 2)) [COLOR=Blue]'Ô bên phải liền kề với ô Cll '[/COLOR] [COLOR=Blue]'*'[/COLOR] If Fcll Is Nothing Then With .[a1000].End(xlUp)(2) [COLOR=Blue]' Ô dưới của ô cuối cùng thuộc cột 'A' có dữ liệu'[/COLOR] .Value = Cll(1, 2) .Offset(, 2) = Cll(1, -3) * Cll(1, 0) .Offset(, 4) = Cll(1, -6) End With
Mã:For Each Cll In Range("i5",[COLOR=Red] [i1000][/COLOR].End(xlUp)) Có khi nào báo lỗi chổ "đỏ"này không?
Sẽ không báo lỗi, nhưng nguy hại hơn, nếu dữ liệu của bạn vượt 999 dòng;
Ví dụ dữ liệu bạn có 1001 dòng, & tại [i1000] bạn nhấn {CTRL} & mũi tên lên sau đó nhấn tiếp mũi tên xuống; Vùng dữ liệu trong biến Cll chỉ từ [I5] đến đang được kích hoạt; Đó lại là [Ị5]
Thường người ta lấy chổ này đủ lớn, là dòng cuối 65535, hay gần cuối trang tính 65500 (trong E2K3)
(*) Đúng là phương thức tìm kiếm viết quá tắt, sẽ không hay trong 1 số trường hợp!
Nếu sửa lại:For Each Cll In Range("I5", [I13].End(xlUp))
thì báo lỗi (bôi đen) [I13] và ra thông báo:
Compile error:
Can't find project or library
thì code chạy.For Each Cll In Range("I5", Range("I13").End(xlUp))
---
Cám ơn anh thật nhiều, lắm lúc thắc mắc không biết hỏi ai. Mong anh xem giúp chổ này:
Trong phiếu nhập chỉ tới dòng 13 nên tôi viết:
Nếu sửa lại:
thì code chạy.
Mong anh xem và hướng dẫn
Trong phiếu nhập chỉ tới dòng 13 nên tôi viết:
Trích:
For Each Cll In Range("I5", [I13].End(xlUp))
thì báo lỗi (bôi đen) [I13] và ra thông báo:
Compile error:
Can't find project or library
Nếu sửa lại:
Trích:
For Each Cll In Range("I5", Range("I13").End(xlUp))
thì code chạy.
---Code trên em đã test chạy rồi mới đưa lên mà anh. Chắc là flie của anh thiếu References gì đó (Trong VBE --> Tools --> References), anh gửi file lên xem thử.
---Nhưng thườg mình có thói quen:
(1) Lấy hẵn con số 65500 hay 65535 cho vô để xài vĩnh viễn mà vẫn ngũ ngon vì nó;
Chứ lấy 13 hay 1.000 hay 10.000 đi nữa cũng có lúc ta không quản được dữ liệu & hốt hoảng thực sự: Tự nhiên 1 ngày đẹp trời nào đó nó báo lỗi mà ta không biết do đâu?!
Bạn lấy số 13 hay 1.000 không phải là tiết kiệm đâu, & vì thế máy chạy nhanh hơn đâu.
---(2) Trong 1 dòng lệnh nên viết một kiểu dạng biểu thi ô, cho dù điều ngược lại vẫn được phép.
Mình không bao giờ viết
For Each Cll In Range("I5", [I13].End(xlUp))
mà sẽ & luôn luôn viết For Each Cll In Range([I5], [I13].End(xlUp))
hay For Each Cll In Range("I5:I" & [I13].End(xlUp).Row)
Không nên huyễn hoặc vì có lúc sẽ tự hại bản thân
---
Không phải em hà tiện đâu anh vì dòng 15 có dữ liệu chặng dưới rồi ( phiếu nhập kho mà anh)
---
Ptlong ơi, Ptlong à- anh có viết code em lỗi hồi nào đâu? , anh cũng biết lỗi không do code vì thế anh mới hỏi bài ở trên là vì thế. Anh gởi file lên, trong file có 2 code, 1 code anh học viết từ anh HYen17 và code của Ptlong, lỗi đều như nhau. Mong anh ChanhTQ@ và Ptlong xem giúp (cả 2 code nhé). Cám ơn.
---Thiếu cái này, hay anh sang máy khác cop lại cái file MSCAL.OCX đi.
Hay viết là For Each Cll In Range("I5:I14") nếu các ô trống không làm ảnh hưởng đến kết quả macro
Nếu sửa lại:
thì code chạy.Mã:[B]For Each Cll In Range("I5", Range("I13").End(xlUp))[/B]
For Each Cll In Range([I5], Range("I13").End(xlUp))
'hay: '
For Each Cll In Range([I5], Range("I15").End(xlUp))
---Vậy thử nốt câu lệnh:
xem nó còn báo lỗi không? Nếu báo lỗi tại [I5] thì do excel của bạn không chịu chơi với dấu "[" & "]", (?)PHP:For Each Cll In Range([I5], Range("I13").End(xlUp)) 'hay: ' For Each Cll In Range([I5], Range("I15").End(xlUp))
Em thấy file đính kèm của anh có 2 đoạn code dùng For---
Đã thử theo cách của anh vào file bài 12, báo lỗi tại [i5]........thiệt không hiểu nỗi (nhưng sao em tải bài của ptlong về vẫn chạy ầm ầm, copy code về file này (bài 12) là tiêu đời)
For Each Cll In Range("I5", [I13].End(xlUp))
For Each Cll In Range("I5", Range("I13").End(xlUp))
---Em thấy file đính kèm của anh có 2 đoạn code dùng For
Thế thì làm sao chạy được ---> Xóa bớt 1 dòngPHP:For Each Cll In Range("I5", [I13].End(xlUp)) For Each Cll In Range("I5", Range("I13").End(xlUp))
Và ông này không lỗi:For Each Cll In Range("I5", [I13].End(xlUp))
---For Each Cll In Range("I5", Range("I13").End(xlUp))
Kết quả: tuyệt vờiThêm nữa: MISSING CUQR ActiveX Control Module ---> Anh bỏ dấu check mục này xem