У меня есть файл CSV, заполненный в основном текстом, и когда я открываю его в Excel, некоторые ячейки интерпретируются как формулы и содержат значение #NAME?.

Это происходит из-за того, что эти ячейки начинаются со знака «-», за которым следует буква. Эти ячейки фактически содержат перечисление в нескольких строках.

Чтобы воспроизвести эту проблему, вы можете просто ввести в ячейку следующее: сохраните его как файл CSV; закрой его; и снова откройте его.

'-а

Здесь важен апостроф, поскольку он указывает Excel обрабатывать содержимое ячейки как строку, а не формулу. Однако при повторном открытии CSV этот апостроф исчезнет и будет заменен знаком равенства, поэтому мы получим ошибку #NAME?.

Итак, я подумал о реализации макроса, который будет перебирать ячейки в CSV-файле сразу после его открытия, чтобы исправить эту проблему, удалив знак равенства, добавляемый Excel:

Sub PostCsvOpenConvertToString()
'PURPOSE: Convert all #NAME (caused by formula automatic conversion back) to a string.
'INSTRUCTION: Run right after opening the CSV file.

    Dim CsvFile As Workbook
    Set CsvFile = ActiveWorkbook

    Dim ws As Worksheet
    Set ws = CsvFile.Sheets(1)

    Dim CellsValue() As Variant
    CellsValue = ws.UsedRange.Value2

    Dim i As Long, j As Long
    For i = 1 To UBound(CellsValue, 1)
        For j = 1 To UBound(CellsValue, 2)

            If CVErr(CellsValue(i, j)) = CVErr(xlErrName) Then
                Dim CellFormula As String
                CellFormula = ws.UsedRange.Cells(i, j).Formula
                If Left$(CellFormula, 1) = "=" Then
                    ws.UsedRange.Cells(i, j).Formula = Right$(CellFormula, Len(CellFormula) - 1)
                End If
            End If

        Next j
    Next i

End Sub

Этот подход работает, но я хотел бы знать, есть ли более простой подход. Есть ли способ сохранить файл, чтобы Excel не преобразовал его в формулу при повторном открытии?

Или, возможно, есть способ открыть CSV, чтобы Excel не преобразовывал ячейки в формулу?

Я знаю, что могу перейти в Данные> Получить и преобразовать данные> Из текста / CSV . Единственное, что он создает таблицу (чего я не хочу), и я не привык писать эти запросы в VBA. Так что, если я могу этого избежать, я бы предпочел, но если это единственное решение, я его рассмотрю.

Примечание: хорошо знать, что это поведение одинаково для всех других букв в алфавите, кроме C и R, которые, вероятно, имеют какое-то отношение к ссылкам в стиле R1C1.

1
DecimalTurn 25 Ноя 2019 в 03:16
2
У вас плохо отформатированный файл CSV. Все, что является текстом, должно заключаться в двойные кавычки. Если возможно, постарайтесь исправить CSV.
 – 
DeanOC
25 Ноя 2019 в 03:37
- Да, это один из способов сделать это. Мне все равно придется удалить двойные кавычки после этого, поскольку они не исчезают при открытии файла CSV в обычном режиме, но это действительный ответ (не стесняйтесь публиковать его).
 – 
DecimalTurn
25 Ноя 2019 в 03:45
1
Если вам не нужна таблица, воспользуйтесь мастером импорта старых версий.
 – 
Ron Rosenfeld
25 Ноя 2019 в 04:23
- Приятно знать, что это существует, спасибо! Однако я все еще получаю # ИМЯ? ошибка при использовании Мастер импорта старых версий.
 – 
DecimalTurn
25 Ноя 2019 в 05:05
1
Вы выбрали Text в качестве типа столбца? Я не получаю эту ошибку.
 – 
Ron Rosenfeld
25 Ноя 2019 в 05:08

1 ответ

Лучший ответ

Еще раз спасибо Рону Розенфельду за этот ответ в комментариях. Я просто воспроизведу его здесь с некоторыми деталями, чтобы отметить этот вопрос как ответ.


Чтобы избежать вставки таблицы при импорте CSV из раздела Data > Get Data, можно использовать Мастер импорта текста, который можно добавить к доступным параметрам.

enter image description here

Затем убедитесь, что на шаге 3 указано, что данные являются текстовыми:

enter image description here

1
DecimalTurn 28 Авг 2020 в 21:46