Excel VBA将一定长度的分割列分成多行

时间:2017-07-25 19:59:08

标签: excel vba excel-vba

我有一张包含A:H列的表格。我需要将每60个字符的H列拆分成一个新行并将A:G复制到这些新行中。

以下是数据的来源以及我的需求:

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

在完美的世界中,开头会有一列可以计算每条消息的每一行。因此,列A11A22A31A4为{{} 1}}等等。

我需要执行29,453行,因此手动执行此操作并非真正的选择。

请帮忙吗?

1 个答案:

答案 0 :(得分:2)

这并不是那么困难。

首先,将所有日志备注存储在数组中

第二次,遍历数组中的每个日志备注,对于每个循环,执行do while循环以插入新行;将值复制到新行;每隔60个字符拆分字符串。

只要子串的长度超过60,就继续循环。

第三,用于分割H列的单元格;这可以通过使用Mid函数来显示基于characer位置的值。

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

例如。 Mid(subString, 1, 60)

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

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

然后对于后续的do while循环,第二行将从字符位置1到60等显示

  

有关Mid功能的信息:

     

中(字符串,开头,长度)

     

string =完整的原始文本

     

start =角色的起始位置

     

length =字符长度

     

Cell Offset信息:

     

.Cells(rowNo,colNo).Offset(RowOffset,ColumnOffset)

     

RowOffset =例如。 [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

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