我完全在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函数。
答案 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之前。