Nhờ giúp viết Code VBA sử dụng Button Box nhân 2 mảng

Liên hệ QC

Ngocminh19

Thành viên chính thức
Tham gia
30/5/15
Bài viết
75
Được thích
6
Do file em sử dụng rất nặng khi dùng,em cũng mới tìm hiểu về VBA
Không biết nên bắt đầu từ đâu để giải quyết bài toán này
Em có 1 file quản lý vật tư nhờ các Thầy/anh chị viết code giúp em để xử lý công việc ạ.em cảm ơn!
Yêu cầu công việc như ntn ạ
:

Số 1.Button Qty use : Nhân 2 mảng cùng kích thước: Plan(Array 1) và Bên BOM(Array 2),theo thứ tự từng dòng chạy theo ngày liên tiếp ạ
-Các bác giúp em khi nhấn thì nhân 2 mảng này .Array 1 chạy từ trên xuống dưới,Array 2 từ trái sang phải

1639650064584.png
Array 2 bên Sheet BOM
1639650159303.png

Số 3 : Button Qty Remain
Em lấy ngày trước trừ đi số đã nhân nhân cột đó ạ.gối theo các ngày

1639650673874.png
Có thể sử dụng giữa 2 tính năng này cập nhật liên tục đc ạ
-Số 2: thì em nhờ các bác nhân giúp em 2 mảng cố định giống như 1 cột của yêu cầu 1 ạ
 

File đính kèm

  • Nhân 2 mảng.xlsb
    3 MB · Đọc: 3
Em xin phép nói rõ thêm,đơn giản theo dile dưới này ạ. Mong các bác xem giúp em với ạ .Em cảm ơn!
1639808389372.png
 

File đính kèm

  • Nhờ viết code.xlsx
    61.3 KB · Đọc: 4
Upvote 0
Em xin phép nói rõ thêm,đơn giản theo dile dưới này ạ. Mong các bác xem giúp em với ạ .Em cảm ơn!
Thêm Module với code sau.

Nếu bạn muốn code ít chữ nhất và dùng ít vòng FOR nhất thì đợi người khác nhé.

Mã:
Option Explicit

Sub BOM_sex(Optional ByVal luy_ke As Long = 0)
Dim r As Long, c As Long, k As Long, socot As Long, socot_bom As Long, giatri As Double, bom(), dulieu_ngay(), cotE(), result()
    bom = ThisWorkbook.Worksheets("BOM").Range("D6:G14").Value
    dulieu_ngay = ThisWorkbook.Worksheets("Shortage").Range("F3:L6").Value
    If UBound(bom, 2) <> UBound(dulieu_ngay, 1) Then
        MsgBox "Kich thuoc cac vung du lieu khong khop voi nhau"
        Exit Sub
    End If
    If luy_ke Then cotE = ThisWorkbook.Worksheets("Shortage").Range("E8").Resize(UBound(bom, 1)).Value ' lay tu E8 UBound(bom, 1) dong
    ReDim result(1 To UBound(bom, 1), 1 To UBound(dulieu_ngay, 2)) ' so dong bang so dong cotE, so cot bang so cot dulieu_ngay
    socot = UBound(result, 2)
    socot_bom = UBound(bom, 2)
    For r = 1 To UBound(result, 1)
        For c = 1 To socot
            giatri = 0
            For k = 1 To socot_bom
                giatri = giatri + bom(r, k) * dulieu_ngay(k, c)
            Next k
            If luy_ke Then
                result(r, c) = cotE(r, 1) - giatri
            Else
                result(r, c) = giatri
            End If
        Next c
    Next r
    ThisWorkbook.Worksheets("Shortage").Range("F8").Resize(UBound(result, 1), UBound(result, 2)).Value = result
End Sub

Sub Button1_Click()
    BOM_sex
End Sub

Sub Button2_Click()
    BOM_sex 1
End Sub
 
Upvote 0
Thêm Module với code sau.

Nếu bạn muốn code ít chữ nhất và dùng ít vòng FOR nhất thì đợi người khác nhé.

Mã:
Option Explicit

