Chọn dãy số sao cho tổng dãy số đó gần bằng nhất với số cho trước. (1 người xem)

Người dùng đang xem chủ đề này

thufpts

Thành viên hoạt động
Tham gia
6/8/12
Bài viết
157
Được thích
6
Giới tính
Nam
Nghề nghiệp
Bốc vác
Em chào các bác. em có bài toán này nhưng với khả năng của em không giải quyết được.
Em có một dãy số bất kỳ tại cột G. khi em nhập một giá trị bất kì tại ô màu đỏ ví dụ là 60
thì tại cột H nó sẽ tự động lấy giá trị ở cột G từ trên xuông (bắt buộc) sao cho tổng
ở vùng màu vàng của côt H phải thỏa mãn 1 trong các điều kiện sau
1. bằng ô màu đỏ tại cột H
2. lớn hơn ô màu đỏ tại cột H với giá trị gần nhất ví dụ 61 (tùy vào tổng của vùng màu vàng)
3. nhỏ hơn ô màu đỏ tại cột H với giá trị gần nhất ví dụ 59 (tùy vào tổng của vùng màu vàng).
Mỗi khi giá trị ở cột G thay đổi thì giá trị của vùng màu vàng tại cột H sẽ thay đổi theo.
tương tự khi nhập giá trị bất kì cho các cột I,J,K,L,M
Em rất mong các bác cao thủ giúp em với. em cám ơn các bác nhiều lắm.
 

File đính kèm

Em chào các bác. em có bài toán này nhưng với khả năng của em không giải quyết được.
Em có một dãy số bất kỳ tại cột G. khi em nhập một giá trị bất kì tại ô màu đỏ ví dụ là 60
thì tại cột H nó sẽ tự động lấy giá trị ở cột G từ trên xuông (bắt buộc) sao cho tổng
ở vùng màu vàng của côt H phải thỏa mãn 1 trong các điều kiện sau
1. bằng ô màu đỏ tại cột H
2. lớn hơn ô màu đỏ tại cột H với giá trị gần nhất ví dụ 61 (tùy vào tổng của vùng màu vàng)
3. nhỏ hơn ô màu đỏ tại cột H với giá trị gần nhất ví dụ 59 (tùy vào tổng của vùng màu vàng).
Mỗi khi giá trị ở cột G thay đổi thì giá trị của vùng màu vàng tại cột H sẽ thay đổi theo.
tương tự khi nhập giá trị bất kì cho các cột I,J,K,L,M
Em rất mong các bác cao thủ giúp em với. em cám ơn các bác nhiều lắm.

Bạn xem file đính kèm nhé.
 

File đính kèm

Upvote 0
Bạn điền số vào ô B2 rồi ấn nút Solve để tìm
 

File đính kèm

Upvote 0
Em chào các bác. em có bài toán này nhưng với khả năng của em không giải quyết được.
Em có một dãy số bất kỳ tại cột G. khi em nhập một giá trị bất kì tại ô màu đỏ ví dụ là 60
thì tại cột H nó sẽ tự động lấy giá trị ở cột G từ trên xuông (bắt buộc) sao cho tổng
ở vùng màu vàng của côt H phải thỏa mãn 1 trong các điều kiện sau
1. bằng ô màu đỏ tại cột H
2. lớn hơn ô màu đỏ tại cột H với giá trị gần nhất ví dụ 61 (tùy vào tổng của vùng màu vàng)
3. nhỏ hơn ô màu đỏ tại cột H với giá trị gần nhất ví dụ 59 (tùy vào tổng của vùng màu vàng).
Mỗi khi giá trị ở cột G thay đổi thì giá trị của vùng màu vàng tại cột H sẽ thay đổi theo.
tương tự khi nhập giá trị bất kì cho các cột I,J,K,L,M
Em rất mong các bác cao thủ giúp em với. em cám ơn các bác nhiều lắm.
Bài này dùng công thức cũng đơn giản mà.
Nếu lấy số nhỏ khi trị tuyệt đối của điều kiện 2 và 3 bằng nhau thì dùng công thức sau:
Mã:
=IF(SUM($G$4:G4)-G4/2<$H$2,G4,"")
Nếu lấy số lớn thì dùng công thức sau:
Mã:
=IF(SUM($G$4:G4)-G4/2<=$H$2,G4,"")
 
Upvote 0
Bạn xem file đính kèm nhé.
em cám ơn bác nhiều lắm. em còn 1 chút này nữa thôi mong bác chỉ giáo.
em muốn ô I2 khi nhập vào nó sẽ không lấy những giá trị của cột G đã có tại cột H mà lấy kế tiếp như file này được không bác.
mong bác giúp em

Capture.jpg
 

File đính kèm

Upvote 0
Bài này dùng công thức cũng đơn giản mà.
Nếu lấy số nhỏ khi trị tuyệt đối của điều kiện 2 và 3 bằng nhau thì dùng công thức sau:
Mã:
=IF(SUM($G$4:G4)-G4/2<$H$2,G4,"")
Nếu lấy số lớn thì dùng công thức sau:
Mã:
=IF(SUM($G$4:G4)-G4/2<=$H$2,G4,"")

em cám ơn bác. em cũng làm như bác rồi nhưng mà file nó có mấy nghìn dòng. đến lúc nó load nặng quá. vì vốn dĩ file em nó có quá nhiều link
 
