Xin hỏi về code nhập kho có điều kiện

Liên hệ QC

tam8678

Đời Xá Chi
Tham gia
30/4/09
Bài viết
417
Được thích
301
Nghề nghiệp
Kế toá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
 

File đính kèm

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é.
 

File đính kèm

Upvote 0
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é.
---
Cám ơn bạn, phần mong muốn: đó là kết quả sẽ nhận được bên Sheet TonKho sau khi chạy code, các trường hợp yêu cầu= Ko : Xuất thẳng, không cần phải theo dõi nhập xuất tồn.
Thân chào.
 
Upvote 0
Ý 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 ?
Có vài vấn đề :
- 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 !
- Bạ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
- ... nói chung là bất tiện lắm!

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
 
Upvote 0
Ý 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 như thế
- 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 !
Đươ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)
Bạ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
Phiếu nhập kho được xử dụng như Form (dùng bảng tính) nên chỉ xử dụng 1 sheet
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
Access mình tệ lắm (nói chung cái nào cũng tệ :-=).
Rất vui được biết bạn, nếu có ví dụ về Access bạn giúp tôi tham khảo (nếu không phiền)
Thân chào.
 
Upvote 0
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

Đứ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
 

File đính kèm

Upvote 0
Đứ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
---
Hướng dẫn dùm chổ "đỏ đỏ"này ptlong04x1 ơi, không hiểu nổi +-+-+-+ (viết tắt quá!)
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
Và viết như thế này:
For Each Cll In Range("i5", [i1000].End(xlUp))
Có khi nào báo lỗi chổ "đỏ"này không?
Cám ơn
 
Upvote 0
---
Hướng dẫn dùm chổ "đỏ đỏ"này ptlong04x1 ơi, không hiểu nổi +-+-+-+ (viết tắt quá!)
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
Và viết như thế này:
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!
 
Lần chỉnh sửa cuối:
Upvote 0
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!

---
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:
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:
For Each Cll In Range("I5", Range("I13").End(xlUp))
thì code chạy.
Mong anh xem và hướng dẫn
 
Upvote 0
---
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

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ử.
 
Lần chỉnh sửa cuối:
Upvote 0
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.

Mình thấy không báo lỗi gì cả.
Hay bạn xem lại trên chữ I có dấu sắc không đó?
(Nếu dữ liệu trong cột là luôn liên tục (không có ô trống ở giữa các hàng) thì nên xài

For Each Cll In Range([I5], [I5].End(xlDown))

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

Thân ái!
 
Upvote 0
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ử.
---
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.
 

File đính kèm

Upvote 0
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.
---
:-= 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)
---
(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
---
Cám ơn anh, sẽ luôn ghi nhớ điều này.
 
Upvote 0
---
:-= 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)

Nếu dòng 15 là dữ liệu của phần khác, thị bạn ghi là
For Each Cll In Range("I5", [I15].End(xlUp))

Diễn nôm câu lệnh này là
Tạo vòng lặp xét tất các ô trong vùng (thực tế là trong cột), mà ô đầu tiên là ô [i5], ô cuối tìm được bằng cách: từ ô [I15] bấm 2 fím {CTRL}+ (fím) mũi tên lên

Điều này ta có thể thực hiện hoàn toàn trên thực địa mà, Bạn thử ngay đi. . . (Khoảng vài mươi lần, cho đến khi đầu của bạn gật gù & thấm í là OK! --=0

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
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
---
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.

attachment.php

 

File đính kèm

  • 30-11-2009 10-22-32 PM.jpg
    30-11-2009 10-22-32 PM.jpg
    104.2 KB · Đọc: 37
Upvote 0
Thiếu cái này, hay anh sang máy khác cop lại cái file MSCAL.OCX đi.

attachment.php
---
Theo anh nghĩ chắc là không phải, anh tải bài của ptlong về, anh test vẫn chạy ầm ầm đó thây, không có phần này làm sao anh test được? Anh copy code về file anh làm là báo lỗi ( anh cũng bị lỗi y như thế, làm thử ở file khác thấy được => chép vào file làm => lỗi )
Anh đã gởi file lên (bài 12), em test trên máy em có lỗi không thì biết ngay mà --=--
To: ChanhTQ@
Đã viết theo cách của anh, thay vào trong code ptlong theo file đã gởi trong bài 12 => lỗi vẫn y như thế, cho ý kiến giúp anh ơi --=--
Viết như anh HYen17 thì được :-= :
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
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu sửa lại:
Mã:
[B]For Each Cll In Range("I5", Range("I13").End(xlUp))[/B]
thì code chạy.

Vậy thử nốt câu lệnh:
PHP:
For Each Cll In Range([I5], Range("I13").End(xlUp))
'hay: ' 
For Each Cll In Range([I5], Range("I15").End(xlUp))
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 "[" & "]", (?) --=0 :-= --=0
 
Upvote 0
Vậy thử nốt câu lệnh:
PHP:
For Each Cll In Range([I5], Range("I13").End(xlUp))
'hay: ' 
For Each Cll In Range([I5], Range("I15").End(xlUp))
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 "[" & "]", (?) --=0 :-= --=0
---
Đã 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) :-=
 
Upvote 0
---
Đã 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) :-=
Em thấy file đính kèm của anh có 2 đoạn code dùng For
PHP:
For Each Cll In Range("I5", [I13].End(xlUp))
For Each Cll In Range("I5", Range("I13").End(xlUp))
Thế thì làm sao chạy được ---> Xóa bớt 1 dòng
Thêm nữa: MISSING CUQR ActiveX Control Module ---> Anh bỏ dấu check mục này xem
 
Upvote 0
Em thấy file đính kèm của anh có 2 đoạn code dùng For
PHP:
For Each Cll In Range("I5", [I13].End(xlUp))
For Each Cll In Range("I5", Range("I13").End(xlUp))
Thế thì làm sao chạy được ---> Xóa bớt 1 dòng
---
Anh có 2 đoạn code dùng For: dùng để kiểm tra, khi chạy code thì chỉ dùng 1 For thôi , nên mới biết ông này lỗi tại [i13]:
For Each Cll In Range("I5", [I13].End(xlUp))
Và ông này không lỗi:
For Each Cll In Range("I5", Range("I13").End(xlUp))
---
Thêm nữa: MISSING CUQR ActiveX Control Module ---> Anh bỏ dấu check mục này xem
Kết quả: tuyệt vời :-= :-= :-=
Chú có thể nói rõ phần này như thế nào không? rất mong.
 
Upvote 0
Web KT

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

Back
Top Bottom