Sub BOM_sex(Optional ByVal luy_ke As Long = 0)
Dim r As Long, c As Long, k As Long, socot As Long, socot_bom As Long, giatri As Double, bom(), dulieu_ngay(), cotE(), result()
    bom = ThisWorkbook.Worksheets("BOM").Range("D6:G14").Value
    dulieu_ngay = ThisWorkbook.Worksheets("Shortage").Range("F3:L6").Value
    If UBound(bom, 2) <> UBound(dulieu_ngay, 1) Then
        MsgBox "Kich thuoc cac vung du lieu khong khop voi nhau"
        Exit Sub
    End If
    If luy_ke Then cotE = ThisWorkbook.Worksheets("Shortage").Range("E8").Resize(UBound(bom, 1)).Value ' lay tu E8 UBound(bom, 1) dong
    ReDim result(1 To UBound(bom, 1), 1 To UBound(dulieu_ngay, 2)) ' so dong bang so dong cotE, so cot bang so cot dulieu_ngay
    socot = UBound(result, 2)
    socot_bom = UBound(bom, 2)
    For r = 1 To UBound(result, 1)
        For c = 1 To socot
            giatri = 0
            For k = 1 To socot_bom
                giatri = giatri + bom(r, k) * dulieu_ngay(k, c)
            Next k
            If luy_ke Then
                result(r, c) = cotE(r, 1) - giatri
            Else
                result(r, c) = giatri
            End If
        Next c
    Next r
    ThisWorkbook.Worksheets("Shortage").Range("F8").Resize(UBound(result, 1), UBound(result, 2)).Value = result
End Sub

Sub Button1_Click()
    BOM_sex
End Sub

Sub Button2_Click()
    BOM_sex 1
End Sub
Dạ. Em xin cảm ơn sự giúp đỡ của Thầy rất nhiều ,`đúng nội dung em mong muốn ban đầu
E xin lỗi thầy ở Button2 có sai 1 chút về thông tin vì em cố định giá trị cột E,nên Lũy kế sau từng ngày SX sẽ không đúng`
Lũy kế sau từng ngày sẽ là remain ngày trước trừ đi số lượng sx ngày hôm đó .
Thầy giúp em sửa lại code để Button 2 đúng kết quả giúp em với
.Em cảm ơn thầy ạ
1639842491377.png
 

File đính kèm

  • Nhờ viết codeq.xlsx
    58.3 KB · Đọc: 6
Upvote 0
Dạ. Em xin cảm ơn sự giúp đỡ của Thầy rất nhiều ,`đúng nội dung em mong muốn ban đầu
E xin lỗi thầy ở Button2 có sai 1 chút về thông tin vì em cố định giá trị cột E,nên Lũy kế sau từng ngày SX sẽ không đúng`
Lũy kế sau từng ngày sẽ là remain ngày trước trừ đi số lượng sx ngày hôm đó .
View attachment 270474
Trong Sub BOM_sex ở bài #3

thay
Mã:
If luy_ke Then
    result(r, c) = cotE(r, 1) - giatri
Else
    result(r, c) = giatri
End If

bằng
Mã:
If luy_ke Then
    If c = 1 Then
        result(r, c) = cotE(r, 1) - giatri
    Else
        result(r, c) = result(r, c - 1) - giatri
    End If
Else
    result(r, c) = giatri
End If
-----------
Nếu bạn cần vd. ít FOR hơn thì sử dụng vd. Application.WorksheetFunction.MMult hoặc Application.MMult sẽ có ít FOR hơn. Nhưng hoặc bạn tự tìm hiểu, hoặc đợi những người đam mê, tôi không giúp bạn viết ít dòng (muốn thì gộp vài dòng thành 1), ít chữ, ít FOR. Đó không là đam mê của tôi.
 
Upvote 0
Trong Sub BOM_sex ở bài #3

thay
Mã:
If luy_ke Then
    result(r, c) = cotE(r, 1) - giatri
Else
    result(r, c) = giatri
End If

bằng
Mã:
If luy_ke Then
    If c = 1 Then
        result(r, c) = cotE(r, 1) - giatri
    Else
        result(r, c) = result(r, c - 1) - giatri
    End If
Else
    result(r, c) = giatri
