【问题标题】:I need to split an array of data into cells in excel我需要将一组数据拆分为excel中的单元格
【发布时间】:2017-04-01 20:54:53
【问题描述】:

我有一个电子表格,它查询数据源并返回一个包含大约 230 行逗号分隔结果的数组。数据如下所示:

我需要将现在位于一个单元格(B 列)中的所有逗号分隔值拆分为单独的单元格。每行通常有 21 个结果。所以结果应该是这样的:

数据开始的行可能会有所不同,但通常从第 80 行开始。最上面的行用于显示其下方数据的结果。起点可以固定在第 120 行(如果这样可以更轻松地编写脚本),这将为未来的开发留出足够的空间。

我尝试修改了我在这里找到的几个不同的解决方案,但没有一个奏效。非常感谢任何帮助!

【问题讨论】:

  • 将逗号分隔的数据复制到记事本中,并使用查找和替换将所有逗号替换为制表符。将其复制并粘贴回 Excel,它会将值放入单独的单元格中。
  • 只需使用数据>文本到列并用逗号分隔。无需将数据导出到记事本等。如果您希望使用 vba 解决方案循环遍历需要拆分的单元格并使用 Split 函数并将该数组写回您的工作表
  • 0,0 放入空白工作表上的 A1 中,然后遍历 TextToColumns、分隔、逗号、完成。清除 A1 和 B1。将数据从其源粘贴到 A1。它应该正确拆分。

标签: arrays excel split excel-2016 vba


【解决方案1】:

您应该能够使用 Excel 的 Text To Columns 功能做您想做的事情 at this link 解释。您可以一键重写单个行或大块。我特别提请您注意第三个选项卡上的参数,您可以在其中定义数据的目的地,例如您提到的 B120。

【讨论】:

  • 谢谢。我现在已经使用了它,记录了它,并将它合并到一个脚本中。现在发布解决方案。
【解决方案2】:

我没有对此进行全面测试,但也许您可以尝试类似的方法。该过程应遍历行并拆分 B 列中的值。

您需要将Set ws = ActiveWorkbook.Worksheets("Sheet1") 中“Sheet1”的名称更改为您正在使用的工作表的名称。

Public Sub SplitData()

    Dim ws As Worksheet
    Set ws = ActiveWorkbook.Worksheets("Sheet1")

    Dim row As Integer
    For row = 1 To ws.Range("A" & ws.Rows.Count).End(xlUp).row

        Dim split_array() As String
        split_array = Split(ws.Range("B" & row).Value, ",")
        Dim split_str As Variant
        Dim col As Integer
        col = 3
        For Each split_str In split_array
            ws.Cells(row, col).Value = split_str
            col = col + 1
        Next split_str

    Next row

End Sub

我的工作表一开始是这样的。

运行程序后它最终看起来像这样。

【讨论】:

  • 这给了我错误:拆分数组命令中的“类型不匹配”。我已经搞砸了几个小时,并想出了一个使用 excel 中的宏记录器的笨重解决方案。我将发布结果子。它并不优雅,但它正在工作......现在。
  • 这很奇怪,我尝试了几个不同的场景,但似乎无法得到“类型不匹配”错误。如果您可以在评论中准确发布哪一行引发错误以及该给定行的 B 列中的数据是什么。鉴于我可能会弄清楚它为什么会抛出错误。
【解决方案3】:

我会建议一种非常简单的方法。

  • 剪切所有逗号分隔的数据并将其粘贴到 txt 文件中。在您的情况下,它应该从 B 列(第 120 行或其他任何内容)开始
  • 在数据选项卡中,单击“来自文本”并打开您的文本文件
  • 选择以逗号分隔的选项并单击下一步
  • 当您单击完成时,Excel 会询问必须粘贴数据的单元格。提供您想要数据的所需单元格名称。在您的情况下,它可以是 B120。

现在你得到了你想要的。最好备份工作表,以防意外损坏数据

【讨论】:

    【解决方案4】:

    感谢大家的帮助并指出正确的方向。这是我最终使用的:

    Sub Expand_Array_On_New_Sheet
    
    '  First check that new sheet name doesn't already exist, and create sheet
    
       Sheet_name_to_create = Sheet10.Range("B1").Value
       If WorksheetExists2(Sheet10.Range("B1")) Then
          MsgBox "Sheet name already exists"
      Exit Sub
      Else
        Sheets.Add After:=Sheets(1)
        ActiveSheet.Name = Sheet_name_to_create
      End If
    
    '  Copy array data to new sheet
    
        Worksheets("Lookup").Range("A11:B250").Copy
        Range("A101").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False
        Application.CutCopyMode = False
    
    '  Expand Array Data into Columns and do some formatting
    
       Range("B101:B350").Select
       Selection.TextToColumns Destination:=Range("C101"), DataType:=xlDelimited, _
           TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
           Semicolon:=False, Comma:=True, Space:=False, Other:=False, OtherChar _
           :=",", 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)), TrailingMinusNumbers:=True
       Range("C100").Select
       ActiveCell.FormulaR1C1 = "=R[-98]C[-1]-19"
       Range("D100").Select
       ActiveCell.FormulaR1C1 = "=RC[-1]+1"
       Range("D100").Select
       Selection.AutoFill Destination:=Range("D100:V100"), Type:=xlFillDefault
       Range("W100").Select
       ActiveCell.FormulaR1C1 = "Current"
       Range("C100:W100").Select
       With Selection.Interior
           .Pattern = xlSolid
           .PatternColorIndex = xlAutomatic
           .ThemeColor = xlThemeColorDark1
           .TintAndShade = -0.149998474074526
           .PatternTintAndShade = 0
       End With
       Selection.Font.Bold = True
       With Selection.Borders(xlEdgeBottom)
           .LineStyle = xlContinuous
           .ColorIndex = 0
           .TintAndShade = 0
           .Weight = xlMedium
       End With
       Selection.Borders(xlEdgeRight).LineStyle = xlNone
       Selection.Borders(xlInsideVertical).LineStyle = xlNone
       Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
       Range("B1").Select
    End Sub
    

    它似乎运作良好。我遇到的挥之不去的问题是,如果数据集少于 21 个条目(大多数是 21 个,但不是全部),最后一列数据最终会出现在 T 或 V 列或其他地方。我需要最后一个条目始终位于 W 列中,并向后填充。我可能需要将其作为一个单独的问题进行搜索。

    再次感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多