转置不同数量的行直到出现不同数量的空白 VBA
Transpose varying number of rows till varying number of blank appears VBA
我有如下数据。由空格分隔的块属于一个信息单元,但空格不一致,有时一行有时两行或更多有时none。
我的目标是实现如下输出:-
我对 VBA 很陌生。到目前为止我所尝试的如下:-
Range("A1:A" & nlr).SpecialCells(xlCellTypeBlanks).Value = "" 'nlr is the last row of data calculated
Range("H2:H" & nlr).Formula = "=COUNTA(A2:G2)" 'Data is from A to G Column
For i = 2 To nlr
If Range("A" & i).Value <> "" And Range("K" & i).Value <= 3 Then
Range("I" & i).Value = Range("A" & i).Value
Range("J" & i).Value = Range("A" & i + 1).Value
Range("K" & i).Value = Range("A" & i + 2).Value
Range("L" & i).Value = Range("A" & i + 3).Value
End If
Next
也参考了以下解决方案,但对我不起作用
非常感谢任何帮助!!
对于无法停止尝试此请求,我感到抱歉,尽管将来不建议寻求现成代码的答案来产生结果,无论如何请找到下面的代码以满足您的需要,如果有帮助,请接受花点时间理解我在代码中写了什么 :)
Sub t()
Dim rawData As Variant, tranData As Variant
Dim copyrange As Range
Dim lastrow As Long, blankRow As Long, nonBlankRow As Long, irow As Long, findNextRow As Long
Dim destiRow As Long, countV As Long, copytimes As Long, detailsrow As Long, repeatTime As Long
Dim addcontact As Long, copyAddContact As Long
lastrow = Sheet1.UsedRange.Rows.Count + 1
blankRow = 0
repeatTime = 1
For irow = 2 To lastrow
repeatTime = 1
destiRow = Sheet2.UsedRange.Rows.Count
If IsEmpty(Sheet1.Range("A" & irow).Value) Then
blankRow = Sheet1.Range("A" & irow).Row - 1
countV = Application.WorksheetFunction.CountA(Sheet1.Range("B" & blankRow - 4, "B" & blankRow))
rawData = Sheet1.Range("A" & blankRow - 4, "A" & blankRow).Value
tranData = Application.Transpose(rawData)
For copytimes = 1 To countV
Set copyrange = Sheet2.Range("A" & destiRow + copytimes, "E" & destiRow + copytimes)
copyrange.Value = tranData
Next
For detailsrow = countV To 1 Step -1
Sheet1.Range("B" & blankRow - (detailsrow - 1), "F" & blankRow - (detailsrow - 1)).Copy _
Sheet2.Range("F" & destiRow + repeatTime, "I" & destiRow + repeatTime)
repeatTime = repeatTime + 1
Next
For findNextRow = blankRow + 1 To lastrow
If Not IsEmpty(Sheet1.Range("A" & findNextRow).Value) Then
irow = findNextRow - 1
addcontact = irow - blankRow
For copyAddContact = 1 To addcontact
Sheet2.Cells(destiRow + countV, 10 + copyAddContact).Value = Sheet1.Range("F" & blankRow + copyAddContact).Value
Next
Exit For
End If
Next
End If
Next
End Sub
Sheet1 中的原始数据(请注意,您不能在最后一行 21 之后添加额外的联系信息,您将很难确定代码是否可以针对实际业务案例进行调整)
这就是您要找的!
这里的Sheet2是指代号sheet(sheet名称可以更改)
我有如下数据。由空格分隔的块属于一个信息单元,但空格不一致,有时一行有时两行或更多有时none。
我的目标是实现如下输出:-
我对 VBA 很陌生。到目前为止我所尝试的如下:-
Range("A1:A" & nlr).SpecialCells(xlCellTypeBlanks).Value = "" 'nlr is the last row of data calculated
Range("H2:H" & nlr).Formula = "=COUNTA(A2:G2)" 'Data is from A to G Column
For i = 2 To nlr
If Range("A" & i).Value <> "" And Range("K" & i).Value <= 3 Then
Range("I" & i).Value = Range("A" & i).Value
Range("J" & i).Value = Range("A" & i + 1).Value
Range("K" & i).Value = Range("A" & i + 2).Value
Range("L" & i).Value = Range("A" & i + 3).Value
End If
Next
也参考了以下解决方案,但对我不起作用
非常感谢任何帮助!!
对于无法停止尝试此请求,我感到抱歉,尽管将来不建议寻求现成代码的答案来产生结果,无论如何请找到下面的代码以满足您的需要,如果有帮助,请接受花点时间理解我在代码中写了什么 :)
Sub t()
Dim rawData As Variant, tranData As Variant
Dim copyrange As Range
Dim lastrow As Long, blankRow As Long, nonBlankRow As Long, irow As Long, findNextRow As Long
Dim destiRow As Long, countV As Long, copytimes As Long, detailsrow As Long, repeatTime As Long
Dim addcontact As Long, copyAddContact As Long
lastrow = Sheet1.UsedRange.Rows.Count + 1
blankRow = 0
repeatTime = 1
For irow = 2 To lastrow
repeatTime = 1
destiRow = Sheet2.UsedRange.Rows.Count
If IsEmpty(Sheet1.Range("A" & irow).Value) Then
blankRow = Sheet1.Range("A" & irow).Row - 1
countV = Application.WorksheetFunction.CountA(Sheet1.Range("B" & blankRow - 4, "B" & blankRow))
rawData = Sheet1.Range("A" & blankRow - 4, "A" & blankRow).Value
tranData = Application.Transpose(rawData)
For copytimes = 1 To countV
Set copyrange = Sheet2.Range("A" & destiRow + copytimes, "E" & destiRow + copytimes)
copyrange.Value = tranData
Next
For detailsrow = countV To 1 Step -1
Sheet1.Range("B" & blankRow - (detailsrow - 1), "F" & blankRow - (detailsrow - 1)).Copy _
Sheet2.Range("F" & destiRow + repeatTime, "I" & destiRow + repeatTime)
repeatTime = repeatTime + 1
Next
For findNextRow = blankRow + 1 To lastrow
If Not IsEmpty(Sheet1.Range("A" & findNextRow).Value) Then
irow = findNextRow - 1
addcontact = irow - blankRow
For copyAddContact = 1 To addcontact
Sheet2.Cells(destiRow + countV, 10 + copyAddContact).Value = Sheet1.Range("F" & blankRow + copyAddContact).Value
Next
Exit For
End If
Next
End If
Next
End Sub
Sheet1 中的原始数据(请注意,您不能在最后一行 21 之后添加额外的联系信息,您将很难确定代码是否可以针对实际业务案例进行调整)
这就是您要找的!
这里的Sheet2是指代号sheet(sheet名称可以更改)