首页 文章

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

提问于
浏览
1

我正在使用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).ValueSet MyNumber2 = .. 都给出错误 Object Required .

1 回答

  • 0

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

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

    我很惊讶在Sweeden中使用逗号来表示小数点 .

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

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

    尝试更改语言或数字格式,看看它是否会改变它们在Excel中的显示方式,以便您可以使用求解器 .

    另一个问题是它们可能不会作为数字存储在Excel中,而是作为文本存储 .

    请试验一下 .

    还有一些代码可能无济于事,但可能有用:

    这个VBA函数替换(“Mystringwith,逗号”,“,”,“ . ”)将输出“Mystringwith.commas”

    虽然参数是一个字符串,但您可以将它与数字一起使用,因为它可以工作(它隐式地将数字转换为字符串) .

    此外,以下代码可能会给你一些灵感 .

    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
    

相关问题