2017-07-25 215 views
0

我有一张A:H列的表。我需要将每60个字符的H列拆分成一个新行,并将A:G复制到这些新行中。Excel VBA分割列以一定的长度分成多行

这里的数据是如何,我怎么想它:

Picture of data https://i.stack.imgur.com/bVt25.png

在一个完美的世界里,在那也要算每行每则信息的开始列。所以列A11A22A31A42

有29453行,我需要做这,人工手动操作,这不是一个真正的选择。

请帮忙吗?

+0

你有没有尝试过任何东西?任何我们可以看到你有问题的代码? – Ibo

回答

2

这并不是那么困难。

首先,存储所有的日志记在一个阵列

,遍历数组中,并为每个环路每个日志笔记,做一做while循环中插入新行;将值复制到新行;每60个字符分割一次字符串。

继续循环,只要该串的长度大于60

第三,对于H列的单元格的劈裂;这可以通过使用中间函数来显示基于字符位置的值。

例如,我们将从字符位置1到60显示第一行

例如, Mid(subString, 1, 60)

而对于第二行,我们将显示从字符位置61起

例如。 Mid(subString, 61, Len(subString))

然后用于随后的do-while循环中,第二行将从字符位置显示1〜60等

信息上MID函数:

MID(字符串,开始,长度)

串=完整的原始文本

开始=起始字符

01的位置

长度=字符的长度对细胞

信息偏移:

.Cells(rowNo,colNo)。偏移量(RowOffset,ColumnOffset)

RowOffset = eg。 [1 =单元格下方的1行] [-1 =单元格上方的1行]

ColumnOffset = [1 = 1至COL单元的右] [-1 = 1个COL到单元格的左边]

完整的解决方案

Option Explicit 

'split every 60 characters new row 
Sub SplitEverySixtyChar() 

    Dim ws As Worksheet 
    Dim rowNo As Long 
    Dim lastRowNo As Long 
    Dim arrayLogNote As Variant 
    Dim logNote As Variant 
    Dim subString As String 


    Set ws = ThisWorkbook.Sheets("Sheet1") 

    With ws 

     'Find last row no 
     lastRowNo = (.Cells(.Rows.Count, 1).End(xlUp).Row) 

     'Store all log note in array 
     arrayLogNote = .Range("H2:H" & lastRowNo).Value 

     'Starting row no is 2 
     rowNo = 2 

     For Each logNote In arrayLogNote 

      subString = CStr(logNote) 

      Do While Len(subString) > 60 

       'Insert new row 
       .Cells(rowNo, 1).Offset(1, 0).EntireRow.Insert 

       'Copy the cell from A:G col into new row 
       .Cells(rowNo, 1).Offset(1, 0).Value = .Cells(rowNo, 1).Value 
       .Cells(rowNo, 2).Offset(1, 0).Value = .Cells(rowNo, 2).Value 
       .Cells(rowNo, 3).Offset(1, 0).Value = .Cells(rowNo, 3).Value 
       .Cells(rowNo, 4).Offset(1, 0).Value = .Cells(rowNo, 4).Value 
       .Cells(rowNo, 5).Offset(1, 0).Value = .Cells(rowNo, 5).Value 
       .Cells(rowNo, 6).Offset(1, 0).Value = .Cells(rowNo, 6).Value 
       .Cells(rowNo, 7).Offset(1, 0).Value = .Cells(rowNo, 7).Value 

       'Display text for new row from character position 60 onwards 
       .Cells(rowNo, 8).Offset(1, 0).Value = Mid(subString, 61, Len(subString)) 

       'Display text from character position 1 to 60 
       .Cells(rowNo, 8).Value = Mid(subString, 1, 60) 

       subString = .Cells(rowNo, 8).Offset(1, 0).Value 

       'Increment Row No 
       rowNo = rowNo + 1 

      Loop 
       'Increment Row No 
       rowNo = rowNo + 1 
     Next logNote 

    End With 

End Sub 

注意:这是可能不是最有效的解决方案在那里。肯定有比这更好的解决方案。

+0

感谢您的回复!我应该在我的例子中显示了这一点,但是可能需要将记录拆分为1(小于或等于60个字符的注释)到33(1,980个或更少字符)行之间的任何位置。我将如何实现这一点? – WolfieeifloW

+0

我也不反对将数据显示在新表中,如果这样做会更容易。 – WolfieeifloW

+1

嗨,我更新了解决方案 – Keenlearner