Я написал макрос, который принимает входной файл CSV, обновляет некоторые поля с жестко заданными настройками, а затем снова сохраняет файл как CSV.
Код для всего этого работает. Однако выходной файл должен иметь кавычки, окружающие все поля, чтобы наш собственный графический интерфейс правильно читал его.
например строка, содержащая: TestStrips1, 1, 0,8, 0, -0,2
необходимо отформатировать как: «TestStrips1», «1», «0,8», «0», «-0,2»
Вот часть моего кода, которая связана с этим. Использование жестко заданных номеров строк/столбцов, потому что они не изменятся. cellHold и newCell являются DIMd, как варианты выше, и я использую их как способ заставить конкатенацию работать так, как задумано:
For i = 1 To 5
For j = 1 To 40
cellHold = NewBook.Sheets(1).Cells(j, i).Value
'NewBook.Sheets(1).Cells(j, i).NumberFormat = "@"
newCell = Chr(34) & cellHold & Chr(34)
NewBook.Sheets(1).Cells(j, i) = newCell
Next j
Next i
If Dir(fPath & "OffsetCoordinates_orig.csv") <> "" Then Kill (fPath & "OffsetCoordinates_orig.csv")
wbOrig.SaveAs Filename:=fPath & "OffsetCoordinates_orig.csv", FileFormat:=xlCSV
wbOrig.Close
If Dir(fPath & "OffsetCoordinates.csv") <> "" Then Kill (fPath & "OffsetCoordinates.csv")
NewBook.SaveAs Filename:=fPath & "OffsetCoordinates.csv", FileFormat:=xlCSV
NewBook.Close
MsgBox ("Your Offset file has been updated successfully. Please see " & fPath & " for your new file.")
Я пробовал это с установкой числового формата в строку и без нее, и, похоже, это не влияет на вывод. Как ни странно, этот код выдает результат, который на самом деле выглядит правильно при просмотре в Excel (кавычки вокруг каждой ячейки), но при просмотре с помощью notepad++ на самом деле вокруг каждого элемента есть ТРОЙНЫЕ кавычки, например:
"""TestStrips1""","""1""","""-1,2""","""0,6""","""0,4"""
Когда я смотрю на родительский файл, который я пытаюсь эмулировать, при просмотре в Excel в ячейке нет кавычек, но в блокноте ++ вывод соответствует назначению с кавычками вокруг каждого элемента.
Мне неясно, является ли это проблемой форматирования или Excel добавляет дополнительные символы кавычек.
В основном решено с помощью следующего кода, на который указал Тим, другие ответы тоже выглядели полезными, но это было сделано первым.
For i = 1 To 5
For j = 1 To 40
cellHold = NewBook.Sheets(1).Cells(j, i).Value
NewBook.Sheets(1).Cells(j, i).NumberFormat = "@" 'not necessary?
newCell = cellHold
NewBook.Sheets(1).Cells(j, i) = newCell
Debug.Print (NewBook.Sheets(1).Cells(j, i).Value)
Next j
Next i
If Dir(fpath & "OffsetCoordinates_orig.csv") <> "" Then Kill (fpath & "OffsetCoordinates_orig.csv")
wbOrig.SaveAs Filename:=fpath & "OffsetCoordinates_orig.csv", FileFormat:=xlCSV
wbOrig.Close
If Dir(fpath & "OffsetCoordinates.csv") <> "" Then Kill (fpath & "OffsetCoordinates.csv")
' NewBook.SaveAs Filename:=fPath & "OffsetCoordinates.csv", FileFormat:=xlCSV
Application.ActiveSheet.Range("A1:E40").Select
Call QuoteCommaExport(fpath)
Application.DisplayAlerts = False
NewBook.Close
Application.DisplayAlerts = True
MsgBox ("Your Offset file has been updated successfully. Please see " & fpath & " for your new file.")
End Sub
Sub QuoteCommaExport(fpath)
'Comments from Microsoft's solution
' Dimension all variables.
Dim DestFile As String
Dim FileNum As Integer
Dim ColumnCount As Integer
Dim RowCount As Integer
' Prompt user for destination file name.
DestFile = fpath & "OffsetCoordinates.csv"
' Obtain next free file handle number.
FileNum = FreeFile()
' Turn error checking off.
On Error Resume Next
' Attempt to open destination file for output.
Open DestFile For Output As #FileNum
' If an error occurs report it and end.
If Err <> 0 Then
MsgBox "Cannot open filename " & DestFile
End
End If
' Turn error checking on.
On Error GoTo 0
' Loop for each row in selection.
For RowCount = 1 To 40
' Loop for each column in selection.
For ColumnCount = 1 To 5
' Write current cell's text to file with quotation marks.
Print #FileNum, """" & Selection.Cells(RowCount, _
ColumnCount).Text & """";
' Check if cell is in last column.
If ColumnCount = Selection.Columns.Count Then
' If so, then write a blank line.
Print #FileNum,
Else
' Otherwise, write a comma.
Print #FileNum, ",";
End If
' Start next iteration of ColumnCount loop.
Next ColumnCount
' Start next iteration of RowCount loop.
Next RowCount
' Close destination file.
Close #FileNum
End Sub
Предоставленный Microsoft код (увиденный в подразделе QuoteCommaExport) работает в основном так, как предполагалось, за исключением того, что у меня было очень странное поведение, когда дата неправильно копировалась в выходной файл 'csv'. Вместо того, чтобы отображаться как в исходном файле, эта ячейка копировалась как «#######». Я понял, что когда я просматривал код, я иногда вручную изменял размер столбца с датой, чтобы он соответствовал точкам останова (чтобы убедиться, что в ячейке была правильная дата, а не просто набор символов #). Всякий раз, когда я это делал, он правильно копировал содержимое. Таким образом, код копирует отображаемые символы, а не содержимое ячейки. Изменение размера столбцов перед вызовом Sub исправило поведение.
"foo"
. Что происходит, когда выDebug.Print ActiveCell.Value
, гдеActiveCell
— это правильно отформатированная ячейка? - person jclasley   schedule 02.01.2020Close #FileNum
закроет файл. Неудивительно, что Excel по умолчанию сохраняет CSV-файлы без кавычек, если только они не требуются (например, когда значения содержат запятые) — спецификация (хотя она и может быть немного расплывчатой) не требует, чтобы все значения были заключены в кавычки. - person Tim Williams   schedule 03.01.2020