Quản lý lượng hàng sản xuất bằng VBA

Trạng thái
Không mở trả lời sau này.

hocmoi

Yêu THVBA
Hi các thành viên diễn đàn.
Mình có 1 File Excel ( Book1 làm ví dụ) , cách làm là giờ đang nhập số bằng thủ công, nay muốn Auto bằng Code VBA , nhờ các thành viên xem dùm có thực hiện được không?
Ý tưởng: Mình có trinh bày trong file Excel, các thành viên download xuống dùm, Do tính đặc thù công việc nên không biết trình bày sao cho các thành viên hiểu hết ý, nếu chỗ nào không rõ mong nhận ý kiến trao đổi. File có 2 Sheet, 1 sheet là dạng dữ liệu , 1 sheet là mình mong muốn kết quả như vậy.

Cám ơn.
P/S: Mình cũng xin nói luôn nếu viết Code như vậy, " kinh phí" đóng góp như thế nào, mong Admin " báo luôn", hihiii nói trước cho dễ , mất lòng trước mà vui vẻ lần sau.

 
M

maiban2068

Guest
Cho tôi hỏi cột V và cột V3 khác nhau cái gì bạn nhỉ? Tôi chỉ có khái niệm cột V. Cells V3. Thuật ngữ bạn dùng, tôi không hiểu. Bạn nói rõ hơn được không?
Câu hỏi: Cột V3 là gì?
 

hocmoi

Yêu THVBA
Cho tôi hỏi cột V và cột V3 khác nhau cái gì bạn nhỉ? Tôi chỉ có khái niệm cột V. Cells V3. Thuật ngữ bạn dùng, tôi không hiểu. Bạn nói rõ hơn được không?
Câu hỏi: Cột V3 là gì?
Chào bạn,
Cột V và V3 chắc là 1, do mình " tự nghĩ " dữ liệu từ dòng V3 nên gọi là V3 thôi, do đối chiếu qua cột W3 có tên SP đó bạn ah.
 

tuhocvba

Administrator
Thành viên BQT
File bạn trình bày như thế này, không ai muốn giúp đâu. Vấn đề ở đây không phải kinh phí. Vấn đề là diễn đạt của bạn chỉ mình bạn hiểu. Để hiểu cái file của bạn, sẽ mất thời gian xác nhận. Tôi sẽ di chuyển topic này sang Box khác nhé.
 
D

Deleted member 208

Guest
Tôi dẫn giải như sau, bạn @hocmoi xem đúng không nhé.
Nội dung công việc: Quản lý đơn hàng.
Có rất nhiều sản phẩm, tên sản phẩm ghi ở cột W. Ví dụ ta có sản phẩm A,B,C,D.
Bạn cần đăng nhập để thấy hình ảnh


Như thế nào là một sản phẩm?
Nếu V là rỗng và cột W là string khác rỗng thì ta có sản phẩm.
Ví dụ: V3 = "" và W3 = "A" nên A là sản phẩm. Dòng chứa tên sản phẩm cũng bao gồm thông tin đặt hàng. Ví dụ X3 là ngày đó họ cần đặt 1200 sản phẩm. Z3 là ngày đó họ cần đặt 800 sản phẩm.

Ví dụ với sản phẩm A. Dòng 5.
Bạn cần đăng nhập để thấy hình ảnh

Sau ngày 1, trong kho còn 1200 sản phẩm.
Sang ngày 3, tiếp tục có 800 đơn hàng, đủ đáp ứng nên nhập vào là 800.
Bạn cần đăng nhập để thấy hình ảnh

Sang ngày 4:
Bạn cần đăng nhập để thấy hình ảnh


Các sản phẩm khác làm tương tự.
 

hocmoi

Yêu THVBA
Tôi dẫn giải như sau, bạn @hocmoi xem đúng không nhé.
Nội dung công việc: Quản lý đơn hàng.
Có rất nhiều sản phẩm, tên sản phẩm ghi ở cột W. Ví dụ ta có sản phẩm A,B,C,D.
Bạn cần đăng nhập để thấy hình ảnh


Như thế nào là một sản phẩm? -> Nó là 1 tên thôi ( Như tên mình" hocmoi hay hocmoi123)
Nếu V là rỗng và cột W là string khác rỗng thì ta có sản phẩm. -> ok
Ví dụ: V3 = "" và W3 = "A" nên A là sản phẩm. --> Để biết là " à đang tính cho SP A , cái chính là xuống dòng dưới có số lượng
Dòng chứa tên sản phẩm cũng bao gồm thông tin đặt hàng. --> Tên SP ở dòng đầu thôi, ở dòng dưới do mình làm Sum (...) để biết khi nhập số lượng từ cột W ... cột nào đó , để biết tổng = tổng cột V thôi, không vượt quá cột V
Ví dụ X3 là ngày đó họ cần đặt 1200 sản phẩm. Z3 là ngày đó họ cần đặt 800 sản phẩm. --? Dòng màu xanh là có sẵn, còn từ dòng 4 đén 9: là mình phải nhạp tay vô, giờ muốn Code để tự tính điền vào.

Ví dụ với sản phẩm A. Dòng 5.
Bạn cần đăng nhập để thấy hình ảnh

Sau ngày 1, trong kho còn 1200 sản phẩm. =>Ok
Sang ngày 3, tiếp tục có 800 đơn hàng, đủ đáp ứng nên nhập vào là 800. ==>ok
Bạn cần đăng nhập để thấy hình ảnh

Sang ngày 4: =>ok
Bạn cần đăng nhập để thấy hình ảnh


Các sản phẩm khác làm tương tự.
cám ơn bạn đã phân tích, đúng là người viết Code cách hiểu khác với người sử dụng,
Đúng rồi đó bạn.
 
M

maiban2068

Guest
A. Đóng góp ủng hộ diễn đàn:
Bạn tùy tâm ủng hộ diễn đàn theo thông tin sau:
Thông tin ủng hộ diễn đàn:
Tài khoản Ngân hàng thương mại cổ phần Ngoại thương Việt Nam Vietcombank, số tài khoản: 0011003264055
Chi nhánh Quận Hoàn Kiếm, Hà Nội.
Chủ tài khoản: Phạm Minh Hoàng.
Mong bạn giữ lời hứa!

B. Hỗ trợ bạn
1. Kết quả macro của tôi như sau:

Bạn cần đăng nhập để thấy hình ảnh

2. Code:
Mã:
Sub main()
    Dim i       As Long, rend   As Long, j As Long
    Dim cend    As Integer
    Dim arr     'Vung data tu cot V toi cot cuoi,tu dong rtitle toi rend
    Dim flag1   As Boolean 'Phat hien san pham
    Dim slcl    As Double 'So luong con lai, cot V
    Dim d       As Double 'Du lieu dong rtitle
    Dim checkrr
    Const cV    As Integer = 22 'Cot V
    Const rtitle    As Long = 3 'Dong chua thong tin ke hoach san xuat
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    'Xac dinh dong cuoi tren cot V
    rend = ThisWorkbook.ActiveSheet.Cells(Rows.Count, cV).End(xlUp).Row
    If rend <= rtitle + 1 Then
        MsgBox "Khong co du lieu"
        GoTo thoat
    End If
    'Xac dinh cot cuoi tren dong rtitle
    cend = ThisWorkbook.ActiveSheet.Cells(rtitle, Columns.Count).End(xlToLeft).Column
    If cend <= cV + 1 Then
        MsgBox "Khong co du lieu"
        GoTo thoat
    End If
    arr = ThisWorkbook.ActiveSheet.Range(Cells(rtitle, cV), Cells(rend, cend)).Value
    flag1 = False
    For i = LBound(arr, 1) To UBound(arr, 1) Step 1
        'V3 = "" and W3 <> ""
        If (Trim(CStr(arr(i, 1))) = "") And (Trim(CStr(arr(i, 2))) <> "") Then
        'Phat hien san pham
            flag1 = True
            slcl = 0
            checkrr = ThisWorkbook.ActiveSheet.Range(Cells(rtitle + i - 1, cV), Cells(rtitle + i - 1, cend)).Value
        Else
            flag1 = False
        End If
        If flag1 = False Then
            slcl = kiemtraso(Trim(CStr(arr(i, 1)))) + slcl 'Cot V
            For j = 3 To UBound(arr, 2) Step 1  'Chay tu cot X toi cot cuoi
                If slcl <= 0 Then Exit For 'Khong con kha nang cung ung
                d = 0   'Du lieu dong rtile
                If Trim(CStr(checkrr(1, j))) <> "" Then
                    If IsNumeric(Trim(CStr(checkrr(1, j)))) Then d = kiemtraso(Trim(CStr(checkrr(1, j))))
                    If d > 0 Then
                        If d <= slcl Then
                            arr(i, j) = d
                            slcl = slcl - d
                            checkrr(1, j) = 0
                        Else
                            arr(i, j) = slcl
                            checkrr(1, j) = d - slcl
                            slcl = 0
                            
                        End If
                    End If
                    
                End If
            Next j
        End If
        
    Next i
    ThisWorkbook.ActiveSheet.Range(Cells(rtitle, cV), Cells(rend, cend)).Value = arr
thoat:
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
'Not Number: -1111111
'Number: 0,1,2,...
Function kiemtraso(ByVal s As String) As Double
    If s = "" Then
        kiemtraso = -1111111
        Exit Function
    End If
    If IsNumeric(s) = False Then
        kiemtraso = -1111111
    Else
        kiemtraso = CDbl(s)
    End If
End Function
3. Logic:
Dòng cuối cùng được xác định là dòng cuối cùng chứa dữ liệu của cột V.
Cột cuối cùng được xác định là cột của ô cuối cùng chứa dữ liệu trên dòng 3.
Bạn cần đăng nhập để thấy hình ảnh

4. Lưu ý, file của bạn tôi không thể viết code macro được. Ít nhất tôi thấy hàm TRIM không hoạt động. Nó báo thư viện sai.
Tôi phải chuyển sheet của bạn ra file mới để code.
Tôi nghĩ nguyên nhân do bạn sử dụng cái này:
Bạn cần đăng nhập để thấy hình ảnh

Cái A Tool này bạn sử dụng đồng nghĩa bạn phải phụ thuộc thư viện của nó. Cái này ông Tuân quảng cáo quá trời, trên thế giới tôi chưa thấy tập đoàn nào mua về cho nhân viên sử dụng. Hãy dùng cái mà quảng đại quần chúng đều dùng được ấy.

Nếu có vấn đề gì phản hồi lại cho tôi biết trong topic này.
 

hocmoi

Yêu THVBA
A. Đóng góp ủng hộ diễn đàn:
Bạn tùy tâm ủng hộ diễn đàn theo thông tin sau:

Mong bạn giữ lời hứa!

B. Hỗ trợ bạn
1. Kết quả macro của tôi như sau:

Bạn cần đăng nhập để thấy hình ảnh

2. Code:
Mã:
Sub main()
    Dim i       As Long, rend   As Long, j As Long
    Dim cend    As Integer
    Dim arr     'Vung data tu cot V toi cot cuoi,tu dong rtitle toi rend
    Dim flag1   As Boolean 'Phat hien san pham
    Dim slcl    As Double 'So luong con lai, cot V
    Dim d       As Double 'Du lieu dong rtitle
    Dim checkrr
    Const cV    As Integer = 22 'Cot V
    Const rtitle    As Long = 3 'Dong chua thong tin ke hoach san xuat
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    'Xac dinh dong cuoi tren cot V
    rend = ThisWorkbook.ActiveSheet.Cells(Rows.Count, cV).End(xlUp).Row
    If rend <= rtitle + 1 Then
        MsgBox "Khong co du lieu"
        GoTo thoat
    End If
    'Xac dinh cot cuoi tren dong rtitle
    cend = ThisWorkbook.ActiveSheet.Cells(rtitle, Columns.Count).End(xlToLeft).Column
    If cend <= cV + 1 Then
        MsgBox "Khong co du lieu"
        GoTo thoat
    End If
    arr = ThisWorkbook.ActiveSheet.Range(Cells(rtitle, cV), Cells(rend, cend)).Value
    flag1 = False
    For i = LBound(arr, 1) To UBound(arr, 1) Step 1
        'V3 = "" and W3 <> ""
        If (Trim(CStr(arr(i, 1))) = "") And (Trim(CStr(arr(i, 2))) <> "") Then
        'Phat hien san pham
            flag1 = True
            slcl = 0
            checkrr = ThisWorkbook.ActiveSheet.Range(Cells(rtitle + i - 1, cV), Cells(rtitle + i - 1, cend)).Value
        Else
            flag1 = False
        End If
        If flag1 = False Then
            slcl = kiemtraso(Trim(CStr(arr(i, 1)))) + slcl 'Cot V
            For j = 3 To UBound(arr, 2) Step 1  'Chay tu cot X toi cot cuoi
                If slcl <= 0 Then Exit For 'Khong con kha nang cung ung
                d = 0   'Du lieu dong rtile
                If Trim(CStr(checkrr(1, j))) <> "" Then
                    If IsNumeric(Trim(CStr(checkrr(1, j)))) Then d = kiemtraso(Trim(CStr(checkrr(1, j))))
                    If d > 0 Then
                        If d <= slcl Then
                            arr(i, j) = d
                            slcl = slcl - d
                            checkrr(1, j) = 0
                        Else
                            arr(i, j) = slcl
                            checkrr(1, j) = d - slcl
                            slcl = 0
                           
                        End If
                    End If
                   
                End If
            Next j
        End If
       
    Next i
    ThisWorkbook.ActiveSheet.Range(Cells(rtitle, cV), Cells(rend, cend)).Value = arr
thoat:
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
'Not Number: -1111111
'Number: 0,1,2,...
Function kiemtraso(ByVal s As String) As Double
    If s = "" Then
        kiemtraso = -1111111
        Exit Function
    End If
    If IsNumeric(s) = False Then
        kiemtraso = -1111111
    Else
        kiemtraso = CDbl(s)
    End If
End Function
3. Logic:
Dòng cuối cùng được xác định là dòng cuối cùng chứa dữ liệu của cột V.
Cột cuối cùng được xác định là cột của ô cuối cùng chứa dữ liệu trên dòng 3.
Bạn cần đăng nhập để thấy hình ảnh

4. Lưu ý, file của bạn tôi không thể viết code macro được. Ít nhất tôi thấy hàm TRIM không hoạt động. Nó báo thư viện sai.
Tôi phải chuyển sheet của bạn ra file mới để code.
Tôi nghĩ nguyên nhân do bạn sử dụng cái này:
Bạn cần đăng nhập để thấy hình ảnh

Cái A Tool này bạn sử dụng đồng nghĩa bạn phải phụ thuộc thư viện của nó. Cái này ông Tuân quảng cáo quá trời, trên thế giới tôi chưa thấy tập đoàn nào mua về cho nhân viên sử dụng. Hãy dùng cái mà quảng đại quần chúng đều dùng được ấy.

Nếu có vấn đề gì phản hồi lại cho tôi biết trong topic này.
Ok bạn, để mình Test, Còn cái vụ A-Tool này mình muốn gở ra thì sao bạn? gỡ bằng cách nào? Mình thấy hôm nay mình Record Macrro thấy cũng báo lộn xộn, k biết lý do, giờ bạn nói mình mới để ý.
Mình đã hứa là sẽ làm, (y). Mình k sài Banking, ngày mai kịp giờ làm về mình sẽ "đãi bạn chầu cafe".
 
M

maiban2068

Guest
Ok bạn, để mình Test, Còn cái vụ A-Tool này mình muốn gở ra thì sao bạn? gỡ bằng cách nào? Mình thấy hôm nay mình Record Macrro thấy cũng báo lộn xộn, k biết lý do, giờ bạn nói mình mới để ý.
Mình đã hứa là sẽ làm, (y). Mình k sài Banking, ngày mai kịp giờ làm về mình sẽ "đãi bạn chầu cafe".
Liên hệ với tác giả, bảo là : Làm Tool thì nên có cái hướng dẫn gỡ. Làm không chuyên nghiệp gì cả mà quảng cáo NỔ quá. Người ta gọi TUÂN NỔ cũng không sai. Bực mình!!!
 

tuhocvba

Administrator
Thành viên BQT
Ok bạn, để mình Test, Còn cái vụ A-Tool này mình muốn gở ra thì sao bạn? gỡ bằng cách nào? Mình thấy hôm nay mình Record Macrro thấy cũng báo lộn xộn, k biết lý do, giờ bạn nói mình mới để ý.
Mình đã hứa là sẽ làm, (y). Mình k sài Banking, ngày mai kịp giờ làm về mình sẽ "đãi bạn chầu cafe".
Cho mỗi admin và BTV và thêm maiban2068, mỗi người một cốc, loại cốc vại 50k/cốc ấy nhé.
 

hocmoi

Yêu THVBA
Cho mỗi admin và BTV và thêm maiban2068, mỗi người một cốc, loại cốc vại 50k/cốc ấy nhé.
Cám ơn tất cả thành viên, mấy bạn (y), thôi mình nghỉ ngơi đây, mai vô Test bản chính thức xem Ok không? Có gì nhờ bạn maiban2068 chỉ thêm dùm nhé.
 

ongke0711

Yêu THVBA
Liên hệ với tác giả, bảo là : Làm Tool thì nên có cái hướng dẫn gỡ. Làm không chuyên nghiệp gì cả mà quảng cáo NỔ quá. Người ta gọi TUÂN NỔ cũng không sai. Bực mình!!!
Tôi nghĩ thái độ ứng xử như vậy là không nên có trên diễn đàn. Đây cũng như là một mạng xã hội (MXH) nhỏ, các kiểu đả kch, nói xấu, bôi nhọ, mệt thị v.v.. tổ chức hay cá nhân được xem như chưa văn hóa, thiếu văn minh.
Chưa nói tới việc những gì bạn nói ở trên có dẫn chứng gì không? Nổ như thế nào? "Làm Tool thì nên có hướng dẫn gỡ": bạn có chắc là không có hướng dẫn gỡ không? Anh ta (Duy Tuân) cũng đã có những thành công đáng kể, không thể phủ nhận để công ty có thể hoạt động như hiện nay.
Tóm lại diễn đàn chỉ nên là nơi chia sẻ, trao đổi kiến thức, các thái độ tiêu cực, chỉ trích cá nhân, tổ chức không nên có. Xây dựng thương hiệu bản thân, tổ chức không phải bằng cách nói tiêu cực cho cá nhân, tổ chức khác.
Chắc có bạn cũng sẽ phản ứng ngay là: chắc ông này bên GPE qua đây. Xin thưa luôn: là tôi cũng là thành viên bên GPE, bên THUTHUATACCESS và đi không tên, ngồi không đổi họ, cũng dùng đúng một nick này cho tất cả các diễn đàn trong và ngoài nước. Mỗi diễn đàn điều có cái hay cần học hỏi, chẳng qua bây giờ bạn không thấy hay vì chưa cần thôi.
Kiến thức không bao giờ đủ. Tập trung phát triển kiến thức thôi, những chuyện nhỏ nhặt bỏ ngoài hết đi nhé.
Chút chia sẻ cảm nghĩ.
 
M

maiban2068

Guest
Tôi nghĩ thái độ ứng xử như vậy là không nên có trên diễn đàn. Đây cũng như là một mạng xã hội (MXH) nhỏ, các kiểu đả kch, nói xấu, bôi nhọ, mệt thị v.v.. tổ chức hay cá nhân được xem như chưa văn hóa, thiếu văn minh.
Chưa nói tới việc những gì bạn nói ở trên có dẫn chứng gì không? Nổ như thế nào? "Làm Tool thì nên có hướng dẫn gỡ": bạn có chắc là không có hướng dẫn gỡ không? Anh ta (Duy Tuân) cũng đã có những thành công đáng kể, không thể phủ nhận để công ty có thể hoạt động như hiện nay.
Tóm lại diễn đàn chỉ nên là nơi chia sẻ, trao đổi kiến thức, các thái độ tiêu cực, chỉ trích cá nhân, tổ chức không nên có. Xây dựng thương hiệu bản thân, tổ chức không phải bằng cách nói tiêu cực cho cá nhân, tổ chức khác.
Chắc có bạn cũng sẽ phản ứng ngay là: chắc ông này bên GPE qua đây. Xin thưa luôn: là tôi cũng là thành viên bên GPE, bên THUTHUATACCESS và đi không tên, ngồi không đổi họ, cũng dùng đúng một nick này cho tất cả các diễn đàn trong và ngoài nước. Mỗi diễn đàn điều có cái hay cần học hỏi, chẳng qua bây giờ bạn không thấy hay vì chưa cần thôi.
Kiến thức không bao giờ đủ. Tập trung phát triển kiến thức thôi, những chuyện nhỏ nhặt bỏ ngoài hết đi nhé.
Chút chia sẻ cảm nghĩ.
1. Vào trang blue xem.
Như thế nào là hàng đầu VN?
2. Chuyên nghiệp là giờ người dùng muốn gỡ và đi hỏi, thì chuyên nghiệp ở đâu?
3. Thành công gì? Sao tôi không thấy. Hay tự nghĩ mình thành công? Bạn dùng sản phẩm nào của Tuân và thấy hài lòng rồi? Hoặc cá nhân bạn nghĩ thành công còn tôi thì không.
 

Euler

Administrator
Thành viên BQT
Tôi không muốn các bạn cãi vã ở đây. Không vui chút nào.

@maiban2068@ongke0711 : Tôi không muốn thấy hai bạn tranh cãi nữa.

maiban: Việc bạn ấy phải chuyển sheet rồi code, từ đó phản ứng là có thể hiểu được. Sản phẩm phát triển cũng có lỗi này lỗi nọ, oto lỗi còn phải thu hồi cơ mà. Nên rút kinh nghiệm.

Ongke: Nếu bạn cũng có được thái độ chính trực này trên GPE thì tốt. Khi chúng tôi yếu thế không thấy bạn lên tiếng bênh vực một câu.

Tôi không có ý bênh ai. Bạn maiban sai.

Thẩm quyền kỷ luật thuộc về admin.
 

ongke0711

Yêu THVBA
Ongke: Nếu bạn cũng có được thái độ chính trực này trên GPE thì tốt. Khi chúng tôi yếu thế không thấy bạn lên tiếng bênh vực một câu.
Tôi không phải chánh trực gì ở đây bạn Euler à. Chẳng qua là thái độ tích cực và trải nghiêm cuộc sống nên góp ý vậy thôi.
Tôi dừng ở đây vậy.
 

tuhocvba

Administrator
Thành viên BQT
Góp ý của @ongke0711 là đúng. Tôi không muốn diễn đàn ta như GPE.
Trải nghiệm tham gia các diễn đàn là kinh nghiệm quý báu, chúng ta nên học hỏi không nên đi vào vết xe không hay đó.

1. @maiban2068 :
Phần mềm người ta thế này thế kia cũng không nên nói vậy. Không dùng thì thôi.

Bạn tiếp tục hỗ trợ topic này. Sau đó nhận kỷ luật sau.

2. @ongke0711 : Cảm ơn góp ý của bạn. Lần sau bạn góp ý vào Box khiếu nại. Tránh làm loãng topic.
 

hocmoi

Yêu THVBA
A. Đóng góp ủng hộ diễn đàn:
Bạn tùy tâm ủng hộ diễn đàn theo thông tin sau:

Mong bạn giữ lời hứa!

B. Hỗ trợ bạn
1. Kết quả macro của tôi như sau:

Bạn cần đăng nhập để thấy hình ảnh

2. Code:
Mã:
Sub main()
    Dim i       As Long, rend   As Long, j As Long
    Dim cend    As Integer
    Dim arr     'Vung data tu cot V toi cot cuoi,tu dong rtitle toi rend
    Dim flag1   As Boolean 'Phat hien san pham
    Dim slcl    As Double 'So luong con lai, cot V
    Dim d       As Double 'Du lieu dong rtitle
    Dim checkrr
    Const cV    As Integer = 22 'Cot V
    Const rtitle    As Long = 3 'Dong chua thong tin ke hoach san xuat
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    'Xac dinh dong cuoi tren cot V
    rend = ThisWorkbook.ActiveSheet.Cells(Rows.Count, cV).End(xlUp).Row
    If rend <= rtitle + 1 Then
        MsgBox "Khong co du lieu"
        GoTo thoat
    End If
    'Xac dinh cot cuoi tren dong rtitle
    cend = ThisWorkbook.ActiveSheet.Cells(rtitle, Columns.Count).End(xlToLeft).Column
    If cend <= cV + 1 Then
        MsgBox "Khong co du lieu"
        GoTo thoat
    End If
    arr = ThisWorkbook.ActiveSheet.Range(Cells(rtitle, cV), Cells(rend, cend)).Value
    flag1 = False
    For i = LBound(arr, 1) To UBound(arr, 1) Step 1
        'V3 = "" and W3 <> ""
        If (Trim(CStr(arr(i, 1))) = "") And (Trim(CStr(arr(i, 2))) <> "") Then
        'Phat hien san pham
            flag1 = True
            slcl = 0
            checkrr = ThisWorkbook.ActiveSheet.Range(Cells(rtitle + i - 1, cV), Cells(rtitle + i - 1, cend)).Value
        Else
            flag1 = False
        End If
        If flag1 = False Then
            slcl = kiemtraso(Trim(CStr(arr(i, 1)))) + slcl 'Cot V
            For j = 3 To UBound(arr, 2) Step 1  'Chay tu cot X toi cot cuoi
                If slcl <= 0 Then Exit For 'Khong con kha nang cung ung
                d = 0   'Du lieu dong rtile
                If Trim(CStr(checkrr(1, j))) <> "" Then
                    If IsNumeric(Trim(CStr(checkrr(1, j)))) Then d = kiemtraso(Trim(CStr(checkrr(1, j))))
                    If d > 0 Then
                        If d <= slcl Then
                            arr(i, j) = d
                            slcl = slcl - d
                            checkrr(1, j) = 0
                        Else
                            arr(i, j) = slcl
                            checkrr(1, j) = d - slcl
                            slcl = 0
                           
                        End If
                    End If
                   
                End If
            Next j
        End If
       
    Next i
    ThisWorkbook.ActiveSheet.Range(Cells(rtitle, cV), Cells(rend, cend)).Value = arr
thoat:
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
'Not Number: -1111111
'Number: 0,1,2,...
Function kiemtraso(ByVal s As String) As Double
    If s = "" Then
        kiemtraso = -1111111
        Exit Function
    End If
    If IsNumeric(s) = False Then
        kiemtraso = -1111111
    Else
        kiemtraso = CDbl(s)
    End If
End Function
3. Logic:
Dòng cuối cùng được xác định là dòng cuối cùng chứa dữ liệu của cột V.
Cột cuối cùng được xác định là cột của ô cuối cùng chứa dữ liệu trên dòng 3.
Bạn cần đăng nhập để thấy hình ảnh

4. Lưu ý, file của bạn tôi không thể viết code macro được. Ít nhất tôi thấy hàm TRIM không hoạt động. Nó báo thư viện sai.
Tôi phải chuyển sheet của bạn ra file mới để code.
Tôi nghĩ nguyên nhân do bạn sử dụng cái này:
Bạn cần đăng nhập để thấy hình ảnh

Cái A Tool này bạn sử dụng đồng nghĩa bạn phải phụ thuộc thư viện của nó. Cái này ông Tuân quảng cáo quá trời, trên thế giới tôi chưa thấy tập đoàn nào mua về cho nhân viên sử dụng. Hãy dùng cái mà quảng đại quần chúng đều dùng được ấy.

Nếu có vấn đề gì phản hồi lại cho tôi biết trong topic này.
Bạn maiban2068 cho mình tò mò tý xíu, từ dòng code 67 đến cuối, bạn giải thích cho mình hiểu chỗ đó tý. Và vì sao mình đã End sub rồi mà Code vẫn chạy xuống dưới.
 
M

maiban2068

Guest
Cái vùng này mình nạp vào mảng arr:
Bạn cần đăng nhập để thấy hình ảnh

Sẽ có phần tử là rỗng "", có phần tử là "A"-kí tự, tên sản phẩm, và có phần tử là số "1200". Mình chỉ làm việc với 1200 (số).
Vì vậy Function kiemtraso(ByVal s As String) As Double để kiểm tra kí tự đầu vào là số hay không.
Vì dữ liệu của bạn chỉ toàn số dương, cho nên trường hợp không mong muốn (đầu vào không phải là số) thì mình thiết định hàm này là số âm
-1111111 .

Đây là hàm (Function), không phải thủ tục (Sub).
Trong thủ tục (Sub) cứ chỗ nào gọi tới hàm (Function) thì nó sẽ chạy tới phần code của Function để thực hiện tính toán, tính toán xong nó quay về Sub, chạy tới dòng lệnh tiếp theo. Khi nào chạy tới dòng 66 thì là kết thúc.
Bạn cần đăng nhập để thấy hình ảnh

Trước dòng 66 mà có dòng nào gọi tới Function thì sẽ chạy tới Function để thực hiện tính toán.
Bạn cần đăng nhập để thấy hình ảnh

Ví dụ dòng 43 gọi tới hàm này thì nó sẽ chạy tới phần code Function để thực hiện tính toán.
Sau đó nó quay về dòng code 43 trả kết quả ở đây, xong xuôi chuyển sang dòng code 44...
Khi nào tới dòng 66 thì kết thúc.
 
D

Deleted member 208

Guest
@hocmoi : Mình mô phỏng như thế này xem dễ hiểu không nhé.
Giả sử đang chạy tới dòng code 43.
Bạn cần đăng nhập để thấy hình ảnh

Tại dòng code 43, hàm (Function kiemtraso) được gọi. Cho nên sẽ chạy xuống dòng code 69-79 để tính toán.
Tính toán xong, quay trở lại dòng 43, trả lại kết quả ở đây.

Dòng code 43 xong thì chạy tiếp tới dòng code 44.
Bạn cần đăng nhập để thấy hình ảnh


Cứ như vậy, chạy cho tới dòng code 66 thì kết thúc.
 

tuhocvba

Administrator
Thành viên BQT
Bạn @hocmoi nhanh chóng xác nhận kết quả macro như thế đã đúng ý bạn chưa.
Ngày 1/4, chúng tôi thi hành kỷ luật xóa nick @maiban2068 .
 
Trạng thái
Không mở trả lời sau này.
Top