End If
-----------
Nếu bạn cần vd. ít FOR hơn thì sử dụng vd. Application.WorksheetFunction.MMult hoặc Application.MMult sẽ có ít FOR hơn. Nhưng hoặc bạn tự tìm hiểu, hoặc đợi những người đam mê, tôi không giúp bạn viết ít dòng (muốn thì gộp vài dòng thành 1), ít chữ, ít FOR. Đó không là đam mê của tôi.
Dạ đúng kết quả em mong muốn rồi ạ.
E cảm ơn thầy đã chỉ lối,bản thân em mới học hỏi công thức từ diễn đàn để áp dụng cho công việc.Được thầy hướng dẫn
đã giúp em tự động hóa vấn đề file em sử dụng 4 năm.
Lúc trc thầy làm vòng lặp em chưa tiện hỏi thầy :
-Em có 1 điều kiện lẻ là các giá trị rởi rạc cũng cần thống kê trong file,thấy giúp em để em có thể tự động hóa hết theo VBA vớiạ
Giá trị 1,hoặc 3. lúc nào cũng cố dịnh là tự độngnhân vào dù sử dung Button nào ạ.
Em cảm ơn!
1639846201074.png
 

File đính kèm

  • Nhờ viết code.xlsm
    60.9 KB · Đọc: 7
Upvote 0
Dạ đúng kết quả em mong muốn rồi ạ.
E cảm ơn thầy đã chỉ lối,bản thân em mới học hỏi công thức từ diễn đàn để áp dụng cho công việc.Được thầy hướng dẫn
đã giúp em tự động hóa vấn đề file em sử dụng 4 năm.
Lúc trc thầy làm vòng lặp em chưa tiện hỏi thầy :
-Em có 1 điều kiện lẻ là các giá trị rởi rạc cũng cần thống kê trong file,thấy giúp em để em có thể tự động hóa hết theo VBA vớiạ
Giá trị 1,hoặc 3. lúc nào cũng cố dịnh là tự độngnhân vào dù sử dung Button nào ạ.
Em cảm ơn!
View attachment 270477
Cách dùng công thức Excel trong VBA
Mã:
Sub Button1_Click()
  ABC False
End Sub

Sub Button2_Click()
  ABC True
End Sub

Sub ABC(Optional bLuyKe As Boolean = True)
  Range("E8:G16").Formula = "=MMULT(BOM!$D6:$G6,E$3:E$6)" 'Gán cong thuc
  Range("E8:G16").Value = Range("E8:G16").Value 'Gán gia tri
  Range("F8:F16").ClearContents
  If bLuyKe Then
    Range("I8:O16").Formula = "=H8-MMULT(BOM!$D6:$G6,I$3:I$6)"
  Else
    Range("I8:O16").Formula = "=MMULT(BOM!$D6:$G6,I$3:I$6)"
  End If
  Range("I8:O16").Value = Range("I8:O16").Value
End Sub
 
Upvote 0
-Em có 1 điều kiện lẻ là các giá trị rởi rạc cũng cần thống kê trong file,thấy giúp em để em có thể tự động hóa hết theo VBA vớiạ
Giá trị 1,hoặc 3. lúc nào cũng cố dịnh là tự độngnhân vào dù sử dung Button nào ạ.


View attachment 270477
Tôi không hiểu bạn nói gì. Bây giờ cấu trúc dữ liệu có thay đổ so với trước. Trước đó cần tính giá trị cho F8:L16, tôi "dịch" từ công thức sang code. Bây giờ vùng cần tính là vùng nào? Vùng I8:O16? Công thức trong các ô đó như thế nào? Tôi chỉ "dịch" công thức sang code thôi. Không biết công thức thế nào thì tôi chịu, bạn chờ người hiểu ý nhé.

Hay ý là ngoài tính I8:O16 tương tự như trước thì tính thêm E8:G16?
 
Upvote 0
Cách dùng công thức Excel trong VBA
Mã:
Sub Button1_Click()
  ABC False
End Sub

Sub Button2_Click()
  ABC True
End Sub

Sub ABC(Optional bLuyKe As Boolean = True)
  Range("E8:G16").Formula = "=MMULT(BOM!$D6:$G6,E$3:E$6)" 'Gán cong thuc
  Range("E8:G16").Value = Range("E8:G16").Value 'Gán gia tri
  Range("F8:F16").ClearContents
  If bLuyKe Then
    Range("I8:O16").Formula = "=H8-MMULT(BOM!$D6:$G6,I$3:I$6)"
  Else
    Range("I8:O16").Formula = "=MMULT(BOM!$D6:$G6,I$3:I$6)"
  End If
  Range("I8:O16").Value = Range("I8:O16").Value
