【问题标题】:If cell value in column <> certain text then cell value splits with text to columns如果列 <> 某些文本中的单元格值,则单元格值将与文本一起拆分为列
【发布时间】:2017-09-09 18:44:19
【问题描述】:

我正在尝试确定 H 列中的单元格值(每个文件的行数不同)是“Words”还是“Words2”。不包含“Words”或“Words2”的单元格根据空格分隔符拆分为单独的列,而包含“Words”和“Words2”的单元格没有变化。目前我的代码没有分隔任何单元格。我是使用 Dim 作为 Range 和 InStr 的新手,我不完全确定使用它们是否最有效。我也尝试了多种代码变体,但无济于事。 ARGNAME 是 H 列中的每个单元格(或者至少这是我的目标)。

例如:H1 = "Words" 不变,H2 = "Words I don't care" 拆分成 H2:L2

Sub WordSplit
    Dim lastRow As Long
        lastRow = Range("A" & Rows.Count).End(xlUp).Row
    Dim SrchRng As Range, ARGNAME As Range
        Set SrchRng = Range("H1:H" & lastRow)
        For Each ARGNAME In SrchRng
            If InStr(1, ARGNAME.Value, "Words") Or InStr(1, ARGNAME.Value, "Words2") < 0 _
            Then Columns("H:H").TextToColumns Destination:=Range ("H1"), DataType _
                :=xlDelimited, ConsecutiveDelimiter:=True, Space:=True, _
                FieldInfo:=Array(Array(1, 1)),TrailingMinusNumbers:=True
            End If
        Next ARGNAME
End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    Option Explicit
    
    Public Sub WordSplit1()
        Dim ws As Worksheet
        Set ws = Sheet1
    
        Dim lastRow As Long
        lastRow = ws.Range("H" & Rows.Count).End(xlUp).Row
    
        Dim srchRng As Range, argName As Range
        Set srchRng = ws.Range("H1:H" & lastRow)
    
        For Each argName In srchRng
    
            If InStr(1, argName.Value2, "Words") = 0 And _
               InStr(1, argName.Value2, "Words2") = 0 Then
    
                    argName.TextToColumns Destination:=argName, _
                                          DataType:=xlDelimited, _
                                          ConsecutiveDelimiter:=True, _
                                          Space:=True, _
                                          FieldInfo:=Array(Array(1, 1)), _
                                          TrailingMinusNumbers:=True
            End If
    
        Next
    End Sub
    

    您的初始代码在正确的轨道上,但我更新了以下内容:

    • 在模块顶部使用Option Explicit
    • 使用特定工作表完全限定所有范围(代码名称:Sheet1)
    • 修复了代码缩进,使其更易于阅读
    • InStr 相关的问题:
      • 它只返回正整数 (>= 0)
      • 必须检查所有InStr 表达式的返回值(不仅仅是最后一个)
      • 如果单元格不包含“Words”并且不包含“Words2”
      • 初始如果:
      • If InStr(1, ARGNAME.Value, "Words") Or InStr(1, ARGNAME.Value, "Words2") &lt; 0
      • 变成:
      • If InStr(1, argName.Value, "Words") = 0 And InStr(1, argName.Value, "Words2") = 0
    • 下一期:
      • If 语句被分隔到第二行的无效位置(语法错误)
      • ") < 0 _ Then Columns("H:H")
      • 您的下一行将 H 列中包含多个单词的所有单元格拆分为不包含“Words”或“Words2”的每个单元格

    代码暗示H列之外没有数据

    【讨论】:

    • 啊,我分离了InStr 语句并将它们更新为And 而不是Or 以及我的TextToColumns 上的范围。但是,我确实需要为TextToColumns 维护 H 列的目标范围,因为我需要它从它起源的列而不是它旁边的列开始。是的,我特别确保 H 列与 A 列中的行数匹配,因为文件中的行数在文件中是一致的,而不是从文件到文件。谢谢!
    • 我注意到您的起始列意图并更新了我的答案
    【解决方案2】:

    试试这样的

    Sub WordSplit()
    Dim lastRow As Long
    Dim r As Long
    
    lastRow = Range(Cells(1, 1), Cells(1, 1).End(xlDown)).Count
    
        For r = 1 To lastRow
            If Cells(r, 8) = "Words" Or Cells(r, 8) = "Words2" Then
            Else
                Cells(r, 8).TextToColumns Destination:=Cells(r, 8), 
                DataType:=xlDelimited,TextQualifier:=xlDoubleQuote, 
                ConsecutiveDelimiter:=True
            End If
        Next r
    End Sub
    

    【讨论】:

    • 虽然这可能会满足类似的需求,但它确实完全改变了我的原始代码,而不是概述需要进行更改的地方。如果您插入上述代码来计算行数,那么在整个文件中保持相同行数的最初目的似乎可能会丢失。这适用的列中有空白单元格,不确定这个特定的lastRow 是否包括那些曾经有数据但已被删除的行?分隔符是空格分隔符而不是双引号。感谢您的输入!看到另一种可能性总是很高兴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-14
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多