Excel 2010将单元格内容中的科学符号方程转换为十进制表示形式
我有一个电子表格,里面有将近400个方程式。电子表格的创建者从其他来源复制/粘贴值。有几种在其可变系数中使用科学符号。我正在寻找一种将它们转换为十进制表示法的方法,以便将它们存储在数据库中并使用动态sql执行 这是我所拥有的一个例子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将方程列视为
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(用户定义函数)来实现这一点。 我
- 使用正则表达式解析以科学记数法输入的任何数字
- 将它们转换为十进制数
- 将原始值替换为十进制值
选项显式
函数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