2012-02-29 167 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

相關問題