在Excel中将文本操作为列函数,并使用可变数量的分隔符分隔文本

hgb9j2n6  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(109)

我从一个供应商那里下载数据,识别数据(第一列)在同一列中有一个人的名字和他们的参与者编号,用逗号分隔。
信息不是Excel的通用格式,单元格是文本格式。我以后会把它改过来的。
标识数据列中的逗号数不相同。

  • 有时一行只有参与者编号
  • 有时一行包含姓、名、参与者编号
  • 有时一行有姓名、参与者编号。

参与者编号将始终位于标识栏的最后。如果一个人想匿名,名字就不会在那里或部分在那里。
我试着把它分开:

  • 参与者编号在一列中。
  • 姓氏可以与名字在一起,也可以在自己的列中。

两种方法都可以。
名称会改变,行数也会经常改变,但每次运行这个宏时,可能会改变大约1000行。
数据是这样开始的:

我是用Excel中的记录宏做的。
我在标识列的右侧添加两列,然后使用文本到列的特性来用逗号分隔数据。标识数据被放入三列中,我重命名了这三列。

Sub Add_and_rename_columns()

' Add_and_rename_columns Macro

'
    Columns("B:B").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
      TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
      Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
      :=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True
    Range("A3").Select
    ActiveCell.FormulaR1C1 = "Participant Last Name"
    Range("B3").Select
    ActiveCell.FormulaR1C1 = "Participant First Name"
    Range("C3").Select
    ActiveCell.FormulaR1C1 = "Participant Number"
    
End Sub

之后我得到:

并非所有参与者编号都在同一列中。

mzaanser

mzaanser1#

如果我没理解错的话...
运行潜艇之前的数据是这样的:

运行子程序后(预期结果):

Sub test()
Dim rg As Range: Dim cell As Range
Dim cnt As Integer

With ActiveSheet
Set rg = .Range("A4", .Range("A" & Rows.Count).End(xlUp))
End With

rg(1, 2).Resize(1, 2).EntireColumn.Insert

For Each cell In rg
    cnt = Len(cell.Value) - Len(Replace(cell.Value, ",", ""))
    With cell.Resize(1, 3)
        If cnt = 0 Then .Value = Split(",," & cell.Value, ",")
        If cnt = 1 Then .Value = Split(Replace(cell.Value, ",", ",,"), ",")
        If cnt = 2 Then .Value = Split(cell.Value, ",")
    End With
Next

Range("A3").Value = "Participant Last Name"
Range("B3").Value = "Participant First Name"
Range("C3").Value = "Participant Number"

End Sub

rg变量是列A中从第4行到最后一行的数据范围,然后插入两列,然后循环到rg中的每个单元格。
在循环中,它填充每个循环单元格。resize(1,3)使用逗号分隔单元格值的数组。它首先检查循环单元格值中是否没有逗号,然后在该值前面添加两个逗号,然后将其拆分。如果循环单元格值中有一个逗号,则将其替换为两个逗号,然后将其拆分。如果循环单元格值中有两个逗号,则它只是拆分循环单元格值。

wr98u20j

wr98u20j2#

从列表中插入两个空白列,编辑下面的列范围,然后尝试

Sub separate_values()
    Dim rng As Range
    Dim cell As Range
    Dim arr() As String
    Dim i As Long, lastRow As Long
    
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Set rng = Range("A1:A" & lastRow) ' Range of cells to check
    
    For Each cell In rng
    If cell.Value <> "" Then
        If InStr(1, cell.Value, ",") = 0 Then
            Cells(cell.Row, 3) = cell.Value
            Cells(cell.Row, 1) = ""
        Else
            arr = split(cell.Value, ",") ' Split cell value by comma and add to array
        
            For i = UBound(arr) To 0 Step -1
                 If UBound(arr) = 2 Then
                 Cells(cell.Row, i + 1) = arr(i)
                 Else
                 Cells(cell.Row, i + 2) = arr(i)
                 Cells(cell.Row, 1) = ""
                 End If
            Next i
           End If
           End If
    Next cell
End Sub

相关问题