Viết code tìm giá trị nhỏ nhất (1 người xem)

  • Thread starter Thread starter avada29
  • Ngày gửi Ngày gửi
Liên hệ QC

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

avada29

Thành viên mới
Tham gia
26/7/13
Bài viết
23
Được thích
0
Chào các bác,
Hiện tại em đang có bài toán này cần các bác giúp đỡ. Em đang có 1 bài toán đã được tính toán trước trong sheet1, với giá trị đầu vào là chi phí dự phòng (tô màu vàng), và giá trị đầu ra là chi phí năm(tô màu xanh dương).
Trong sheet3 của em là giá trị thời gian dự phòng chạy từ 0.1h đến 10h.
Bài toán của em là muốn thay lần lượt giá trị dự phòng đó vào trong ô màu vàng, sau đó chọn và tìm giá trị chi phí nhỏ nhất, bỏ ô tô màu xanh lá cây (gọi là giá trị tối ưu).
Cái này em đang ví dụ cho 1 trường hợp, các bác có thể giúp em để mở rộng trong trường hợp em muốn thêm nhiều trường hợp vào các dòng phía dưới thì cập nhật giá trị như thế nào ạ, em cảm ơn các bác!/-*+/|||||
 

File đính kèm

Xin lỗi chủ topic, chứ tôi bị "loạn màu" không biết đâu là xanh lá với xanh dương (Đã đi lấy vài lá cây vào so với màu trong file của bạn nhưng không giống...)
Sao bạn không gọi theo địa chỉ ô (cell) đi cho rồi.
Còn dòng giá trị "Thời gian dự phòng" trong sheet3, sao bạn không bố trí theo cột cho dễ "nhìn". Kéo sang phải tôi thấy không thuận tay cho lắm.
Thường thì trong excel, bố trí các trường (mục) ở dòng phía trên và theo cột, các giá trị của trường (mục) đó bố trí ở cột tương ứng từ trên xuống. Như thế thuận tiện cho việc quan sát, vì ta hay cuộn trang theo phương đứng mà.
 
Upvote 0
Bài toán của em là muốn thay lần lượt giá trị dự phòng đó vào trong ô màu vàng, sau đó chọn và tìm giá trị chi phí nhỏ nhất, bỏ ô tô màu xanh lá cây (gọi là giá trị tối ưu).
Bạn xem file đính kèm nhé.
Cái này em đang ví dụ cho 1 trường hợp, các bác có thể giúp em để mở rộng trong trường hợp em muốn thêm nhiều trường hợp vào các dòng phía dưới thì cập nhật giá trị như thế nào ạ, em cảm ơn các bác!
Đoạn này thì không hiểu.
 

File đính kèm

Upvote 0
Em cảm ơn bác, cái dòng thứ 2 ý em là bây giờ em add thêm một số trạm ở hàng dưới, vì mỗi trạm sẽ có công suất khác nhau, chi phí khác nhau dẫn đến thời gian dự phòng và chi phí tối ưu sẽ khác nhau ý mà! Mà bác ơi cho em hỏi làm cách nào tắt cái chạy số như xổ số đó được không bác vì dữ liệu của em lớn, chạy kiểu đó sợ không biết khi nào mới xong @@
 
Upvote 0
Em cảm ơn bác, cái dòng thứ 2 ý em là bây giờ em add thêm một số trạm ở hàng dưới, vì mỗi trạm sẽ có công suất khác nhau, chi phí khác nhau dẫn đến thời gian dự phòng và chi phí tối ưu sẽ khác nhau ý mà!
Bạn gửi thêm vài trường hợp nữa xem như nào thì tính luôn một lượt.
Mà bác ơi cho em hỏi làm cách nào tắt cái chạy số như xổ số đó được không bác vì dữ liệu của em lớn, chạy kiểu đó sợ không biết khi nào mới xong @@
Cái này lạ à nha. Tôi chạy thử không vấn đề gì mới gửi file lên...
p/s: Thấy bài #4 có phản hồi... tôi giật mình mở file lên chạy lại vẫn không có vẫn đề gì.
Nếu không bạn sửa lại code như vầy:
Mã:
Sub chiphi()
Application.ScreenUpdating = False
Dim tg(), cp()
Dim kq As Double, n As Integer, i As Integer, t As Integer
tg = Sheet6.Range("B1:CW1")
n = UBound(tg, 2)
ReDim cp(1 To n)
Application.Calculation = xlCalculationAutomatic
For i = 1 To n
    Sheet3.Range("D3") = tg(1, i)
    cp(i) = Sheet3.Range("P3")
