将工作表保存为CSV,Excel公式保持不变

时间:2012-02-29 00:01:12

标签: excel excel-vba csv excel-formula vba

我完全在VBA for Excel中工作。我的解决方案必须完全是程序化的,而不是用户驱动的。解决方案的要求是用户启动单个宏来获取工作簿并将8个页面保存到单独的CSV文件中,保留公式并丢弃公式解析。我有一系列工作表(sht),我迭代并保存它们。以下代码完美地完成了这一点。

For i = LBound(sht) To UBound(sht)
    If (SheetExists(csv(i))) Then
        Sheets(sht(i)).SaveAs _
                fullpath & csv(i) & ".csv", _
                FileFormat:=xlCSV, _
                CreateBackup:=False
    End If
Next i

其中fullpath包含文件保存位置的完整路径,并且我编写了一个布尔函数,用于测试工作簿中是否存在工作表。

问题:

我需要CSV文档包含Excel公式,而不是公式评估的公式。公式的结果可以丢弃。 The Microsoft website说:

  

如果单元格显示公式而不是公式值,则公式将转换为文本。所有格式,图形,对象和其他工作表内容都将丢失。欧元符号将转换为问号。

这意味着SaveAs函数可能永远不会做我想做的事情,但我需要一些方法来创建文件。理想情况下,我希望保持Excel能够完全逃脱CSV单元格的能力。 Java文件将由Java和SQL程序读取,可以根据需要正确解析Excel函数。

3 个答案:

答案 0 :(得分:4)

您需要执行类似的操作才能将公式逐个单元格导出到csv文件,而不是将每个工作表另存为删除公式的CSV

此代码与Generate a flat list of all excel cell formulas

中的答案类似

对于三张工作簿,它将创建名为

的文件
  

C:\ TEMP \ output1.csv
    C:\ TEMP \ output2.csv
    C:\ TEMP \ output3.csv

VBA(添加转义分隔符)

Const sFilePath = "C:\temp\output"
Const strDelim = ","

Sub CreateTxt_Output()
Dim ws As Worksheet
Dim rng1 As Range
Dim X
Dim lRow As Long
Dim lCol As Long
Dim strTmp As String
Dim lFnum As Long
Dim lngCnt As Long
Dim strOut As String

lFnum = FreeFile
For Each ws In ActiveWorkbook.Worksheets
    lngCnt = lngCnt + 1
    Open (sFilePath & lngCnt & ".csv") For Output As lFnum
    'test that sheet has been used
    Set rng1 = ws.UsedRange
    If Not rng1 Is Nothing Then
        'only multi-cell ranges can be written to a 2D array
        If rng1.Cells.Count > 1 Then
            X = ws.UsedRange.Formula
            For lRow = 1 To UBound(X, 1)
                strOut = IIf(InStr(X(lRow, 1), strDelim) > 0, """" & X(lRow, 1) & """", X(lRow, 1))
                For lCol = 2 To UBound(X, 2)
                    'write each line to CSV
                    strOut = strOut & (strDelim & IIf(InStr(X(lRow, lCol), strDelim) > 0, """" & X(lRow, lCol) & """", X(lRow, lCol)))
                Next lCol
                Print #lFnum, strOut
            Next lRow
        Else
            Print #lFnum, IIf(InStr(rng1.Formula, strDelim) > 0, """" & rng1.Formula & """", rng1.Formula)
            End If
    End If
    Close lFnum
Next ws
MsgBox "Done!", vbOKOnly
End Sub

答案 1 :(得分:3)

除了最后一个解决方案,您可以替换filesystemobject和textstream。 点击writing to a text file

上的此链接

答案 2 :(得分:3)

您可以尝试依次激活每张纸,然后添加

ActiveWindow.DisplayFormulas = True

在致电SaveAs之前。