В Excel VBA есть способ скопировать NumberFormat всего листа на новый лист? - PullRequest
0 голосов
/ 31 марта 2020

В Excel есть способ скопировать NumberFormat из входного диапазона с несколькими столбцами в выходной диапазон с таким же количеством столбцов?

Я пробовал несколько вариантов в этом примере кода, но есть либо нет изменений в форматировании выходного диапазона, когда я пытаюсь получить его из нескольких столбцов, либо производительность копирования значений слишком проблематична c.

Sub Import()
    'Demonstration variables
    Dim ws_input As Worksheet: Set ws_input = ThisWorkbook.Sheets(1)
    Dim ws_output As Worksheet: Set ws_output = ThisWorkbook.Sheets(2)
    Dim rowLast As Double, colLast As Double, i As Double

    rowLast = ws_input.Cells(Rows.Count, 1).End(xlUp).Row
    colLast = ws_input.Cells(1, Columns.Count).End(xlToLeft).Column

    'This variant is way too much of a performance hit and Excel can misapply formatting
    'E.g. Cell XFD1048576 is considered used
    ws_input.Cells.Copy Destination:=ws_output.Range("A1")

    'This variant can copy "###" as the value if the input cell widths are too small
    ws_output.Range("A1", Cells(rowLast, colLast).Address).Value = _
        ws_input.Range("A1", Cells(rowLast, colLast).Address).Value

    'This variant copies values correctly but without formatting
    ws_output.Range("A1", Cells(rowLast, colLast).Address).Value2 = _
        ws_input.Range("A1", Cells(rowLast, colLast).Address).Value2
    ws_output.Range("A1", Cells(rowLast, colLast).Address).NumberFormat  = _
        ws_input.Range("A1", Cells(rowLast, colLast).Address).NumberFormat

    'This variant also seemingly does nothing with the NumberFormat
    ws_output.Range("A1", Cells(rowLast, colLast).Address).EntireColumn.NumberFormat  = _
        ws_input.Range("A1", Cells(rowLast, colLast).Address).EntireColumn.NumberFormat

    'This variant also seemingly does nothing with the NumberFormat
    ws_output.Range("A1").CurrentRegion.NumberFormat = _
        ws_input.Range("A1").CurrentRegion.NumberFormat

    'Kludgy solution I've come to
    For i = 1 to colLast
        ws_output.Columns(i).NumberFormat = ws_input.Columns(i).NumberFormat
    Next i
End Sub

Я надеюсь избежать необходимости использовать итератор каждый раз, когда мне нужно применить форматирование чисел, и кажется, что в Excel должен быть более интуитивно понятный способ применения свойства NumberFormat к нескольким диапазонам из нескольких диапазонов. Если бы я хотел использовать только один диапазон в качестве формата, ws_output.Range("A1:Z9999").NumberFormat = ws_input.Range("A1").NumberFormat работает, но, похоже, он выходит из строя при использовании нескольких источников столбцов.

Спасибо за ваше время! Я очень признателен за любую помощь в этом топи c.

1 Ответ

0 голосов
/ 31 марта 2020

Из документов Range.NumberFormat:

Это свойство возвращает Ноль , если все ячейки в указанном диапазоне не имеют одинаковый числовой формат .

Если ваши столбцы имеют разные числовые форматы, то вам придется l oop поверх них, как в вашем последнем подходе, при условии, что вы не хотите использовать буфер обмена.

...