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

Posted

技术标签:

【中文标题】当某些单元格为空白时,VBA 代码继续使用文本到列进行格式化【英文标题】:VBA code to continue formatting using text to column when some cells are blank 【发布时间】:2016-07-15 06:23:34 【问题描述】:

由于我的 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

【问题讨论】:

【参考方案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。请参阅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 检查其他可用格式。

【讨论】:

目前尚不清楚您为什么要插入列、处理 .TextToColumns 并随后删除该列。您可以使用 xlSkipColumn 跳过第二列(请参阅xlColumnDataType Enumeration)。 非常感谢!为了回答您的问题,我只是删除了插入到右侧的列,这些列是我在使用“文本到列”命令后纯粹为了放入时间而创建的,但我不需要时间,所以我删除了这些列!跨度> 您好!想让您知道,我设法找到了一种简单的方法来做到这一点,而无需循环和删除列!不幸的是,我正在使用 Select! Columns("R:T").Select Selection.NumberFormat = "m/d/yyyy" 您好!想让你知道我设法找到一种简单的方法来做到这一点,而无需循环或删除列!不幸的是,我正在使用 Select! Columns("R:T").SelectSelection.NumberFormat = "m/d/yyyy" 很好,但与将时间剥离到日期不同。请注意不要与查找不匹配。

以上是关于当某些单元格为空白时,VBA 代码继续使用文本到列进行格式化的主要内容,如果未能解决你的问题,请参考以下文章

以单击另一个单元格为条件突出显示单元格

在 VBA 中使用循环复制和粘贴时如何跳过非数字值?

将多个值写入一个单元格 - VBA

vba中如何将单元格内容强制转换为文本类型?

如果 Range 包含任何值,VBA 返回 1 - 不工作

VBA-基于特定单元格隐藏/显示多个对象