Next
kq = Application.Min(cp)
t = Application.Match(kq, cp, 0)
Sheet3.Range("Q3") = kq
Sheet3.Range("R3") = tg(1, t)
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Em cám ơn bác, tại vì hồi trước em có làm 1 bài nhỏ thôi, nhưng xây dựng kiểu hàm function, trả về giá trị luôn, sau đó kéo xuống dưới tương tự cho các trường hợp khác là tự động chạy ra luôn, nên em mới hỏi cái này có thể làm tương tự được vậy không ý mà :D
 
Upvote 0
Em ngồi mò làm thử cho 3 trạm bằng cách lồng 1 vòng lặp for phía ngoài nữa, khi chạy thì xuất hiện lỗi này ở dòng "t = Application.Match(kq, cp, 0)", nhờ bác hỗ trợ giúp em với ạ, em cảm ơn bác
P/s: Em gởi code em tự mò cho bác xem thử nhé
Sub chiphi()Application.ScreenUpdating = False
Dim tg(), cp()
Dim kq As Double, n As Integer, i As Integer, t As Integer, j As Integer
tg = Sheet6.Range("B1:CW1")
n = UBound(tg, 2)
ReDim cp(1 To n)
Application.Calculation = xlCalculationAutomatic
For j = 3 To 5
For i = 1 To n
Sheet3.Range("D:D").Cells(j, 1) = tg(1, i)
cp(i) = Sheet3.Range("P:P").Cells(j, 1)
Next
kq = Application.Min(cp)
t = Application.Match(kq, cp, 0)
Sheet3.Range("Q:Q").Cells(j, 1) = kq
Sheet3.Range("R3") = tg(1, t)
Next
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Em ngồi mò làm thử cho 3 trạm bằng cách lồng 1 vòng lặp for phía ngoài nữa, khi chạy thì xuất hiện lỗi này ở dòng "t = Application.Match(kq, cp, 0)", nhờ bác hỗ trợ giúp em với ạ, em cảm ơn bác
Lỗi dòng đó thì có thể do cp() chưa có giá trị (Tức là tại ô Pj nhập gì).
Bạn thử đoạn sau xem được ko nhé. Lưu ý là đã thiết lập đầy đủ công thức ở vùng E3:P5.
Mã:
Sub chiphi()
Application.ScreenUpdating = False
Dim tg(), cp()
Dim kq As Double, n As Integer, i As Integer, t As Integer, j As Integer
tg = Sheet6.Range("B1:CW1") 
n = UBound(tg, 2)
ReDim cp(1 To n)
Application.Calculation = xlCalculationAutomatic
For j = 0 To 2 'chạy từ D3 toi D5
    For i = 1 To n
        Sheet3.Range("D3").Offset(j, 0) = tg(1, i)
        cp(i) = Sheet3.Range("P3").Offset(j, 0).Value
    Next i
    kq = Application.Min(cp)
    t = Application.Match(kq, cp, 0)
    Sheet3.Range("Q3").Offset(j, 0) = kq
    Sheet3.Range("R3").Offset(j, 0) = tg(1, t)
