Excel如何组织重复数据

时间:2017-07-27 07:48:02

标签: excel

我有一个大规模的excel(2010)文件,其组织方式如下:

  
      
  • Column1 Column2      
        
    1. 姓John。
    2.   
    3. Doe姓氏
    4.   
    5. 地址smth1
    6.   
    7. ....
    8.   
    9. 名称珍妮特
    10.   
    11. 史密斯姓名
    12.   
    13. 地址smth2
    14.   
    15. ....
    16.   
    17.   
  •   

现在我想将它转换为具有正确标题的普通表,因此看起来像这样:


名字姓氏地址....
John Doe smth1
珍妮特史密斯smth2

PS这是我第一次在这里发帖。大家好!

2 个答案:

答案 0 :(得分:0)

如果您的数据非常具体地包含您提出的数据,则以下内容应该有效。在运行代码之前,您需要:

  1. 指定输出范围
  2. 指定您的数据是否按照您的示例编号
  3. 指定数据的列数
  4. 突出显示输入数据范围
  5. 此代码仅基于我在您的问题中提供的有限信息所做的假设而有效。

    希望这有帮助。

    Sub TextToTable()
    
      Dim Temp As Variant, x As Long, i As Long, j As Long
      Dim MyInputRange As Range
      Dim MyOutputRange As Range
      Dim MyOutput As Variant
      Dim HasNumbering As Boolean
    
      '===============================================================
      'You MUST update the below before running the code
      '===============================================================
    
      'Highlight the range you want to convert before running this macro
      Set MyInputRange = Selection
    
      'Put in the output address (sheet name and range)
      Set MyOutputRange = ThisWorkbook.Worksheets("SheetNameHere").Range("A1")
    
      'Set this to false if the data doesn't have "1." and "2." etc at the start of each row
      HasNumbering = True
    
      'Tell the script how many columns your data has
      Const ColumnCount As Long = 4
      '===============================================================
    
      'The below doesn't require your updating
    
      Temp = MyInputRange.Value    'Temp is used to input the data from sheet
    
      ReDim MyOutput(1 To UBound(Temp, 1), 1 To ColumnCount)
    
      'Scrubs out numbering as required
      If HasNumbering Then
        For x = 1 To UBound(Temp, 1)
          j = InStr(1, Temp(x, 1), ". ")
          Temp(x, 1) = Right(Temp(x, 1), Len(Temp(x, 1)) - (j + 1))
        Next x
      End If
    
      'Sets the table heading
      i = 1
      For x = 1 To ColumnCount
        MyOutput(i, x) = Left(Temp(x, 1), WorksheetFunction.Max(InStr(1, Temp(x, 1), " ") - 1, 0))
      Next x
    
      'Builds the table data
      j = 0: i = 2
      For x = 1 To UBound(Temp, 1)
        j = j + 1
        If j > ColumnCount Then j = 1: i = i + 1
        MyOutput(i, j) = Mid(Temp(x, 1), Len(MyOutput(1, j)) + 2, 9999)
      Next x
    
      'Outputs the data
      MyOutputRange.Resize(i, ColumnCount).Value = MyOutput
    
    End Sub
    

答案 1 :(得分:0)

您可以将以下公式放入新工作表中的单元格A1中,然后将其复制并反复复制,从而将所有数据复制到工作簿中的另一个工作表。

=OFFSET(Sheet1!$A$1,3*(ROW(A1)-1)+COLUMN(A1)-1,1)

我假设你的数据在Sheet1中,它从单元格A1开始。将Sheet1更改为工作表的实际名称,并更改$ A $ 1表示工作表中数据的实际开始($符号很重要)。

我还假设每个人有3个数据。如果还有更多,请将公式中的数字3更改为数据块数。

使用公式后,如果要使更改成为永久更改,请复制新数据并粘贴为值。这将破坏公式,但保留数据完整。