2

所以基本上我有大量数据都在一个用逗号分隔的单元格中。我有多行这些数据,每个单元格中有不同数量的数据。例如:第一行可能有 3 个逗号分隔的数据,所以它将变成 3 列。但是,第 2 行可能有 10 个逗号分隔的数据,这将变成 10 列。当我记录将文本转换为列的宏时,我得到以下代码:

Sub Macro2()
'
' Macro2 Macro
'

'
    Columns("A:A").Select
    Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=True, Space:=False, Other:=False, FieldInfo _
        :=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
        Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1 _
        ), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array _
        (20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1)) _
        , TrailingMinusNumbers:=True
End Sub

现在,正如我所提到的,每行的数据量不同,并且数据集总是会改变。有没有办法让数组设置为 Array(last column, 1) ?无需手动输入它们以确保捕获整个数据?

4

2 回答 2

2

我们可以使用该Split()函数来解析每条记录。前:

在此处输入图像描述

编码:

Sub Parse()
    Dim i As Long, N As Long, v As String, u As Long
    N = Cells(Rows.Count, 1).End(xlUp).Row
    For i = 1 To N
        v = Cells(i, 1).Value
        If v <> "" Then
            arr = Split(v, ",")
            u = UBound(arr) + 1
            Range(Cells(i, 1), Cells(i, u)).Value = arr
        End If
    Next i
End Sub

之后:

在此处输入图像描述

笔记:

您可以仅使用公式(无 VBA)获得类似的结果。例如,对于A列中的数据,在B1中输入:

=TRIM(MID(SUBSTITUTE($A1,",",REPT(" ",999)),COLUMNS($A:A)*999-998,999))

并横向和向下复制。

编辑#1:

  1. 带有的行Split()获取单个单元格的内容并将其分成一组项目
  2. u计算出数组中有多少项的行
  3. 行将Range()数组存放到行中的一组单元格中。
于 2018-12-23T13:45:43.110 回答
0

TextToColumns 壮举。字段信息

您不必关心此参数及其参数。缺少的其余参数具有默认值。像这样缩短例如:

Sub TextToColumnsFieldInfo()

  Const cColumn As Variant = "A"     ' Source Column Letter/Number
  Const cFirst As Long = 1           ' Source First Row
  Const cTarget As String = "B1"     ' Target Cell

'  ' To suppress the following message:
'  ' "Do you want to replace the contents of the destination cells?"
'  Application.DisplayAlerts = False
'  On Error GoTo ProcedureExit

  Cells(cFirst, cColumn).Resize(Cells(Rows.Count, cColumn) _
      .End(xlUp).Row - cFirst + 1).TextToColumns _
      Destination:=Range(cTarget), Tab:=True, Comma:=True, _
      TrailingMinusNumbers:=True

'ProcedureExit:
'  Application.DisplayAlerts = True

End Sub

评论

  • 此代码正在粘贴到 B 列中。调整 cTarget 的参数以满足您的需要。
  • 首选 Cells 对象,因为您可以将列输入为字母或数字。
  • 使用 Resize 方法,我们调整到所需的范围。
  • A 列中的最后一行数据被计算为不将 TextToColumns 应用于整个列。
  • 如果您不想看到在使用 TextToColumns 时覆盖数据时出现的消息,请取消注释代码中的注释行。
于 2018-12-23T15:24:00.530 回答