Сохранение рабочих таблиц в CSV с сохранением формул Excel - PullRequest
5 голосов
/ 29 февраля 2012

Я полностью работаю в VBA для Excel. Мое решение должно быть полностью программным, а не управляемым пользователем. Требование к решению заключается в том, что пользователь инициирует один макрос, чтобы взять рабочую книгу и сохранить 8 листов в отдельные файлы 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

Где полный путь содержит полный путь к месту сохранения файла, и я написал логическую функцию, которая проверяет, существует ли лист в книге.

Проблема:

Мне нужно, чтобы документы CSV содержали формулы Excel, а не то, к чему они относятся. Результаты формул могут быть отброшены. На сайте Microsoft написано:

Если в ячейках отображаются формулы вместо значений формул, формулы преобразуются в текст. Все форматирование, графика, объекты и другое содержимое листа будут потеряны. Символ евро будет преобразован в знак вопроса.

Это означает, что функция SaveAs, вероятно, никогда не будет делать то, что я хочу, но мне нужен какой-то способ создания файла. В идеале я хотел бы сохранить способность Excel избегать ячеек CSV в такте. Файлы CSV будут считываться программами на Java и SQL, которые могут при необходимости правильно анализировать функции Excel.

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012

Вам нужно было бы сделать что-то подобное, чтобы экспортировать формулу в ячейку файла 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
3 голосов
/ 29 февраля 2012

Вы можете попробовать активировать каждый лист по очереди, затем добавить

ActiveWindow.DisplayFormulas = True

перед вызовом SaveAs.

3 голосов
/ 29 февраля 2012

В качестве альтернативы последнему решению вы можете заменить объект файловой системы и текстовый поток. Проверьте эту ссылку на запись в текстовый файл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...