2016-07-15 5 views
1

Поскольку мои знания VBA не являются обширными, я обычно записываю нужные мне макросы. Поскольку у меня есть столбцы с датой и временем в одной и той же ячейке, я использовал функцию «Text to Columns» Excel и записал ее, используя код ниже. Однако, когда в любой строке есть пустая ячейка, все ячейки ниже, которые не отформатированы!Код VBA для продолжения форматирования с использованием текста в столбце, когда некоторые ячейки пустые

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

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

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

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 

ответ

0

Изменение,

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

... к,

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

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

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

Например:

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 Enumeration.

+0

Непонятно, почему вы вставляете столбец, обрабатывая [.TextToColumns] (https://msdn.microsoft.com/en-us/library/office/ff193593.aspx) и впоследствии удаляя столбец. Вы можете просто пропустить второй столбец с помощью ** xlSkipColumn ** (см. [XlColumnDataType Enumeration] (https://msdn.microsoft.com/en-us/library/bb241018.aspx)). – Jeeped

+0

Спасибо вам большое! Чтобы ответить на ваш вопрос, я просто удаляю столбцы, которые я вставил вправо, которые я создал, чтобы поместить время после использования команды «Текст в столбец», но мне не нужны времена, поэтому я удаляю эти столбцы! –

+0

Привет! Хотел сообщить вам, что мне удалось найти простой способ сделать это, не зацикливая и не удаляя столбцы! К сожалению, я использую Select! Столбцы («R: T»). Выберите Selection.NumberFormat = "m/d/yyyy" –