End Sub
lại
Tôi không hiểu bạn nói gì. Bây giờ cấu trúc dữ liệu có thay đổ so với trước. Trước đó cần tính giá trị cho F8:L16, tôi "dịch" từ công thức sang code. Bây giờ vùng cần tính là vùng nào? Vùng I8:O16? Công thức trong các ô đó như thế nào? Tôi chỉ "dịch" công thức sang code thôi. Không biết công thức thế nào thì tôi chịu, bạn chờ người hiểu ý nhé.

Hay ý là ngoài tính I8:O16 tương tự như trước thì tính thêm E8:G16?
dạ đúng rồi ạ. là Vùng E8:G16 ,riêng lẻ
Còng Vùng I8:O16 em hiểu và áp dụng được cách của thầy rồi a
Bài đã được tự động gộp:

Cách dùng công thức Excel trong VBA
Mã:
Sub Button1_Click()
  ABC False
End Sub

Sub Button2_Click()
  ABC True
End Sub

Sub ABC(Optional bLuyKe As Boolean = True)
  Range("E8:G16").Formula = "=MMULT(BOM!$D6:$G6,E$3:E$6)" 'Gán cong thuc
  Range("E8:G16").Value = Range("E8:G16").Value 'Gán gia tri
  Range("F8:F16").ClearContents
  If bLuyKe Then
    Range("I8:O16").Formula = "=H8-MMULT(BOM!$D6:$G6,I$3:I$6)"
  Else
    Range("I8:O16").Formula = "=MMULT(BOM!$D6:$G6,I$3:I$6)"
  End If
  Range("I8:O16").Value = Range("I8:O16").Value
End Sub
lại
Cách dùng công thức Excel trong VBA
Mã:
Sub Button1_Click()
  ABC False
End Sub

Sub Button2_Click()
  ABC True
End Sub

Sub ABC(Optional bLuyKe As Boolean = True)
  Range("E8:G16").Formula = "=MMULT(BOM!$D6:$G6,E$3:E$6)" 'Gán cong thuc
  Range("E8:G16").Value = Range("E8:G16").Value 'Gán gia tri
  Range("F8:F16").ClearContents
  If bLuyKe Then
    Range("I8:O16").Formula = "=H8-MMULT(BOM!$D6:$G6,I$3:I$6)"
  Else
    Range("I8:O16").Formula = "=MMULT(BOM!$D6:$G6,I$3:I$6)"
  End If
  Range("I8:O16").Value = Range("I8:O16").Value
End Sub
dạ. Em cảm ơn bác ạ.
Một cách khác với cách khác rất hay ạ.Em thử đúng rồi ạ
Tuyệt vời.Thật hữu ích với em lắm
 
Upvote 0
Trong Sub BOM_sex ở bài #3

thay
Mã:
If luy_ke Then
    result(r, c) = cotE(r, 1) - giatri
Else
    result(r, c) = giatri
End If

bằng
Mã:
If luy_ke Then
    If c = 1 Then
        result(r, c) = cotE(r, 1) - giatri
    Else
        result(r, c) = result(r, c - 1) - giatri
    End If
Else
    result(r, c) = giatri
End If
-----------
Nếu bạn cần vd. ít FOR hơn thì sử dụng vd. Application.WorksheetFunction.MMult hoặc Application.MMult sẽ có ít FOR hơn. Nhưng hoặc bạn tự tìm hiểu, hoặc đợi những người đam mê, tôi không giúp bạn viết ít dòng (muốn thì gộp vài dòng thành 1), ít chữ, ít FOR. Đó không là đam mê của tôi.
Bác ơi.Bác có thể giúp em khi em lọc Filter xem 1 vài mã mà VBA vẫn chạy đúng với ạ.
Hiện tại khi em lọc xem 1,vài mã thì code không đúng nữa.
Mong bác giúp đỡ ạ. Chúc bác năm mới sức khỏe
1644424230475.png
 

File đính kèm

  • 2022 Nhờ viết codeq.xlsx
    57.8 KB · Đọc: 0
Upvote 0
Web KT

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

Back
Top Bottom