Добавление и сохранение начальных нулей для почтовых индексов в CSV с помощью VBA

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

Мне нужно добавить начальные нули и сохранить его как csv, который будет поддерживать начальные нули.

Columns(15).Select
Selection.NumberFormat = "@"

Dim ThisCell As Range
For Each ThisCell In Selection
    If Len(ThisCell) <= 5 Then
        ThisCell = "'" & Right("00000" & ThisCell, 5)
    Else
        ThisCell = "'" & Right("00000000" & ThisCell, 10)
    End If
Next ThisCell

В настоящее время это не поддерживает начальные нули и приводит к зависанию файла и загрузке нескольких минут до следующего шага в vba.


person CTask    schedule 07.11.2019    source источник
comment
Старайтесь избегать selection, если это возможно. Попробуйте задать диапазон, например for each ThisCell in Sheets("test").range("a1:a10000").   -  person Nathan_Sav    schedule 07.11.2019
comment
Изучите файл CSV с помощью текстового редактора (например, Notepad или Notepad++). Действительно ли в файле CSV отсутствуют начальные нули? Или Excel удаляет их при импорте файла CSV? Если второе, то обязательно укажите столбец импортированного почтового индекса как текстовый (во время процесса импорта, до его записи на лист). И как отформатированы 9-значные почтовые индексы в файле CSV.   -  person Ron Rosenfeld    schedule 07.11.2019


Ответы (1)


В поддержку моего комментария я бы закодировал что-то в этом духе. Я бы также проверил, как говорит Рон, проверил, куда они упали раньше.

Sub TestPadding()

Dim r As Excel.Range
Dim c As Excel.Range

Application.Calculation = xlCalculationManual

Set r = ThisWorkbook.Worksheets("TestData").Range("a1:a10000")

For Each c In r.Cells
    c.value = "'" & PadString(c.Text)
Next c

Application.Calculation = xlCalculationAutomatic

End Sub

Function PadString(strInput As String) As String

Dim b As Boolean
Dim l As Byte

b = Len(strInput) < 5
l = IIf(b, 5, 10)

PadString = Right(String(l, "0") & strInput, l)

End Function
person Nathan_Sav    schedule 07.11.2019