Код VBA для продолжения форматирования с использованием текста в столбец, когда некоторые ячейки пусты

Поскольку мои знания VBA невелики, я обычно записываю нужные мне макросы. Поскольку у меня есть столбцы с датой и временем в одной и той же ячейке, я использовал функцию Excel "Текст в столбцы" и записал ее, придумав код, приведенный ниже. Однако, если в любой строке есть пустая ячейка, все ячейки ниже, которые не отформатированы!

В своем поиске я обнаружил, что решение основано на циклическом кодировании для выполнения действия ячейка за ячейкой, но я не нашел, как сделать то, что нужно, используя это, плюс выглядит чрезвычайно сложным!

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

Это код Text to Column, но есть ли код, который я могу добавить до или после, чтобы игнорировать пустые ячейки и при этом сохранить код ниже?

Columns("S:S").Select
Selection.Insert Shift:=xlToRight
Range("R2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.TextToColumns Destination:=Range("R2"), DataType:=xlFixedWidth, _
    FieldInfo:=Array(Array(0, 2), Array(9, 1)), TrailingMinusNumbers:=True
Columns("S:S").Select
Selection.Delete Shift:=xlToLeft

Columns("T:T").Select
Selection.Insert Shift:=xlToRight
Range("S2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.TextToColumns Destination:=Range("S2"), DataType:=xlFixedWidth, _
    FieldInfo:=Array(Array(0, 2), Array(9, 1)), TrailingMinusNumbers:=True
Columns("T:T").Select
Selection.Delete Shift:=xlToLeft

Columns("U:U").Select
Selection.Insert Shift:=xlToRight
Range("T2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.TextToColumns Destination:=Range("T2"), DataType:=xlFixedWidth, _
    FieldInfo:=Array(Array(0, 2), Array(9, 1)), TrailingMinusNumbers:=True
Columns("U:U").Select
Selection.Delete Shift:=xlToLeft

1 ответ

Изменить,

Range(Selection, Selection.End(xlDown)).Select

... чтобы,

Range(Cells(2, "T", Cells(Rows.Count, "T").End(xlUp)).Select

Изменить "T" в соответствующий столбец.

Я скромно предлагаю вам сделать шаг, чтобы избежать использования Range .Select и Range .Activate методы для выполнения ваших задач. Записанный код - это хороший способ начать, но вы должны быть готовы изменить код, чтобы удалить Select и Selection, если вы планируете сохранить код для будущего использования. См. Раздел Как избежать использования макросов Select в Excel VBA, чтобы узнать больше о том, как отказаться от использования выбора и активации для достижения своих целей.

Например:

With Worksheets("Sheet1")
    .Columns("S:S").Insert Shift:=xlToRight
    With .Range(.Cells(2, "R"), .Cells(Rows.Count, "R").End(xlUp))
        .TextToColumns Destination:=.Range("R2"), DataType:=xlFixedWidth, _
                       FieldInfo:=Array(Array(0, 2), Array(9, 1)), _
                       TrailingMinusNumbers:=True
    End With
    .Columns("S:S").Delete Shift:=xlToLeft

    .Columns("T:T").Insert Shift:=xlToRight
    With .Range(.Cells(2, "S"), .Cells(Rows.Count, "S").End(xlUp))
        .TextToColumns Destination:=.Range("S2"), DataType:=xlFixedWidth, _
                       FieldInfo:=Array(Array(0, 2), Array(9, 1)), _
                       TrailingMinusNumbers:=True
    End With
    .Columns("T:T").Delete Shift:=xlToLeft

    .Columns("U:U").Insert Shift:=xlToRight
    With .Range(.Cells(2, "T"), .Cells(Rows.Count, "T").End(xlUp))
        .TextToColumns Destination:=.Range("T2"), DataType:=xlFixedWidth, _
                       FieldInfo:=Array(Array(0, 2), Array(9, 1)), _
                       TrailingMinusNumbers:=True
    End With
    .Columns("U:U").Delete Shift:=xlToLeft
End With

Использование цикла для прохода по столбцам R, S и T (столбцы 18, 19 и 20) еще больше очистит ваш код.

Dim c As Long
With Worksheets("Sheet1")
    For c = 18 To 20
        With .Range(.Cells(2, c), .Cells(.Rows.Count, c).End(xlUp))
            .TextToColumns Destination:=.Cells(1), DataType:=xlFixedWidth, _
                           FieldInfo:=Array(Array(0, xlMDYFormat), Array(10, xlSkipColumn))
        End With
    Next c
End With

Я применил xlMDYFormat к дате. Если ваши даты в формате DMY, используйте xlDMYFormat или проверьте другие доступные форматы с помощью перечисления xlColumnDataType.

Другие вопросы по тегам