2012-02-29 510 views
4

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

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单元格。这些CSV文件将被Java和SQL程序读取,这些程序可以根据需要正确解析Excel函数。

+0

你打算如何处理合并的单元格?如果公式包含换行符 - 它们是否应该在导出前被删除?你需要处理数组公式吗? – 2012-02-29 01:35:18

+3

在运行SaveAs – 2012-02-29 01:42:28

+0

@Tim Williams之前,您可以尝试激活每个工作表并添加“ActiveWindow.DisplayFormulas = True”。非常聪明。比我的建议更好。 – brettdj 2012-02-29 11:44:49

回答

2

此链接,您可以尝试轮流激活每个表,然后调用另存为前添加

ActiveWindow.DisplayFormulas = True 

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 
+0

我想我已经在你之前的答案中看到了一种类似的模式,你可以逐行写入一个文件 - 首先准备一个字符串中的全部内容然后立即写入它会不会更快? – assylias 2012-02-29 10:40:08

+1

@assylias否 - 原因是您重复连接到整个内容的日益更长的字符串。在我的测试中,这个代码花费了0.05秒,1000行,5列,整个内容一次工具0.07秒。对于10,000条记录,它是0.2秒v 8秒。对于100,000条记录,它是3秒v Excel锁定。 – brettdj 2012-02-29 11:39:58

+0

非常有用,谢谢。 – assylias 2012-02-29 11:54:47

3

或者到最后的解决方案,你可以代替FileSystemObject的和文本流。 检查writing to a text file

相关问题