Upvote 0
em cám ơn bác nhiều lắm. em còn 1 chút này nữa thôi mong bác chỉ giáo.
em muốn ô I2 khi nhập vào nó sẽ không lấy những giá trị của cột G đã có tại cột H mà lấy kế tiếp như file này được không bác.
mong bác giúp em

Quy luật nhập dữ liệu vào từ H2 -> M2 như nào bạn? Nhập liên tục và thứ tự từ H2 -> M2 hay là có trường hợp bỏ trống?
 
Upvote 0
Quy luật nhập dữ liệu vào từ H2 -> M2 như nào bạn? Nhập liên tục và thứ tự từ H2 -> M2 hay là có trường hợp bỏ trống?

bao gồm cả 2 bác à. Ví dụ nếu H2 bỏ trống mà I2 được nhập 10 thì dãy 1 2 3 4 sẽ chuyển sang cột I.
nếu cột J2 được nhập 20 thì dữ liệu sẽ lấy kế tiếp là 567 không lấy 1234 nữa vì dữ liệu 1234 đã có tại cột I. giống kiểu lấy lũy kế ấy. chỉ là đảm bảo sao cho dữ liệu thỏa mã 1 trong 3 điều kiện mà em đã nêu.
 
Lần chỉnh sửa cuối:
Upvote 0
bao gồm cả 2 bác à. Ví dụ nếu H2 bỏ trống mà I2 được nhập 10 thì dãy 1 2 3 4 sẽ chuyển sang cột I.
nếu cột J2 được nhập 20 thì dữ liệu sẽ lấy kế tiếp là 567 không lấy 1234 nữa. giống kiểu lấy lũy kế ấy. chỉ là đảm bảo sao cho dữ liệu thỏa mã 1 trong 3 điều kiện mà em đã nêu.
Như vầy nhé.
1/ H2 nhập 10, IJK2 bỏ trống, L2 nhập 20, M2 nhập 30, có trường hợp này không?
2/ Sau khi nhập xong từ H2-M2 đầy đủ, sau đó bạn xóa J2, K2 đi chẳng hạn thì có nhập lại L2, M2 không? Nếu không nhập lại thì có cần cập nhật lại kết quả ở cột L và M không?
3/ Sau khi nhập xong từ H2-M2 đầy đủ, sau đó bạn chỉ thay đổi giá trị tại 1 trong các ô H2->M2 thì kết quả cần cập nhật lại không?
Nhiều vấn đề lắm, bạn ngâm cứu từ từ...
 
Upvote 0
Như vầy nhé.
1/ H2 nhập 10, IJK2 bỏ trống, L2 nhập 20, M2 nhập 30, có trường hợp này không?
2/ Sau khi nhập xong từ H2-M2 đầy đủ, sau đó bạn xóa J2, K2 đi chẳng hạn thì có nhập lại L2, M2 không? Nếu không nhập lại thì có cần cập nhật lại kết quả ở cột L và M không?
3/ Sau khi nhập xong từ H2-M2 đầy đủ, sau đó bạn chỉ thay đổi giá trị tại 1 trong các ô H2->M2 thì kết quả cần cập nhật lại không?
Nhiều vấn đề lắm, bạn ngâm cứu từ từ...

Thưa bác. không hiểu sao bác nói đúng hết. tất cả các trường hợp đều có thể sảy ra.
và kể cả dữ liệu ở cột G thay đổi thì dữ liệu cũng cần cập nhật lại bác ạ.
em không biết cái này có làm khó được bác không nhưng đối với em là cái vực sâu rồi chẳng biết nên làm kiểu gì.
mong bác chỉ cho.
 
Upvote 0
Thưa bác. không hiểu sao bác nói đúng hết. tất cả các trường hợp đều có thể sảy ra.
và kể cả dữ liệu ở cột G thay đổi thì dữ liệu cũng cần cập nhật lại bác ạ.
em không biết cái này có làm khó được bác không nhưng đối với em là cái vực sâu rồi chẳng biết nên làm kiểu gì.
mong bác chỉ cho.

Bạn để ý ở dưới cuối trang web:
Hiện có 9 người đang xem đề tài này...
Có người đang xem giúp bài cho bạn đó. Không phải lo lắng ha!
 
Upvote 0
Bạn để ý ở dưới cuối trang web:

Có người đang xem giúp bài cho bạn đó. Không phải lo lắng ha!

Bác không giúp em nữa sao..buồn quá Nhưng dù sao bác cũng giúp em quá nhiều rồi.
Trân trọng cám ơn bác rất nhiều.
chúc bác luôn vui vẻ.
 
Upvote 0
Bác không giúp em nữa sao..buồn quá Nhưng dù sao bác cũng giúp em quá nhiều rồi.
Trân trọng cám ơn bác rất nhiều.
chúc bác luôn vui vẻ.

Oh hay. Tôi có nói là không xem giúp bạn nữa đâu.
Bạn để ý dưới cuối trang web mà có cái nick nào xanh xanh đậm đậm trở lên là cứ yên tâm ha.
 
Upvote 0
bạn xem thử có ổn không

Về cơ bản nó đã ổn theo dữ liệu trả về lũy kế. Nhưng về phần tính tổng vẫn không ổn bác ạ.
Dãy được tính tổng nó không sát với kết quả cho trước. chẳng hạn nhập 10 vào I2
Nó phải trả về dãy 4 và 5 tổng là 9 thì mới sát nhất bác ạ. Chứ nó chỉ trả về 4 thì chênh lệch quá nhiều
Bác xem giúp em với.


Capture.jpg
 
Upvote 0
Về cơ bản nó đã ổn theo dữ liệu trả về lũy kế. Nhưng về phần tính tổng vẫn không ổn bác ạ.
Dãy được tính tổng nó không sát với kết quả cho trước. chẳng hạn nhập 10 vào I2
Nó phải trả về dãy 4 và 5 tổng là 9 thì mới sát nhất bác ạ. Chứ nó chỉ trả về 4 thì chênh lệch quá nhiều
Bác xem giúp em với.
do không đọc yêu cầu của bạn nên hiểu nhầm, bạn sửa lại code sub GPE
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
    dk = Sarr(1, j)
    t1 = 0
    For i = 1 To UBound(Darr) - 1
        If Arr(i, LastC + 1) <> 123 Then
            t1 = t1 + Darr(i, 1)
            If t1 - Darr(i, 1) / 2 <= dk Then
                Arr(i, j) = Darr(i, 1): Arr(i, LastC + 1) = 123
            End If
        End If
    Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
 
Upvote 0
do không đọc yêu cầu của bạn nên hiểu nhầm, bạn sửa lại code sub GPE
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
    dk = Sarr(1, j)
    t1 = 0
    For i = 1 To UBound(Darr) - 1
        If Arr(i, LastC + 1) <> 123 Then
            t1 = t1 + Darr(i, 1)
            If t1 - Darr(i, 1) / 2 <= dk Then
                Arr(i, j) = Darr(i, 1): Arr(i, LastC + 1) = 123
            End If
        End If
    Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub

Quá hoàn hảo luôn. Trân trong cám ơn các bác.
 
Upvote 0
Vẫn có trường hợp chưa đúng --=0

em tìm mãi mới thấy cái này nghĩa là cách tính tổng có vấn đề. em thử thêm vào vài con số khác thì nó ra kết quả này.
có cách nào với trường hợp này nó sẽ chia con số 600 kia ra đẩy sang cột J, để tổng gần nhất với số cho trước là 500 không

Capture.jpg
 

File đính kèm

  • Capture.jpg
    Capture.jpg
    14.9 KB · Đọc: 27
Lần chỉnh sửa cuối:
Upvote 0
em tìm mãi mới thấy cái này nghĩa là cách tính tổng có vấn đề. em thử thêm vào vài con số khác thì nó ra kết quả này.
có cách nào với trường hợp này nó sẽ chia con số 600 kia ra đẩy sang cột J, để tổng gần nhất với số cho trước là 500 không

View attachment 167661

Trường hợp bạn nêu là do dữ liệu cột G khác với file bài #1 (cái tội giả lập dữ liệu không khớp với dữ liệu thật, quy luật sẽ khác nhau). Cái này khác với cái tôi phát hiện.
Mà sửa code thì tìm chủ nhân nhá. Tôi không được phép.
 
Upvote 0
vâng cảm ơn bác rất nhiều. nói đúng ra thì em không tính toán được hết. chỉ là khi em nhập nó mới phát sinh vấn đề bác ạ.
 
Upvote 0
em tìm mãi mới thấy cái này nghĩa là cách tính tổng có vấn đề. em thử thêm vào vài con số khác thì nó ra kết quả này.
có cách nào với trường hợp này nó sẽ chia con số 600 kia ra đẩy sang cột J, để tổng gần nhất với số cho trước là 500 không

View attachment 167661

Hình này vẫn đúng với các điều kiện mà bạn đưa ra +-+-+-+
 
Upvote 0
Hình này vẫn đúng với các điều kiện mà bạn đưa ra +-+-+-+

Ôi em hay bị tâm lý vì em thấy bác kia bao vẫn có chỗ chưa đúng hihihi nên em hỏi lại.
Em muốn nhờ các bác thêm 1 vấn đề nữa. em định post bài khác nhưng em nghĩ nó cùng 1 vấn đề.
Cũng với cách tính tổng này nhưng nó sẽ tính đúng với số tổng đã cho trước.
nghĩa là nếu tổng các giá trị lấy ra mà lớn hơn số tổng đã cho trước thì số tổng ban đầu phải trừ đi giá
trị cuối cùng trong dãy N đơn vị để tổng được tính bằng đúng với số tổng ban đầu.
số bị trừ sẽ được chuyển sang cột bên cạnh để cộng với các giá trị khác.

Ví dụ cụ thể em đã nhập lại số trong file mà các bác đã giúp em. em gửi lại để các bác xem.
Rất mong các bác giúp em.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
do không đọc yêu cầu của bạn nên hiểu nhầm, bạn sửa lại code sub GPE
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
    dk = Sarr(1, j)
    t1 = 0
    For i = 1 To UBound(Darr) - 1
        If Arr(i, LastC + 1) <> 123 Then
            t1 = t1 + Darr(i, 1)
            If t1 - Darr(i, 1) / 2 <= dk Then
                Arr(i, j) = Darr(i, 1): Arr(i, LastC + 1) = 123
            End If
        End If
    Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
