VBA代码,用于在某些单元格为空时继续使用“文本到列”格式

VBA代码,用于在某些单元格为空时继续使用“文本到列”格式,vba,excel,text-parsing,Vba,Excel,Text Parsing,由于我的VBA知识不丰富,我通常会记录我需要的宏。由于我在同一单元格中有日期和时间的列,所以我使用了Excel的“文本到列”功能并记录了它,产生了下面的代码。但是,一旦任何行中有一个空白单元格,下面所有未格式化的单元格都将被删除 在我的搜索中,我发现解决方案是基于循环代码来逐个单元格执行操作,但我还没有找到如何使用它来完成所需的操作,而且看起来非常复杂 我问是否有办法忽略空白单元格并继续格式化。 这是文本到列代码,但是有没有代码我可以添加之前或之后忽略空白单元格,仍然保持代码在下面? Colum

由于我的VBA知识不丰富,我通常会记录我需要的宏。由于我在同一单元格中有日期和时间的列,所以我使用了Excel的“文本到列”功能并记录了它,产生了下面的代码。但是,一旦任何行中有一个空白单元格,下面所有未格式化的单元格都将被删除

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

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

这是文本到列代码,但是有没有代码我可以添加之前或之后忽略空白单元格,仍然保持代码在下面?

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
变,

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

Range(Cells(2, "T", Cells(Rows.Count, "T").End(xlUp)).Select
“T”
更改为相应的列

我谦恭地建议你采取行动,避免使用传统的方法和方法来完成你的任务。录制代码是一种很好的开始方式,但如果您计划保留代码以备将来使用,则应准备修改代码以删除“选择”和“选择”。有关摆脱依靠选择和激活来实现目标的更多方法,请参阅

例如:

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
我对日期应用了XLMDY格式。如果您的日期是DMY,请使用xlDMYFormat或检查其他可用格式。

更改

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

Range(Cells(2, "T", Cells(Rows.Count, "T").End(xlUp)).Select
“T”
更改为相应的列

我谦恭地建议你采取行动,避免使用传统的方法和方法来完成你的任务。录制代码是一种很好的开始方式,但如果您计划保留代码以备将来使用,则应准备修改代码以删除“选择”和“选择”。有关摆脱依靠选择和激活来实现目标的更多方法,请参阅

例如:

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

我对日期应用了XLMDY格式。如果您的日期是DMY,请使用xlDMYFormat或使用检查其他可用格式。

不清楚插入列、处理列并随后删除列的原因。您可以使用xlSkipColumn跳过第二列(请参阅)。非常感谢!为了回答您的问题,我只是删除了插入到右侧的列,我创建这些列纯粹是为了在使用Text-To-Column命令后输入时间,但我不需要时间,所以我删除了这些列!你好!想让你知道,我设法找到了一个简单的方法来做它没有循环和删除列!不幸的是,我正在使用选择!列(“R:T”)。再次选择Selection.NumberFormat=“m/d/yyyy”嗨!想让你知道,我设法找到了一个简单的方法来做到这一点,而不循环或删除列!不幸的是,我正在使用选择<代码>列(“R:T”)。选择
Selection.NumberFormat=“m/d/yyyy”
很好,但与将时间剥离到某个日期不同。注意不要使查找不匹配。不清楚插入列、处理列并随后删除列的原因。您可以使用xlSkipColumn跳过第二列(请参阅)。非常感谢!为了回答您的问题,我只是删除了插入到右侧的列,我创建这些列纯粹是为了在使用Text-To-Column命令后输入时间,但我不需要时间,所以我删除了这些列!你好!想让你知道,我设法找到了一个简单的方法来做它没有循环和删除列!不幸的是,我正在使用选择!列(“R:T”)。再次选择Selection.NumberFormat=“m/d/yyyy”嗨!想让你知道,我设法找到了一个简单的方法来做到这一点,而不循环或删除列!不幸的是,我正在使用选择<代码>列(“R:T”)。选择
Selection.NumberFormat=“m/d/yyyy”
很好,但与将时间剥离到某个日期不同。小心不要使查找不匹配。