当某些单元格为空时,VBA代码继续使用文本格式化为列

时间:2016-07-15 06:23:34

标签: excel vba excel-vba text-parsing

由于我的VBA知识不广泛,我通常会记录我需要的宏。由于我在同一单元格中包含日期和时间的列,因此我使用了Excel的“文本到列”和“#39;文本到列”。功能并记录下来,提供下面的代码。但是,如果任何行中都有一个空白单元格,则下面的所有单元格都不会被格式化!

在我的搜索中,我发现该解决方案基于循环代码以逐个单元格执行操作,但我还没有找到如何使用它执行所需的操作,加上看起来非常复杂!

我问是否有办法忽略空白单元格并继续格式化。

这是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 个答案:

答案 0 :(得分:0)

更改,

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

...到,

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

"T"更改为相应的列。

我谦卑地建议你不要使用Range .SelectRange .Activate方法来完成任务。录制的代码是一种很好的开始方式,但如果您打算保留代码以供将来使用,则应准备好修改代码以删除选择和选择。有关远离依赖选择和激活以实现目标的更多方法,请参阅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检查其他可用格式。