簡體   English   中英

將工作表保存為CSV,Excel公式保持不變

[英]Saving worksheets to CSV with Excel Formulas intact

我完全在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公式,而不是公式評估的公式。 公式的結果可以丟棄。 微軟網站說:

如果單元格顯示公式而不是公式值,則公式將轉換為文本。 所有格式,圖形,對象和其他工作表內容都將丟失。 歐元符號將轉換為問號。

這意味着SaveAs函數可能永遠不會做我想要它做的事情,但我需要一些方法來創建文件。 理想情況下,我希望保持Excel能夠完全逃脫CSV單元格的能力。 Java和SQL程序將讀取CSV文件,可以根據需要正確解析Excel函數。

您需要執行類似這樣的操作,以便按單元格將公式導出到csv文件,而不是將每個工作表另存為CSV,從而剝離公式

此代碼類似於我在生成所有excel單元格公式的平面列表中的答案

對於三張工作簿,它將創建名為的文件

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

作為最后一個解決方案的替代方案,您可以替換filesystemobject和textstream。 寫入文本文件時請檢查此鏈接

您可以嘗試依次激活每個工作表,然后添加

ActiveWindow.DisplayFormulas = True

在調用SaveAs之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM