Excel VBA:将小数读作“”,并在计算时将其转换为“。”

我正在使用Solver进行优化,现在有一些小数点的问题。 使用瑞典Excel,我的默认小数点是一个逗号“,”,但我从论坛阅读, 求解器需要有一个周期符号forms的小数“。”

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”types的自定义格式(如果不能将小数转换为句点并在答案中将其转换回逗号,那么这不是最佳的解决scheme,而是一个好的解决scheme),但是它导致了整数,比如说3,变成“0.03”,意思就是“3.00”。

有没有办法读取一个十进制数字“,”将其转换为“。” 同时做计算,并随后提供答案与“,”而不必“全球”更改从逗号到句点的小数,因为我有许多Excel工作簿将无法按预期使用“。”。

提前致谢

编辑:现在testing了一些,我意识到,求解器实际上可以 “处理”逗号小数。 实际上,求解器可以打印由逗号小数组成的解决scheme,但似乎有些函数(例如SolverSolve)是基于终点小数。 我testing了在新的工作簿中实现以下内容:

 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 

(绝大多数代码来自http://answers.microsoft.com/en-us/office/forum/office_2010-customize/excel-solver-macros-do-not-work-when-using上的 Andreas Killer -comma / 8b595198-8492-4382-89c4-5fc144f7bc43?page = 1为了检查程序是否可以打印逗号小数,这可以)。

添加SolverAdd MyNumber1, 1, MyNumber2其中MyNumber1是单元格A20,这是2,3和MyNumber2是A21是2,5。 因此,如果程序实际上可以pipe理逗号小数(这些参数从不改变,并且总是违反约束),则解决scheme将不可行。 检查TypeName在为这两个variables添加Dim Double之前,显示A20实际上被识别为一个String。

试图实现这个解决scheme给了我错误的Object Required和代码段Sub Makro1()一个亮点。 为什么这不工作? 有没有人有一个线索如何使这个工作,而不需要改变所有的Excel工作簿的系统语言,所以我可以避免调整我曾经创build的每个Excel表包含公式?

编辑: Set MyNumber1 = Sheets("Blad1").Cell(20, 1).Value Set MyNumber2 = .. Set MyNumber1 = Sheets("Blad1").Cell(20, 1).ValueSet MyNumber2 = ..都给出错误Object Required

问题是求解器接受单元格引用而不是单元格值。

MSDN页面不提供任何开关或选项来更改数字的格式。

我很惊讶瑞典人在小数点使用逗号。

如果在控制面板>语言设置中更改国际设置,则会发生什么情况(在其他设置中,您必须键入一个,而不是select组合)。 您可以更改使用的数字格式。

我改变我的小数点使用逗号,这chnaged如何Excel存储和显示它。 (范围属性.value .value2和.text都有逗号而不是句号)

尝试改变语言或数字格式,看看这是否改变了他们如何显示在Excel中,所以你可以使用求解器。

另外一个问题是,它们可能不是以Excel中的数字forms存储,而是以文本forms存储。

请试验。

另外这里有一些代码可能不会帮助,但可能是有用的:

这个VBA函数replace(“Mystringwith,逗号”,“,”,“。”)会输出“Mystringwith.commas”

虽然参数是一个string,你可以使用它的数字,因为它会工作(它隐式转换为string的数字)。

另外,下面的代码可能会给你一些启发。

 Sub aaa() Dim c As Range Set c = Worksheets("Sheet1").Range("B14") c.Value = 1198.3 c.NumberFormat = "$#,##0_);($#,##0)" Debug.Print c.Value ' 1198.3 Debug.Print c.Value2 ' 1198.3 Debug.Print c.Text ' £1,198.3 End Sub