Next j
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Ủa cái này em cũng mò như bác nè, kết quả đúng y chang là do mảng cp() chưa có giá trị nên xuất hiện lỗi trên. Tuy nhiên nếu làm vậy thì mỗi lần cập nhật giá trị vào thì phải sửa lại bằng tay, khá bất tiện, vì khả năng bên em sẽ có khoảng vài nghìn trường hợp như vậy, hix, hix. Em có thử làm lại code này để thoát khỏi vòng lặp trong trường hợp giá trị công suất đầu vào bằng 0, bác xem thử giúp em có được không nhé, em cám ơn bác
Em gởi kèm file tính toán luôn nhé!
Sub chiphinhieutram()
Application.ScreenUpdating = False
Dim tg(), cp()
Dim kq As Double, n As Integer, i As Integer, t As Integer, j As Integer
tg = Sheet6.Range("B1:CW1")
n = UBound(tg, 2)
ReDim cp(1 To n)
Application.Calculation = xlCalculationAutomatic
j = 0
Do
If Sheet3.Range("C3").Offset(j, 0) = 0 Then Exit Do
For i = 1 To n
Sheet3.Range("D3").Offset(j, 0) = tg(1, i)
cp(i) = Sheet3.Range("P3").Offset(j, 0)
Next
kq = Application.Min(cp)
t = Application.Match(kq, cp, 0)
Sheet3.Range("Q3").Offset(j, 0) = kq
Sheet3.Range("R3").Offset(j, 0) = tg(1, t)
j = j + 1
Loop
Application.ScreenUpdating = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Ủa cái này em cũng mò như bác nè, kết quả đúng y chang là do mảng cp() chưa có giá trị nên xuất hiện lỗi trên. Tuy nhiên nếu làm vậy thì mỗi lần cập nhật giá trị vào thì phải sửa lại bằng tay, khá bất tiện, vì khả năng bên em sẽ có khoảng vài nghìn trường hợp như vậy, hix, hix. Em có thử làm lại code này để thoát khỏi vòng lặp trong trường hợp giá trị công suất đầu vào bằng 0, bác xem thử giúp em có được không nhé, em cám ơn bác
Em gởi kèm file tính toán luôn nhé!
Bạn xem lại ở bài #6:
Bạn gửi thêm vài trường hợp nữa xem như nào thì tính luôn một lượt.
Mỗi lúc bạn lại thêm một ý... Bây giờ thêm: trường hợp giá trị công suất đầu vào bằng 0, bảng giá trị thời gian ứng với mỗi trạm lại khác nhau ở sheet "du lieu".
+-+-+-++-+-+-+
 
Upvote 0
Ý em là em tìm được cách khắc phục việc dính lỗi khi biến cp() không có giá trị rồi, cái code em đưa là để khắc phục, em hỏi ý bác xem thử như thế nào thôi, mà em có gởi cái file cho bác xem rồi mà nhỉ **~**!$@!!
 
Upvote 0
Ý em là em tìm được cách khắc phục việc dính lỗi khi biến cp() không có giá trị rồi, cái code em đưa là để khắc phục, em hỏi ý bác xem thử như thế nào thôi, mà em có gởi cái file cho bác xem rồi mà nhỉ **~**!$@!!

bạn có thể tăng tốc đáng kể, bằng cách dưa hết vào trong mảng, cả những công thức trên sheet nữa.
=========
nhưng tôi đọc câu hỏi và cả xem code cũng ko hiểu
ở sheet1:
1- cột C và cột D là do bạn nhập tay vào?
2- cột J và H (hàm countif và sum if) nó tương ứng với số hàng bên sheet "du lieu"?
như vậy số hàng bên sheet "dulieu" và sheet1 sẻ bằng nhau?
3- sheet 1 và sheet3 liên hệvới nhau như thế nào?
 
Upvote 0
Thực tế trong file của em gởi có 2 bài toán:
- Bài toán 1: Tìm chi phí năm của 1 trạm căn cứ vào các giá trị đầu vào: công suất trạm (cái này bên em có thống kê, chỉ cần vlookup là được), chi phí đầu tư máy phát điện (các thông tin giả định trong sheet2), thời gian dự phòng ắc quy, thời gian mất điện (trong sheet "dulieu"). Bài toán này trong sheet1 là từ cột C đến cột P
- Bài toán 2: Tìm chi phí tối ưu nhất dựa vào thời gian dự phòng của ắc quy. Ví dụ: thời gian dự phòng ắc quy cao thì phải đầu tư nhiều ắc quy ==> chi phí tăng, nhưng nếu thời gian dự phòng thấp quá thì phải đầu tư máy phát điện để hoạt động ==> cũng làm tăng chi phí đầu tư. Vì thế bài toán này là tìm điểm giá trị thời gian dự phòng sao cho chi phí là thấp nhất. Bài toán này chính là giá trị trong cột Q và R, dựa phòng thời gian dự phòng được chạy từ 0.1h đến 10h (thông tin từ sheet3)
Em đang nhờ các bác giúp đỡ là bài toán 2, còn bài toán 1 em có thử lập trình nhưng do trình còn yếu nên chưa làm được, cái này bác có thể giúp em được không ạ, hihihi
 
Upvote 0
Web KT

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

Back
Top Bottom