hỏi về viết vba để gọi chức năng solver

Liên hệ QC

hamhocarsenal

Thành viên mới
Tham gia
25/11/08
Bài viết
10
Được thích
0
mình sử dụng chức năng solver để tìm giá trị w tối ưu ở ô E4, bây giờ mình muốn viết vba trên 1 button để gọi chức năng này( chỉ cần gọi chức năng solver lên thôi ), vậy phải viết như thế nào, và nếu máy chưa cài sẵn add-ins này thì có thể hiện bảng thông báo lỗi là phải cài thêm, vậy đc ko, mong được giúp đỡ???
 

File đính kèm

Trước tiên bạn cần tìm hiểu về công dụng của Solver (trên diễn đàn có rất nhiều). Đơn giản bạn hãy xem ví dụ giải hệ phương trình của TTPhong:
http://www.giaiphapexcel.com/forum/showthread.php?t=2544&highlight=solver
Sau khi hiểu rõ rồi thì bạn lập bài toán của bạn theo dạng đó là OK.
Bạn có thể mở cửa sổ VBA, Help, gõ Solver để search sẽ có 1 loạt hàm về Solver cùng ví dụ cụ thể để bạn tham khảo.
Gợi ý nhỏ:
- Cách 1: File của bạn muốn sử dụng Solver = code VBA thì cửa sổ VBA, Tool, References, Browse, chọn file Solver.xla (Excel <=2003); Solver.xlam (Excel 2007).
- Cách 2: Thực chất của cách 1 là khi bạn mở file của bạn thì Solver.xla đã được mở ra chưa? Nếu mở rồi thì có thể sử dụng code VBA. Nếu chưa mở thì bạn mở nó ra, nếu lỗi thì thông báo chưa cài đặt.
Bạn có thể tham khảo code sau
* Kiểm tra workbook đã mở chưa?
Function WorkbookOpen(WorkBookName As String) As Boolean
' returns TRUE if the workbook is open
WorkbookOpen = False
On Error GoTo WorkBookNotOpen
If Len(Application.WorkBooks(WorkBookName).Name) > 0 Then
WorkbookOpen = True
Exit Function
End If
WorkBookNotOpen:
End Function

Example:
If Not WorkbookOpen("MyWorkbookName.xls") Then
Workbooks.Open "MyWorkbookName.xls"
End If
* Hoàng tráng hơn kết hợp với kiểm tra add-ins đã cài đặt chưa?
Sub DisplayAddIns()
Worksheets("Sheet1").Activate
rw = 1
For Each ad In Application.AddIns
Worksheets("Sheet1").Cells(rw, 1) = ad.Name
Worksheets("Sheet1").Cells(rw, 2) = ad.Installed
rw = rw + 1
Next
End Sub
Chúc thành công!
 
Upvote 0
sau khi chạy hàm solver nó hiện lên cái bảng solver results,mình chọn OK để lấy giá trị mới. Nếu mình muốn viết code vba để cho nó không hiện lên bảng thông báo đó, lúc nào cũng chọn OK thì làm thế nào
 
Upvote 0
sau khi chạy hàm solver nó hiện lên cái bảng solver results,mình chọn OK để lấy giá trị mới. Nếu mình muốn viết code vba để cho nó không hiện lên bảng thông báo đó, lúc nào cũng chọn OK thì làm thế nào
Sau khi viết code của bạn xong, gắn code này vào cuối.
SolverSolve UserFinish:=False
Bạn mở VBA, help, Search SOLVER để tìm hiểu thêm
 
Upvote 0
mình làm thử rồi, trong help nó cũng chỉ như vậy mà vẫn ko được
 
Upvote 0
Tôi viết một macro sử dụng Solver, khi chạy ở Excel 2010 thì ok, nhưng khi sang đến Excel 2003 thì báo lỗi vì Solver ở 2010 là Solver.xlam còn ở 2003 là Solver.xla. Tôi cũng đã vào
nhưng cách viết thêm Application.Run thực sự không thấy trực quan bằng viết đầy đủ thông số, làm cách nào có thể sử dụng Solver ở bất kỳ Excel nào và chương trình sẽ tự động kiểm tra, chuyển và gọi theo đúng version ấy?? Ai biết xin chỉ giáo giúp với! Thanks
 
