如何用vbNullString移除CSV导出中的0值?VBA代码问题求助
Fix VBA Code to Remove 0 Values When Exporting Excel Table to CSV
我来帮你解决这个导出CSV时移除0值的问题!你的原代码核心问题出在处理时机和逻辑判断上——你试图把整行拼接成字符串后再替换0,但这个判断逻辑(If csvVal = 0)几乎永远不会触发,因为整行是多个值用逗号连接的字符串,不可能等于0;另外VBA的字符串Replace方法也不支持xlWhole参数,这会导致代码报错。
修正后的代码思路:
- 遍历每行的每个单元格值,单独检查是否为0(包括公式返回的数值0)
- 将所有等于0的值替换为空字符串(
vbNullString,这样CSV里对应的位置就是空,不会有空格) - 把处理后的行数据拼接成CSV格式的字符串,再写入文件
修改后的完整代码:
Sub saveTableToCSV2() Dim tbl As ListObject Dim csvFilePath As String Dim fNum As Integer Dim tblArr Dim rowArr Dim i As Integer, j As Integer ' 新增循环变量 Dim cellVal As Variant Set tbl = Worksheets("FDA TOOL").ListObjects("tblFDAinfo") csvFilePath = "F:\Scripting\Import\Wal-Mart\Zac\Audit_Tool2FDA.csv" tblArr = tbl.DataBodyRange.Value fNum = FreeFile() Open csvFilePath For Output As #fNum For i = 1 To UBound(tblArr) rowArr = Application.Index(tblArr, i, 0) ' 遍历当前行的每个单元格,处理0值 For j = 1 To UBound(rowArr) cellVal = rowArr(j, 1) ' 判断是否为数值0,若需要处理文本型"0"可改为If cellVal = 0 Or cellVal = "0" Then If cellVal = 0 Then rowArr(j, 1) = vbNullString End If Next j ' 拼接处理后的行成CSV格式 csvVal = VBA.Join(rowArr, ",") ' 使用变量fNum作为文件号,避免硬编码#1 Print #fNum, csvVal Next i Close #fNum ' 清理资源 Set tbl = Nothing Erase tblArr Erase rowArr End Sub
关键修改点说明:
- 新增内层循环逐个检查每行的单元格,精准定位并替换0值
- 替换为
vbNullString确保CSV对应位置为空,不会产生空格干扰Pascal脚本 - 把硬编码的
Print #1改为Print #fNum,保证和打开的文件句柄一致,避免文件操作错误 - 修正资源清理方式,数组用
Erase而非Set...=Nothing
测试效果:
针对你给出的示例行:
REP,RAD,130,4,CT,RB1,,,200,PCS,ACC,17389,96R--CR,,,0,,,,,0,
处理后会变成:
REP,RAD,130,4,CT,RB1,,,200,PCS,ACC,17389,96R--CR,,,,,,,,,
完全符合你的期望,去掉了所有值为0的单元格,且无多余空格,避免数据偏移问题。
内容的提问来源于stack exchange,提问作者tilsonz
相关产品推荐
相关产品推荐