Em muốn nhờ các bác thêm 1 vấn đề nữa. em định post bài khác nhưng em nghĩ nó cùng 1 vấn đề.
Cũng với cách tính tổng này nhưng nó sẽ tính đúng với số tổng đã cho trước.
nghĩa là nếu tổng các giá trị lấy ra mà lớn hơn số tổng đã cho trước thì số tổng ban đầu phải trừ đi giá
trị cuối cùng trong dãy N đơn vị để tổng được tính bằng đúng với số tổng ban đầu.
số bị trừ sẽ được chuyển sang cột bên cạnh để cộng với các giá trị khác. em diễn tả hơi ngu tí
vì em không có logic
Ví dụ cụ thể em đã nhập lại số trong file mà các bác đã giúp em. em gửi lại để các bác xem.
Rất mong các bác giúp em.
 

File đính kèm

Upvote 0
Bác đừng tức giận. em nói thật là em không biết cái gì cả nên khi bác nói em sẽ tin.
vì mọi người đã giúp đỡ rất nhiệt tình. mong bác thông cảm

Ây dza. Đó là một câu khẳng định.
Nếu có gì không thích thì mình nghỉ chơi thôi.
p/s: Tôi chờ bạn kiểm tra các trường hợp của bạn, nếu nó không xảy ra lỗi đó thì cũng không cần thiết chỉnh lại. Thực tế mà không xảy ra thì bỏ qua thôi.
 
Upvote 0
Ây dza. Đó là một câu khẳng định.
Nếu có gì không thích thì mình nghỉ chơi thôi.
p/s: Tôi chờ bạn kiểm tra các trường hợp của bạn, nếu nó không xảy ra lỗi đó thì cũng không cần thiết chỉnh lại. Thực tế mà không xảy ra thì bỏ qua thôi.

em thấy chạy ổn bác ạ. chỉ là em nhờ các bác thêm 1 trường hợp tính tổng đúng với số cho trước em vừa nêu trên thôi
em mong các bác giúp em.
 
Upvote 0
Em muốn nhờ các bác thêm 1 vấn đề nữa. em định post bài khác nhưng em nghĩ nó cùng 1 vấn đề.
Cũng với cách tính tổng này nhưng nó sẽ tính đúng với số tổng đã cho trước.
nghĩa là nếu tổng các giá trị lấy ra mà lớn hơn số tổng đã cho trước thì số tổng ban đầu phải trừ đi giá
trị cuối cùng trong dãy N đơn vị để tổng được tính bằng đúng với số tổng ban đầu.
số bị trừ sẽ được chuyển sang cột bên cạnh để cộng với các giá trị khác. em diễn tả hơi ngu tí
vì em không có logic
Ví dụ cụ thể em đã nhập lại số trong file mà các bác đã giúp em. em gửi lại để các bác xem.
Rất mong các bác giúp em.
bạn chạy code thử
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
 
Upvote 0
bạn chạy code thử
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
bác giỏi quá. bái phục luôn. quá chuẩn, tuyệt vời
 
Upvote 0
bạn chạy code thử
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub

Bác ơi nếu em muốn tùy chọn các cột để nhập số tổng bất kỳ ví dụ H2, K2, M2 .... thì làm thế nào vậy bác
 
Upvote 0
code cho phép nhập số tổng vào H2...M2, bạn nhập thử, nếu có vấn đề thì báo cụ thể, mình sẽ kiểm tra lại
Vâng code của bác quá tuyệt rồi.
ý em là em chỉ muốn thiết lập thêm tùy chọn cho các cột nhập số tổng
nghĩa là chỉ những cột nào được thiết lập thì mới tính tổng,
cột không được thiết lập số tổng cho trước nếu có nhập giá trị thì cũng sẽ không được tính tổng.
vị dụ như Cột J như hình bên dưới.
Capture.jpg
 
Upvote 0
Vâng code của bác quá tuyệt rồi.
ý em là em chỉ muốn thiết lập thêm tùy chọn cho các cột nhập số tổng
nghĩa là chỉ những cột nào được thiết lập thì mới tính tổng,
cột không được thiết lập số tổng cho trước nếu có nhập giá trị thì cũng sẽ không được tính tổng.
vị dụ như Cột J như hình bên dưới.
không chạy code cột J? nếu vậy phải có nơi ghi nhận điều kiện như dòng 3 nhập Ok mới chạy cột nầy?
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
[COLOR=#ff0000]Sarr = Sheet1.Range("H2:M3").Value[/COLOR]
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
[COLOR=#ff0000]    If Sarr(1, j) > 0 And Sarr(2, j) = "Ok" Then[/COLOR]
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
không chạy code cột J? nếu vậy phải có nơi ghi nhận điều kiện như dòng 3 nhập Ok mới chạy cột nầy?
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
[COLOR=#ff0000]Sarr = Sheet1.Range("H2:M3").Value[/COLOR]
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
[COLOR=#ff0000]    If Sarr(1, j) > 0 And Sarr(2, j) = "Ok" Then[/COLOR]
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
Nó không chạy được bác ạ. em nhập số vào các Ô khác nó không chạy ra kết quả
 
Upvote 0
bạn xem file, trong code mình chỉnh ok theo chữ thường cho bạn dễ nhập
 

File đính kèm

Upvote 0
vị trí các ô ở các sheet khác có giống với sheet1 không?
Có khác bác ạ. đôi khi em sẽ điều chỉnh em nhìn code của bác em có thể điều chỉnh được. nhưng em không biết làm sao để áp dụng cho nhiều sheet
 
Lần chỉnh sửa cuối:
Upvote 0
Có khác bác ạ. đôi khi em sẽ điều chỉnh em nhìn code của bác em có thể điều chỉnh được. nhưng em không biết làm sao để áp dụng cho nhiều sheet
trong mỗi sheet cần chạy code, bạn copy và dán đoạn code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("$H$2:$M$3"), Target) Is Nothing Then
    If Target.Count = 1 Then
        Call GPE
    End If
End If
End Sub
sửa code GPE lại
Mã:
Sub GPE()
Dim i As Long, j As Integer, t1 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Range("G65000").End(xlUp).Row
Darr = Range("G4:G" & LastR + 1).Value
Sarr = Range("H2:M3").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 And Sarr(2, j) = "ok" Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
 
Upvote 0
trong mỗi sheet cần chạy code, bạn copy và dán đoạn code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("$H$2:$M$3"), Target) Is Nothing Then
    If Target.Count = 1 Then
        Call GPE
    End If
End If
End Sub
sửa code GPE lại
Mã:
Sub GPE()
Dim i As Long, j As Integer, t1 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Range("G65000").End(xlUp).Row
Darr = Range("G4:G" & LastR + 1).Value
Sarr = Range("H2:M3").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 And Sarr(2, j) = "ok" Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
Ok rồi bác ạ. chạy ngon quá
 
Upvote 0
trong mỗi sheet cần chạy code, bạn copy và dán đoạn code sau
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Range("$H$2:$M$3"), Target) Is Nothing Then
    If Target.Count = 1 Then
        Call GPE
    End If
End If
End Sub
sửa code GPE lại
Mã:
Sub GPE()
Dim i As Long, j As Integer, t1 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Range("G65000").End(xlUp).Row
Darr = Range("G4:G" & LastR + 1).Value
Sarr = Range("H2:M3").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 And Sarr(2, j) = "ok" Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
Bác ơi sau một thời gian chạy em thấy em cần phải di chuyển cột chứa chữ OK thành hàng dọc. ở 1 cột bất kì chẳng hạn cột F.
và mỗi khi nhập ok thì giá trị ở cột G tương ứng mới được tính toán còn không thì bỏ qua. Ví dụ như ảnh bên dưới em đính kèm cả file mong bác giúp em với.

Capture.jpg
 

File đính kèm

Upvote 0
Bác ơi sau một thời gian chạy em thấy em cần phải di chuyển cột chứa chữ OK thành hàng dọc. ở 1 cột bất kì chẳng hạn cột F.
và mỗi khi nhập ok thì giá trị ở cột G tương ứng mới được tính toán còn không thì bỏ qua. Ví dụ như ảnh bên dưới em đính kèm cả file mong bác giúp em với.
bạn nên nhập "ok" ở cột F cho code viết gọn, nếu cột khác F thì báo mình viết lại
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("F4:G" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 And Darr(i, 1) = "ok" Then
                t1 = t1 + Darr(i, 2)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 2)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 2) - t1
                    Darr(i, 2) = Darr(i, 2) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
 
Upvote 0
bạn nên nhập "ok" ở cột F cho code viết gọn, nếu cột khác F thì báo mình viết lại
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("F4:G" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 And Darr(i, 1) = "ok" Then
                t1 = t1 + Darr(i, 2)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 2)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 2) - t1
                    Darr(i, 2) = Darr(i, 2) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
Bác ơi bác có thể cho code tuy chỉnh được cột bất kỳ được không. vì em em sợ sau này bác không online
mà có vấn đề phát sinh em muốn dịch chuyển cột lại không biết tìm bác ở đâu để hỏi. mong bác giúp đỡ.
 
Upvote 0
Bác ơi bác có thể cho code tuy chỉnh được cột bất kỳ được không. vì em em sợ sau này bác không online
mà có vấn đề phát sinh em muốn dịch chuyển cột lại không biết tìm bác ở đâu để hỏi. mong bác giúp đỡ.
Những yêu cầu dạng này thì nên làm dạng UDF cho dễ dùng.
PHP:
Function RevTotalTable(RowTotal As Variant, ColTotal As Variant) As Variant
Dim CallerRng As Range, Result() As Variant, i As Long, j As Long, Tmp As Variant, iCol As Long, ArrRow() As Double, ArrCol() As Double, MinVal As Double
On Error Resume Next
Set CallerRng = Application.Caller
If CallerRng Is Nothing Then Exit Function
ReDim ArrRow(1 To CallerRng.Rows.Count)
ReDim ArrCol(1 To CallerRng.Columns.Count)
ReDim Result(1 To CallerRng.Rows.Count, 1 To CallerRng.Columns.Count) As Variant
For Each Tmp In RowTotal
    i = i + 1
    ArrRow(i) = Tmp
Next
i = 0
Tmp = ArrCol
For Each Tmp In ColTotal
    i = i + 1
    ArrCol(i) = Tmp
