如果不包含值

发布于 2025-02-01 04:42:58 字数 1045 浏览 2 评论 0原文

我有一个宏,该宏可以从n = iCount的列开头的一系列列中创建数据。
例如,如果iCount = 4,则列为d,e,f,g。

在所有这些列中,如果单元格不包含“ [at]”,我希望清除单元素的内容。

最佳地,我还希望将所有剩余数据移到左侧,这意味着每行的数据在D列开始,没有差距,但这是次要的重要性。

我宏的前部。

Dim Treffer As Worksheet
Dim iCount As Long
Dim i As Long
Set Treffer = ActiveWorkbook.Worksheets("Treffer")

iCount = InputBox(Prompt:="How many columns should be created?")

For i = 1 To iCount
    Treffer.Columns(5).EntireColumn.Insert
    Treffer.Range("E1").Value = "Anmelder" & (iCount + 1) - i
Next i
    
Treffer.Range("D2:D" & Treffer.Cells(Rows.Count, "D").End(xlUp).Row).TextToColumns , _
  Destination:=Treffer.Range("E2:E" & Treffer.Cells(Rows.Count, "N").End(xlUp).Row), DataType:=xlDelimited, _
  TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
  Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
  :="" & Chr(10) & "", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True

Treffer.Columns(4).EntireColumn.Delete

I have a macro that creates data in a range of columns starting from column D onwards with n=iCount.
e.g. if iCount=4, then the columns are D, E, F, G.

Throughout all these columns I would like to clear cell contents if the cell does not contain a "[AT]".

Optimally, I would also like all the leftover data to be moved to the left, meaning data for each row starts in column D and there are no gaps, but that is of secondary importance.

The prior parts of my macro.

Dim Treffer As Worksheet
Dim iCount As Long
Dim i As Long
Set Treffer = ActiveWorkbook.Worksheets("Treffer")

iCount = InputBox(Prompt:="How many columns should be created?")

For i = 1 To iCount
    Treffer.Columns(5).EntireColumn.Insert
    Treffer.Range("E1").Value = "Anmelder" & (iCount + 1) - i
Next i
    
Treffer.Range("D2:D" & Treffer.Cells(Rows.Count, "D").End(xlUp).Row).TextToColumns , _
  Destination:=Treffer.Range("E2:E" & Treffer.Cells(Rows.Count, "N").End(xlUp).Row), DataType:=xlDelimited, _
  TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
  Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
  :="" & Chr(10) & "", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True

Treffer.Columns(4).EntireColumn.Delete

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

温柔嚣张 2025-02-08 04:42:58

似乎您正在创建更多的工作,继续使用texttocolumns,并且使用split()
尝试这样的事情:

Sub Tester()

    Dim Treffer As Worksheet
    Dim iCount As Long, i As Long, arr, c As Range, os As Long, v
    
    Set Treffer = ActiveWorkbook.Worksheets("Treffer")
    
    iCount = InputBox(Prompt:="How many columns should be created?")
    For i = 1 To iCount
        Treffer.Columns(5).EntireColumn.Insert
        Treffer.Range("E1").Value = "Anmelder" & (iCount + 1) - i
    Next i
    
    For Each c In Treffer.Range("D2:D" & Treffer.Cells(Rows.Count, "D").End(xlUp).Row).Cells
        If Len(c.Value) > 0 Then                   'cell has a value?
            arr = Split(c.Value, vbLf)             'split value on Chr(10)
            os = 1                                 'reset column offset
            For Each v In arr                      'loop over array values
                If InStr(1, v, "[AT]") > 0 Then    'value contains "[AT]" ?
                    c.Offset(0, os).Value = v      'populate in offset column
                    os = os + 1                    'next column to right
                    If os > iCount Then Exit For   'stop if reached column count limit
                End If 'value has [AT]
            Next v
        End If         'any cell value
    Next c
    
    Treffer.Columns(4).EntireColumn.Delete

End Sub

Seems like you are creating more work continuing to use TextToColumns, and would be better off using Split().
Try something like this:

Sub Tester()

    Dim Treffer As Worksheet
    Dim iCount As Long, i As Long, arr, c As Range, os As Long, v
    
    Set Treffer = ActiveWorkbook.Worksheets("Treffer")
    
    iCount = InputBox(Prompt:="How many columns should be created?")
    For i = 1 To iCount
        Treffer.Columns(5).EntireColumn.Insert
        Treffer.Range("E1").Value = "Anmelder" & (iCount + 1) - i
    Next i
    
    For Each c In Treffer.Range("D2:D" & Treffer.Cells(Rows.Count, "D").End(xlUp).Row).Cells
        If Len(c.Value) > 0 Then                   'cell has a value?
            arr = Split(c.Value, vbLf)             'split value on Chr(10)
            os = 1                                 'reset column offset
            For Each v In arr                      'loop over array values
                If InStr(1, v, "[AT]") > 0 Then    'value contains "[AT]" ?
                    c.Offset(0, os).Value = v      'populate in offset column
                    os = os + 1                    'next column to right
                    If os > iCount Then Exit For   'stop if reached column count limit
                End If 'value has [AT]
            Next v
        End If         'any cell value
    Next c
    
    Treffer.Columns(4).EntireColumn.Delete

End Sub
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文