我有一张A:H列的表。我需要将每60个字符的H列拆分成一个新行,并将A:G复制到这些新行中。Excel VBA分割列以一定的长度分成多行
这里的数据是如何,我怎么想它:
在一个完美的世界里,在那也要算每行每则信息的开始列。所以列A1
将1
,A2
会2
,A3
会1
,A4
会2
等
有29453行,我需要做这,人工手动操作,这不是一个真正的选择。
请帮忙吗?
我有一张A:H列的表。我需要将每60个字符的H列拆分成一个新行,并将A:G复制到这些新行中。Excel VBA分割列以一定的长度分成多行
这里的数据是如何,我怎么想它:
在一个完美的世界里,在那也要算每行每则信息的开始列。所以列A1
将1
,A2
会2
,A3
会1
,A4
会2
等
有29453行,我需要做这,人工手动操作,这不是一个真正的选择。
请帮忙吗?
这并不是那么困难。
首先,存储所有的日志记在一个阵列
二,遍历数组中,并为每个环路每个日志笔记,做一做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
注意:这是可能不是最有效的解决方案在那里。肯定有比这更好的解决方案。
感谢您的回复!我应该在我的例子中显示了这一点,但是可能需要将记录拆分为1(小于或等于60个字符的注释)到33(1,980个或更少字符)行之间的任何位置。我将如何实现这一点? – WolfieeifloW
我也不反对将数据显示在新表中,如果这样做会更容易。 – WolfieeifloW
嗨,我更新了解决方案 – Keenlearner
你有没有尝试过任何东西?任何我们可以看到你有问题的代码? – Ibo