Upvote 0
Chả thấy ai trả lời giúp gì cả, thôi thì post một sub gọi Addin Solver.xla cho ai muốn tự động gọi cái Addin này mà không phải thực hiện từng bước bằng tay cho Excel 2003 vậy. Cái này của Jon Peltier.

'Put this in thisworkbook
Option Explicit
Private Sub Workbook_Open()
'References_RemoveMissing1
'FindSolverexcel
'AddSolver
CheckSolver
End Sub

'Put this in a module
Function CheckSolver() As Boolean
'' Adjusted for Application.Run() to avoid Reference problems with Solver
'' Peltier Technical Services, Inc., Copyright © 2007. All rights reserved.
'' Returns True if Solver can be used, False if not.

Dim bSolverInstalled As Boolean

'' Assume true unless otherwise
CheckSolver = True

On Error Resume Next
' check whether Solver is installed
bSolverInstalled = Application.AddIns("Solver Add-In").Installed
Err.Clear

If bSolverInstalled Then
' uninstall temporarily
Application.AddIns("Solver Add-In").Installed = False
' check whether Solver is installed (should be false)
bSolverInstalled = Application.AddIns("Solver Add-In").Installed
End If

If Not bSolverInstalled Then
' (re)install Solver
Application.AddIns("Solver Add-In").Installed = True
' check whether Solver is installed (should be true)
bSolverInstalled = Application.AddIns("Solver Add-In").Installed
End If

If Not bSolverInstalled Then
MsgBox "Solver not found. This workbook will not work.", vbCritical
CheckSolver = False
End If

If CheckSolver Then
' initialize Solver
Application.Run "Solver.xla!Solver.Solver2.Auto_open"
End If

On Error GoTo 0

End Function
 
Upvote 0
Range("hangso") = -0.04 + counter * 0.005
đoạn ma nay sai o đâu vậy mọi người
Sub SOLVER()
SolverOk Setcell:="c35", MaxMinVal:=1
ValueOf "0", ByChange:="$C$31:$V$31"
SolverSolve UseFinish:=True
End Sub
Sub doit()
Range("cacketqua").ClearContents
For counter = 1 To 40
Range("hangso") = -0.04 + counter * 0.005

SOLVER
Application.SendKeys ("{enter}")
Range("cacketqua").Cells(counter, 1) = ActiveSheet.Range("hangso")
Range("cacketqua").Cells(counter, 2) = ActiveSheet.Range("porfolio_sigma")
Range("cacketqua").Cells(counter, 3) = ActiveSheet.Range("porfolio_mean")
Range("cacketqua").Cells(counter, 4) = ActiveSheet.Range("x_1")
Range("cacketqua").Cells(counter, 5) = ActiveSheet.Range("x_2")
Range("cacketqua").Cells(counter, 6) = ActiveSheet.Range("x_3")
Range("cacketqua").Cells(counter, 7) = ActiveSheet.Range("x_4")
Range("cacketqua").Cells(counter, 8) = ActiveSheet.Range("x_5")
Range("cacketqua").Cells(counter, 9) = ActiveSheet.Range("x_6")
Range("cacketqua").Cells(counter, 10) = ActiveSheet.Range("x_7")
Range("cacketqua").Cells(counter, 11) = ActiveSheet.Range("x_8")
Range("cacketqua").Cells(counter, 12) = ActiveSheet.Range("x_9")
Range("cacketqua").Cells(counter, 13) = ActiveSheet.Range("x_10")
Range("cacketqua").Cells(counter, 14) = ActiveSheet.Range("x_11")
Range("cacketqua").Cells(counter, 15) = ActiveSheet.Range("x_12")
Range("cacketqua").Cells(counter, 16) = ActiveSheet.Range("x_13")
Range("cacketqua").Cells(counter, 17) = ActiveSheet.Range("x_14")
Range("cacketqua").Cells(counter, 18) = ActiveSheet.Range("x_15")
Range("cacketqua").Cells(counter, 19) = ActiveSheet.Range("x_16")
Range("cacketqua").Cells(counter, 20) = ActiveSheet.Range("x_17")
Range("cacketqua").Cells(counter, 21) = ActiveSheet.Range("x_18")
Range("cacketqua").Cells(counter, 22) = ActiveSheet.Range("x_19")
Range("cacketqua").Cells(counter, 23) = ActiveSheet.Range("x_20")

Next counter

ActiveSheet.Range ("x_3")

Range("cacketqua").Cells(counter, 7) = ActiveSheet("x_4")
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom