我正在使用Solver进行优化,并且我已经从论坛中读取了Solver需要以句号的形式出现小数"."
Private Sub CommandButton1_Click()
Worksheets("Blad1").Activate
SolverReset
SolverOk SetCell:=B63, MaxMinVal:=1, ByChange:=Range("B45:B62")
SolverAdd CellRef:=B45, Relation:=1, FormulaText:=P24
SolverAdd CellRef:=B45, Relation:=3, FormulaText:=O24
SolverAdd CellRef:=L45, Relation:=1, FormulaText:=L3
SolverAdd CellRef:=L46, Relation:=3, FormulaText:=L4
SolverAdd CellRef:=B63, Relation:=3, FormulaText:=B42
SolverSolve
End Sub
以上就是我的代码(实际上还有很多限制) . 这里所有单元格引用都是包含带分隔符“,”的十进制数的单元格 . 我试图添加类型为“0.00”的自定义格式(如果无法将小数转换为句点并将其转换回答案中的逗号,那么这不是最佳解决方案,而是一个正确的解决方案)但它导致了整数比如3,成为“0.03”,意图是“3.00” .
有没有办法读取带有“,”的十进制数字,将其转换为“ . ”在进行计算时,按顺序提供“,”而不必“全局”地将逗号更改为句点,因为我有许多Excel工作簿,这些工作簿无法按照预期使用“ . ”工作 .
提前致谢
编辑:现在测试了一些,我意识到解算器实际上可以"handle"逗号小数 . 实际上,Solver可以打印由逗号小数组成的解决方案,但是看起来某些函数(例如SolverSolve)基于终点小数 . 我测试了在新工作簿中实现以下内容:
Sub Makro1()
Dim MyNumber1 As Double
Dim MyNumber2 As Double
Set MyNumber1 = Sheets("Blad1").Cell(20, 1).Value
Set MyNumber2 = Sheets("Blad1").Cell(21, 1).Value
Dim i As Integer
Dim rSetCell As Range, rByChange As Range, rPrecision As Range
Range("A1").Resize(1, 4) = Array("Precision", "c", "b", "a")
For i = 1 To 16
Set rPrecision = Range("A1").Offset(i, 0)
Set rSetCell = Range("A1").Offset(i, 1)
Set rByChange = Range("A1").Offset(i, 2).Resize(1, 2)
rSetCell.Formula = "=SQRT(" & rByChange(1).Address & "^2+" & rByChange(2).Address & "^2)"
rPrecision = 10 ^ -i
SolverReset
SolverOk MyNumber1, 3, 5, rByChange.Address
SolverOptions Precision:=rPrecision.Value
SolverAdd rByChange(1).Address, 4
SolverAdd MyNumber1, 1, MyNumber2
SolverSolve True
Next
End Sub
(绝大多数代码都来自Andreas Killer的http://answers.microsoft.com/en-us/office/forum/office_2010-customize/excel-solver-macros-do-not-work-when-using-comma/8b595198-8492-4382-89c4-5fc144f7bc43?page=1,以检查程序是否可以打印逗号小数,这可能) .
添加 SolverAdd MyNumber1, 1, MyNumber2
,其中MyNumber1是单元格A20,其为2,3,MyNumber2是A21,即2,5 . 因此,如果程序实际上可以管理逗号小数,则解决方案将不可行(这些参数永远不会改变,并且总是违反约束) . 检查TypeName在为两个变量添加Dim Double之前,显示A20实际上被识别为String .
尝试实现此解决方案会给出错误 Object Required
,并在代码段 Sub Makro1()
上突出显示 . 为什么赢得了包含公式的't this work? Has anyone a clue how to make this work without needing to change the system language for all Excel workbooks, so I can avoid to adjust every Excel sheet I'?
编辑: Set MyNumber1 = Sheets("Blad1").Cell(20, 1).Value
和 Set MyNumber2 = ..
都给出错误 Object Required
.
1 回答
问题是求解器接受单元格引用而不是单元格值 .
MSDN页面不提供任何更改数字格式的开关或选项 .
我很惊讶在Sweeden中使用逗号来表示小数点 .
如果您在控制面板>语言设置中更改国际设置会发生什么情况(在其他设置中,您必须键入a,不选择组合) . 您可以更改使用的数字格式 .
我改变了我的小数点以使用逗号,这个chnaged如何存储excel并显示它 . (范围属性.value .value2和.text都有逗号而不是句号)
尝试更改语言或数字格式,看看它是否会改变它们在Excel中的显示方式,以便您可以使用求解器 .
另一个问题是它们可能不会作为数字存储在Excel中,而是作为文本存储 .
请试验一下 .
还有一些代码可能无济于事,但可能有用:
这个VBA函数替换(“Mystringwith,逗号”,“,”,“ . ”)将输出“Mystringwith.commas”
虽然参数是一个字符串,但您可以将它与数字一起使用,因为它可以工作(它隐式地将数字转换为字符串) .
此外,以下代码可能会给你一些灵感 .