Next
iCol = 1
For i = 1 To UBound(ArrRow, 1)
    For j = iCol To UBound(ArrCol, 1)
        MinVal = IIf(ArrRow(i) < ArrCol(j), ArrRow(i), ArrCol(j))
        If MinVal > 0 Then
            Result(i, j) = MinVal
            ArrRow(i) = ArrRow(i) - MinVal
            ArrCol(j) = ArrCol(j) - MinVal
        End If
        If ArrRow(i) = 0 Then Exit For
    Next
Next
RevTotalTable = Result
End Function
 

File đính kèm

Upvote 0
Bác ơi bác có thể cho code tuy chỉnh được cột bất kỳ được không. vì em em sợ sau này bác không online
mà có vấn đề phát sinh em muốn dịch chuyển cột lại không biết tìm bác ở đâu để hỏi. mong bác giúp đỡ.
khi cần thay đổi cột thì chỉnh lại cột F trong Oarr= ....
Mã:
Sub GPE()
Dim i As Long, t1 As Long, t2 As Long, dk As Long
Dim LastR As Long, LastC As Integer, Darr(), Sarr(), Arr(), Oarr()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR + 1).Value
Oarr = Sheet1.Range("F4:F" & LastR + 1).Value
Sarr = Sheet1.Range("H2:M2").Value
LastC = UBound(Sarr, 2)
ReDim Arr(1 To UBound(Darr), 1 To LastC + 1)
Range("H4:M" & LastR).ClearContents
For j = 1 To LastC
    If Sarr(1, j) > 0 Then
        dk = Sarr(1, j)
        t1 = 0
        For i = 1 To UBound(Darr) - 1
            If Arr(i, LastC + 1) <> 123 And Oarr(i, 1) = "ok" Then
                t1 = t1 + Darr(i, 1)
                If t1 <= dk Then
                    Arr(i, j) = Darr(i, 1)
                    Arr(i, LastC + 1) = 123
                    If t1 = dk Then Exit For
                Else
                    Arr(i, j) = Sarr(1, j) + Darr(i, 1) - t1
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    Exit For
                End If
            End If
        Next i
    End If
Next j
Sheet1.Range("H4").Resize(UBound(Arr) - 1, UBound(Arr, 2) - 1) = Arr
End Sub
 
Upvote 0
Những yêu cầu dạng này thì nên làm dạng UDF cho dễ dùng.
PHP:
Function RevTotalTable(RowTotal As Variant, ColTotal As Variant) As Variant
Dim CallerRng As Range, Result() As Variant, i As Long, j As Long, Tmp As Variant, iCol As Long, ArrRow() As Double, ArrCol() As Double, MinVal As Double
On Error Resume Next
Set CallerRng = Application.Caller
If CallerRng Is Nothing Then Exit Function
ReDim ArrRow(1 To CallerRng.Rows.Count)
ReDim ArrCol(1 To CallerRng.Columns.Count)
ReDim Result(1 To CallerRng.Rows.Count, 1 To CallerRng.Columns.Count) As Variant
For Each Tmp In RowTotal
    i = i + 1
    ArrRow(i) = Tmp
Next
i = 0
Tmp = ArrCol
For Each Tmp In ColTotal
    i = i + 1
    ArrCol(i) = Tmp
Next
iCol = 1
For i = 1 To UBound(ArrRow, 1)
    For j = iCol To UBound(ArrCol, 1)
        MinVal = IIf(ArrRow(i) < ArrCol(j), ArrRow(i), ArrCol(j))
        If MinVal > 0 Then
            Result(i, j) = MinVal
            ArrRow(i) = ArrRow(i) - MinVal
            ArrCol(j) = ArrCol(j) - MinVal
        End If
        If ArrRow(i) = 0 Then Exit For
    Next
Next
RevTotalTable = Result
End Function
Bác ơi với các này em đã cho vào file của em rồi nhưng mà có ít dòng thì không sao file em lên đến 40.000 dòng thì đợi nó tính toán lâu lắm. mất vài phút cho mỗi lần nhập. không còn cách nào khác hả bác.
 
Upvote 0
Bác ơi với các này em đã cho vào file của em rồi nhưng mà có ít dòng thì không sao file em lên đến 40.000 dòng thì đợi nó tính toán lâu lắm. mất vài phút cho mỗi lần nhập. không còn cách nào khác hả bác.
Khi tôi trả lời thì đó là cách tốt nhất mà tôi có thể làm được rồi.
Nếu các cách trước nhanh hơn thì bạn dùng các cách đó đi.
 
Upvote 0
code xét "ok" vừa theo dòng và cột, để bạn dể tùy biến

cám ơn bác. chạy ổn rồi bác ạ. em không hiểu sao những người lập trình như bác lại nghĩ cách giải quyết nhanh đến vậy.
Những con số những dòng lệnh các bác xử lý nhanh gọn. em chịu không thể hiểu được.
 
Upvote 0
code xét "ok" vừa theo dòng và cột, để bạn dể tùy biến
Bác ơi. trước khi em nhờ bác giúp em, em xin lỗi bác vì nói thật là em gặp phải tình trạng này
mà thực sự là em không biết trình bày thế nào cả.
Mãi tận hôm nay em nghĩ nát óc mới viết được ra ý tưởng mà đáng lẽ em phải nói từ lúc đầu.
Dữ liệu em dùng rất hay gặp phải tình trạng không phải theo từ trên xuống dưới nữa mà nó rải rác lắm.

Ngoài tùy chọn ok ở cột F em rất muốn có thêm các tùy chọn theo thứ tự ưu tiêu như 1,2,3,4,5,6,7,8
Cùng cột F nếu như tồn tại đồng thời một trong các giá trị ưu tiên như ok,1,2,3,4,5,6,7,8 thì sẽ ưu tiên tính tổng
ok trước sau đó mới đến 1,2,3,4,5,6,7,8 nghĩa là từ trái qua phải và nếu để 0 sẽ không được tính.

Em rất mong bác giúp em vì file của em nó hàng chuc nghìn dòng mà em ngồi làm bằng tay thì em nản và đau đầu lắm.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
bạn dùng code mới
Mã:
Sub GPE()
Dim i As Long, n As Long, m As Long, LastR As Long, j As Integer
Dim Darr(), Sarr(), Arr(), Oarr(), Ok123()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR).Value
Sarr = Sheet1.Range("H2:P3").Value
ReDim Arr(1 To UBound(Darr), 1 To UBound(Sarr, 2))
Oarr = Sheet1.Range("F4:F" & LastR).Value
ReDim Ok123(1 To UBound(Oarr), 1 To 1)
n = 1:      Ok123(n, 1) = "ok"
For m = 1 To UBound(Oarr)
    For i = 1 To UBound(Oarr)
        If Oarr(i, 1) = m Then
            n = n + 1: Ok123(n, 1) = m: Exit For
        End If
    Next i
Next m
For m = 1 To n
    For j = 1 To UBound(Sarr, 2)
        If Sarr(1, j) > 0 And Sarr(2, j) = "ok" Then
            For i = 1 To UBound(Darr)
                If Darr(i, 1) > 0 And Oarr(i, 1) = Ok123(m, 1) Then
                    If Darr(i, 1) <= Sarr(1, j) Then
                        Arr(i, j) = Darr(i, 1)
                    Else
                        Arr(i, j) = Sarr(1, j)
                    End If
                    Sarr(1, j) = Sarr(1, j) - Arr(i, j)
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    If Sarr(1, j) = 0 Then Exit For
                End If
            Next i
        End If
    Next j
Next m
Range("H4:P" & LastR).ClearContents
Sheet1.Range("H4").Resize(UBound(Arr), UBound(Arr, 2)) = Arr
End Sub
 
Upvote 0
bạn dùng code mới
Mã:
Sub GPE()
Dim i As Long, n As Long, m As Long, LastR As Long, j As Integer
Dim Darr(), Sarr(), Arr(), Oarr(), Ok123()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR).Value
Sarr = Sheet1.Range("H2:P3").Value
ReDim Arr(1 To UBound(Darr), 1 To UBound(Sarr, 2))
Oarr = Sheet1.Range("F4:F" & LastR).Value
ReDim Ok123(1 To UBound(Oarr), 1 To 1)
n = 1:      Ok123(n, 1) = "ok"
For m = 1 To UBound(Oarr)
    For i = 1 To UBound(Oarr)
        If Oarr(i, 1) = m Then
            n = n + 1: Ok123(n, 1) = m: Exit For
        End If
    Next i
Next m
For m = 1 To n
    For j = 1 To UBound(Sarr, 2)
        If Sarr(1, j) > 0 And Sarr(2, j) = "ok" Then
            For i = 1 To UBound(Darr)
                If Darr(i, 1) > 0 And Oarr(i, 1) = Ok123(m, 1) Then
                    If Darr(i, 1) <= Sarr(1, j) Then
                        Arr(i, j) = Darr(i, 1)
                    Else
                        Arr(i, j) = Sarr(1, j)
                    End If
                    Sarr(1, j) = Sarr(1, j) - Arr(i, j)
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    If Sarr(1, j) = 0 Then Exit For
                End If
            Next i
        End If
    Next j
Next m
Range("H4:P" & LastR).ClearContents
Sheet1.Range("H4").Resize(UBound(Arr), UBound(Arr, 2)) = Arr
End Sub
Một phút bác làm bằng 1 năm em cày quốc. thế này đâu phải ma trận nữa. phải gọi là bát quoái trận của gia cát lượng. không hiểu bác làm kiểu gì nữa quá tuyệt vời luôn. cám ơn bác.
 
Upvote 0
bạn dùng code mới
Mã:
Sub GPE()
Dim i As Long, n As Long, m As Long, LastR As Long, j As Integer
Dim Darr(), Sarr(), Arr(), Oarr(), Ok123()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR).Value
Sarr = Sheet1.Range("H2:P3").Value
ReDim Arr(1 To UBound(Darr), 1 To UBound(Sarr, 2))
Oarr = Sheet1.Range("F4:F" & LastR).Value
ReDim Ok123(1 To UBound(Oarr), 1 To 1)
n = 1:      Ok123(n, 1) = "ok"
For m = 1 To UBound(Oarr)
    For i = 1 To UBound(Oarr)
        If Oarr(i, 1) = m Then
            n = n + 1: Ok123(n, 1) = m: Exit For
        End If
    Next i
