当通过VBA将excel数据导出到文本文件时,处理指数数字和格式

将Excel电子表格中的值(使用VBA代码, 而不是通过导出到CSV)导出到文本文件时遇到问题。

使用这些数字:

- (formatted so 0 displays as "-") 0.10000000 0.0166666666666667 If I debug.print the .Text then .Value property of each cell, the results are: - --> 0 0.10000000 --> 0.1 0.01666667 --> 1.66666666666667E-02 

我的问题是,我想避免0.0166666666666667(在电子表格单元格中) – > 1.66666666666667E-02(在单元格的.Value属性中)转换发生。

如果我读取.Text属性,结果会按需要显示为小数,但问题在于,格式为“ – ”的格式为0导出为“ – ”。

有没有一个“适当”的方式来处理这个问题,将在所有情况下工作?
我必须在多个电子表格中使用最终的解决scheme,并且我无法控制每个电子表格中的显示格式设置或每个单元格的内容(即:不保证是数字数据)

示例代码

 Public Function test() Dim cell As Range: Set cell = Worksheets("Sheet1").Range("A1") Dim i As Integer Dim vSingle As Single Dim vVariant As Variant Dim vDouble As Double For i = 0 To 4 vSingle = cell.Offset(i, 0).Value vVariant = cell.Offset(i, 0).Value vDouble = cell.Offset(i, 0).Value Debug.Print cell.Offset(i, 0).Text & " --> " & cell.Offset(i, 0).Value & " : " & vSingle & " : " & vVariant & " : " & vDouble Next End Function 

结果是:

  - --> 0 : 0 : 0 : 0 0.10000000 --> 0.1 : 0.1 : 0.1 : 0.1 0.01666667 --> 1.66666666666667E-02 : 1.666667E-02 : 1.66666666666667E-02 : 1.66666666666667E-02 --> : 0 : : 0 --> : 0 : : 0 

我无法复制你的问题,但也许你可以使用下面的代码来帮助。 基本上,您可以检查它是否是数字,然后将其存储到强typesvariables中,然后导出。 你可以使用这样的东西:

 Dim num As Double Do If (IsNumeric(Selection.Value)) Then num = Selection.Value ' Export num Else ' Export Selection.Value End If Loop Until True 

使用Format函数来表示您的值

从Excel帮助

返回包含根据格式expression式中包含的指令格式化的expression式的Variant(String)。

格式(expression式[,格式[,firstdayofweek [,firstweekofyear]]])

我有一个类似的问题,我正在处理部分目录号码可以是string或数字。 我的VBA代码从Excel源中获取一个值,并将其分配到Excel目标模板中,由将其插入到表中的应用程序处理。 问题是大的“数字”被转换成指数表示法。 但是,Acme Part#847000003 <> Acme Part#8.47E + 08。 我的解决scheme是创build一个函数,testinginput值,将其格式化为一般数字,并将其作为强制string(带有前缀撇号)返回。

 Public Function ConvertExponentialNumber(p_strCatalogueNbr As String) As String Dim varTemp As Variant If IsNumeric(p_strCatalogueNbr) Then varTemp = Format(p_strCatalogueNbr, "General Number") ConvertExponentialNumber = Chr(39) & varTemp Else ConvertExponentialNumber = p_strCatalogueNbr End If End Function