VBA写入CSV文件时如何避免数字转为科学计数法
解决Excel导出CSV时避免科学计数法的问题
问题场景
我有一个包含如下数据的Excel工作表:
| A | B | C | D | E |
|---|---|---|---|---|
| Paul | Johnson | New York | 0 | FALSE |
| CoordX | 90 | 0.08348590975457270 |
需要将数据写入CSV文件,使用.SaveAs方法会在第2行生成2个尾随逗号,因此采用以下方案:
- 确定工作表每行的最后一个有数据的列
- 将该行所有单元格内容拼接为字符串
- 将字符串写入文件
相关代码如下:
fileLine = sCat(Range(ws.Cells(rLoop, 1), ws.Cells(rLoop, maxCols + 1)), ",") Print #fileNumber, fileLine
其中sCat函数定义为:
Function sCat(vP As Variant, delim As String) As String ' Concatenate all cells in a range, delimited by delim. Dim v Dim delim2 As String For Each v In vP sCat = sCat & delim2 & v delim2 = delim Next v End Function
现在的问题是:输出的CSV文件中,数字0.08348590975457270被转为8.348590975457270E-2。尝试过用Application.Trim处理范围,但仅部分有效,仍有部分数字会转为科学计数法,表现不稳定,需要在不修改工作表单元格格式的前提下解决这个问题。
解决方案
问题根源在于直接拼接单元格的值(v)时,VBA会自动将长小数或小数字转换为科学计数法格式的字符串。要避免这种情况,应该获取单元格的显示文本而非值,也就是使用Cell.Text属性。
修改sCat函数,遍历范围时直接访问单元格对象的Text属性,而不是默认的Value:
Function sCat(vP As Range, delim As String) As String ' Concatenate all cells in a range, delimited by delim, preserving cell display text. Dim cell As Range Dim delim2 As String For Each cell In vP ' 直接取单元格的显示文本,避免数字自动转为科学计数法 sCat = sCat & delim2 & cell.Text delim2 = delim Next cell End Function
说明
- 将函数参数
vP As Variant改为vP As Range,明确接收范围对象,方便直接访问单元格的Text属性 - 遍历每个
cell对象,使用cell.Text获取单元格当前显示的文本内容,完全保留Excel中看到的格式,不会触发科学计数法转换 - 这种方式不需要修改原工作表的单元格格式,直接读取显示内容拼接即可
内容的提问来源于stack exchange,提问作者BarBaDos
相关产品推荐
相关产品推荐