Next m
For m = 1 To n
    For j = 1 To UBound(Sarr, 2)
        If Sarr(1, j) > 0 And Sarr(2, j) = "ok" Then
            For i = 1 To UBound(Darr)
                If Darr(i, 1) > 0 And Oarr(i, 1) = Ok123(m, 1) Then
                    If Darr(i, 1) <= Sarr(1, j) Then
                        Arr(i, j) = Darr(i, 1)
                    Else
                        Arr(i, j) = Sarr(1, j)
                    End If
                    Sarr(1, j) = Sarr(1, j) - Arr(i, j)
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    If Sarr(1, j) = 0 Then Exit For
                End If
            Next i
        End If
    Next j
Next m
Range("H4:P" & LastR).ClearContents
Sheet1.Range("H4").Resize(UBound(Arr), UBound(Arr, 2)) = Arr
End Sub
có lỗi sảy ra khi nhập từ 1 đến 17 ở cột F
Ok123(n, 1) = m khi đó n = 18 nhưng m = 17. có lẽ phải sửa 1 chút thành

If Oarr(i, 1) = m + 1 Then
n = n + 1: Ok123(n, 1) = m: Exit For
End If
không biết có đúng không
 
Lần chỉnh sửa cuối:
Upvote 0
có lỗi sảy ra khi nhập từ 1 đến 17 ở cột F
Ok123(n, 1) = m khi đó n = 18 nhưng m = 17. có lẽ phải sửa 1 chút thành

If Oarr(i, 1) = m + 1 Then
n = n + 1: Ok123(n, 1) = m: Exit For
End If
không biết có đúng không
cột F ok là phải có, nên nhập tới số lớn nhất là 17-1=16
còn nếu muốn nhập toàn số thì phải sửa code lại

chỉ cần chỉnh lại khai báo Ok123
Mã:
ReDim Ok123(1 To UBound(Oarr) [COLOR=#ff0000]+ 1[/COLOR], 1 To 1)
 
Lần chỉnh sửa cuối:
Upvote 0
có lỗi sảy ra khi nhập từ 1 đến 17 ở cột F
Ok123(n, 1) = m khi đó n = 18 nhưng m = 17. có lẽ phải sửa 1 chút thành

If Oarr(i, 1) = m + 1 Then
n = n + 1: Ok123(n, 1) = m: Exit For
End If
không biết có đúng không
Hiện tại em thấy ổn vì dù sao em vẫn có ok và chưa dùng toàn số.
 
Upvote 0
cột F ok là phải có, nên nhập tới số lớn nhất là 17-1=16
còn nếu muốn nhập toàn số thì phải sửa code lại

chỉ cần chỉnh lại khai báo Ok123
Mã:
ReDim Ok123(1 To UBound(Oarr) [COLOR=#ff0000]+ 1[/COLOR], 1 To 1)
Bác Hieu oi em nhập số gặp phải trường hợp nó không tính được ra kết quả bác ạ. dòng màu vàng
chỉ tính được 199 không đủ 213.
Capture.PNG
 
Upvote 0
Bác Hieu oi em nhập số gặp phải trường hợp nó không tính được ra kết quả bác ạ. dòng màu vàng
chỉ tính được 199 không đủ 213.
code trước là đánh thứ tự ưu tiên liên tục
code đánh thứ tự tùy ý
Mã:
Sub GPE()
Dim i As Long, n As Long, m As Long, LastR As Long, Max As Long, j As Integer
Dim Darr(), Sarr(), Arr(), Oarr(), Ok123()
LastR = Sheet1.Range("G65000").End(xlUp).Row
Darr = Sheet1.Range("G4:G" & LastR).Value
Sarr = Sheet1.Range("H2:P3").Value
ReDim Arr(1 To UBound(Darr), 1 To UBound(Sarr, 2))
Oarr = Sheet1.Range("F4:F" & LastR).Value
ReDim Ok123(1 To UBound(Oarr) [COLOR=#ff0000]+ 1[/COLOR], 1 To 1)
[COLOR=#ff0000]Max = WorksheetFunction.Max(Oarr)[/COLOR]
n = 1:      Ok123(n, 1) = "ok"
For m = 1 To [COLOR=#ff0000]Max[/COLOR]
    For i = 1 To UBound(Oarr)
        If Oarr(i, 1) = m Then
            n = n + 1: Ok123(n, 1) = m: Exit For
        End If
    Next i
Next m
For m = 1 To n
    For j = 1 To UBound(Sarr, 2)
        If Sarr(1, j) > 0 And Sarr(2, j) = "ok" Then
            For i = 1 To UBound(Darr)
                If Darr(i, 1) > 0 And Oarr(i, 1) = Ok123(m, 1) Then
                    If Darr(i, 1) <= Sarr(1, j) Then
                        Arr(i, j) = Darr(i, 1)
                    Else
                        Arr(i, j) = Sarr(1, j)
                    End If
                    Sarr(1, j) = Sarr(1, j) - Arr(i, j)
                    Darr(i, 1) = Darr(i, 1) - Arr(i, j)
                    If Sarr(1, j) = 0 Then Exit For
                End If
            Next i
        End If
    Next j
Next m
Range("H4:P" & LastR).ClearContents
Sheet1.Range("H4").Resize(UBound(Arr), UBound(Arr, 2)) = Arr
End Sub
 
Upvote 0

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

Back
Top Bottom