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

时间:2012-04-11 18:08:53

标签: excel excel-vba vba

将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将导出为“ - ”。

是否有一种“正确”的方式可以解决这个问题?所有场景? 我必须在多个电子表格中使用最终解决方案,并且我无法控制每个电子表格中的显示格式设置或每个单元格的内容(即:不保证是数字数据)

示例代码

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

3 个答案:

答案 0 :(得分:0)

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

Dim num As Double

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

答案 1 :(得分:0)

使用Format函数表示您的值

来自Excel帮助

  
    
      

返回Variant(String),其中包含根据格式表达式中包含的指令格式化的表达式。

             

格式(表达式[,格式[,firstdayofweek [,firstweekofyear]]])

    
  

答案 2 :(得分:0)

我遇到类似的问题,因为我处理的是零件目录号,可以是字符串或数字。我的VBA代码从Excel源获取值并将其分配到Excel目标模板,由应用程序处理,该应用程序将其插入表中。问题是大数字"转换为指数表示法。但是,Acme Part#847000003<> Acme Part#8.47E + 08。我的解决方案是创建一个测试输入值的函数,将其格式化为一般数字并将其作为强制字符串返回(带有前缀撇号)。

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