Excel 2010将单元格内容中的科学符号方程转换为十进制表示形式

Excel 2010将单元格内容中的科学符号方程转换为十进制表示形式,excel,scientific-notation,Excel,Scientific Notation,我有一个电子表格,里面有将近400个方程式。电子表格的创建者从其他来源复制/粘贴值。有几种在其可变系数中使用科学符号。我正在寻找一种将它们转换为十进制表示法的方法,以便将它们存储在数据库中并使用动态sql执行 这是我所拥有的一个例子 y = -6E-05x4 + 0.0272x3 - 1.4546x2 - 17.743x + 8137.3 我希望是这样 y = -0.00006x^4 + 0.0272x^3 - 1.4546x^2 - 17.743x + 8137.3 Excel将方程列视为

我有一个电子表格,里面有将近400个方程式。电子表格的创建者从其他来源复制/粘贴值。有几种在其可变系数中使用科学符号。我正在寻找一种将它们转换为十进制表示法的方法,以便将它们存储在数据库中并使用动态sql执行

这是我所拥有的一个例子

y = -6E-05x4 + 0.0272x3 - 1.4546x2 - 17.743x + 8137.3
我希望是这样

y = -0.00006x^4 + 0.0272x^3 - 1.4546x^2 - 17.743x + 8137.3

Excel将方程列视为“一般”列。我尝试更改列类型,希望Excel能够识别函数并转换系数,但它不会。我试图不必重新编写所有这些方程,手动转换科学符号。我也愿意使用第三方软件将科学符号转换为十进制表示。

您可以使用VBA UDF(用户定义函数)来实现这一点。 我

  • 使用正则表达式解析以科学记数法输入的任何数字
  • 将它们转换为十进制数
  • 将原始值替换为十进制值
大于约10^28的值将保持不变。小于约10^-28的值将转换为零(0)


选项显式
函数ConvertToDecimal(作为字符串)作为字符串
Dim RE作为对象,MC作为对象,M作为对象
'正则表达式模式提取科学数字
Const sPat As String=“[-+]?\d+(\。\d+)?[Ee][+-]\d+”
如弦般纤细,如长
Set RE=CreateObject(“vbscript.regexp”)
带RE
.Global=True
.Pattern=sPat
如果.Test(S)=True,则
设置MC=.Execute(S)
sRepl=S
对于MC中的每M
出错时继续下一步
sRepl=Replace(sRepl,M,Format(CDec(M),“#”,“##0.0”和WorksheetFunction.Rept(“#”),1,1)
选择案例错误编号
案例6'溢流
“什么也不做。sRepl保持不变
案例为0
调试.打印错误号,错误说明
“停止”停止调试
结束选择
错误转到0
下一个M
如果结束
以
ConvertToDecimal=sRepl
端函数

所有方程都是多项式吗?你的方程式中有最大项数吗?多项式是否总是“有序”(x^4,然后x^3,然后x^2…等等)?
y=-0.00006Ex^4+…
E是一个打字错误?你试过什么?我只需要拆分部分,然后使用VBA将每个部分转换为双精度。你可能可以用复杂的公式来做。@TimWilliams是的,那是个打字错误。已经修好了。谢谢你指出。@ImaginaryHuman072889所有的方程都是多项式。到目前为止,它们都是“有序的”,但由于人类正在输入它们,我能问的最好的问题是,他确保它们都是有序的。这是一个很好的开始。我在转换后的字符串中添加了第二遍,这将创建插入式指数表示法。@TychoBrahe不确定您的意思,但我看到您问题中最初显示的转换后的
E
是一个打字错误。我已经编辑了代码以删除它,并且输出与您在原始问题中编辑的示例相匹配。我的意思是您的解决方案将E转换为十进制表示法,但是X的幂运算没有发生。我修改了你的UDF,将X提高到指数(例如,0.012x4变成0.012x^4)@TychoBrahe,这很奇怪。如果求幂运算符是原始运算符,如示例中所示;它保留在结果中。你的真实数据怎么了?真实数据是由一个人从excel复制/粘贴而成的。excel公式使用上标,在复制/粘贴期间未进行传输。添加插入符号只是清理方程以供使用的另一个步骤。看看我原来的帖子,我包括了插入符号,但那一定是从我一直在做的一个翻译中取出来的。
Option Explicit
Function ConvertToDecimal(S As String) As String
    Dim RE As Object, MC As Object, M As Object
    'Regex pattern to extract Scientific numbers
    Const sPat As String = "[-+]?\d+(\.\d+)?[Ee][+-]\d+"
    Dim sRepl As String, I As Long

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .Pattern = sPat
    If .Test(S) = True Then
        Set MC = .Execute(S)
            sRepl = S
            For Each M In MC
                On Error Resume Next
                    sRepl = Replace(sRepl, M, Format(CDec(M), "#,##0.0" & WorksheetFunction.Rept("#", 30)), 1, 1)
                    Select Case Err.Number
                        Case 6 'Overflow
                        'do nothing. sRepl is unchanged
                        Case Is <> 0
                            Debug.Print Err.Number, Err.Description
                            Stop 'stop to debug
                    End Select
                On Error GoTo 0
            Next M
    End If
End With

ConvertToDecimal = sRepl

End Function