基于多单元格逻辑插入新行
Insert new Row based on Multiple Cell Logic
我是 VBA 的新手,我已尽我所能进行搜索,但仍然找不到答案。我需要编写一个宏,根据多个条件插入一个新行。行必须成组,不超过 5 行,并由载体分隔。但如果容器重复,则计为 1 行。
当前:
Container Carrier
ABC56 Carrier 1
XOS752 Carrier 1
IOW45 Carrier 1
WOFJ74 Carrier 1
NMC85 Carrier 1
DDJD7 Carrier 1
DFF789 Carrier 1
DFF789 Carrier 1
CSGS Carrier 1
GSW132 Carrier 1
WYWI78 Carrier 1
WTS758 Carrier 1
MNV74 Carrier2
ADS78 Carrier2
CTDS45 Carrier2
CTDS45 Carrier2
LHKGL78 Carrier2
XJSS772 Carrier2
XJSHS7 Carrier2
OIJS7 Carrier2
期望:
ABC56 Carrier 1
XOS752 Carrier 1
IOW45 Carrier 1
WOFJ74 Carrier 1
NMC85 Carrier 1
DDJD7 Carrier 1
DFF789 Carrier 1
DFF789 Carrier 1
CSGS Carrier 1
GSW132 Carrier 1
WYWI78 Carrier 1
WTS758 Carrier 1
MNV74 Carrier2
ADS78 Carrier2
CTDS45 Carrier2
CTDS45 Carrier2
LHKGL78 Carrier2
XJSS772 Carrier2
XJSHS7 Carrier2
OIJS7 Carrier2
你有什么方向我都愿意!我分别有这两个代码。一种按载体分离,一种分离成 5 行增量。然而,它并没有内置所有的逻辑。
5人一组:
Option Explicit
Sub InsertIT()
Dim x As Integer
x = 1 'Start Row
Do
Range("A" & x, "B" & x).Insert
x = x + 6
Loop
End Sub
按承运人分开:
Sub InsertRowAtChangeInValue()
For lRow = Cells(Cells.Rows.Count, "B").End(xlUp).Row To 2 Step -1
If Cells(lRow, "B") <> Cells(lRow - 1, "B") Then Rows(lRow).EntireRow.Insert
Next lRow
End Sub
我复制了您的示例数据,这个宏为我提供了您正在寻找的输出。
我使用了 while
循环而不是 for
循环,因为 VBA 记录了 for
循环开始时的结束值,以及编号插入行时需要处理更改的行数。
我正在使用计数器的概念,该计数器仅在满足条件时才递增,以说明重复的集装箱和承运人行。
我还使用标志设置的概念在检测到运营商更改时采取正确的操作。随着您在写作方面的学习和成长 vba,如果您选择使用标志,请记住根据需要重置它们,就像我在此处所做的那样。
最后,我在最后包含了用户消息,作为对宏功能的快速认知检查。根据用户消息,您可以快速滚动到指示的行并检查宏是否处理了整个 sheet。我发现包含这些消息有助于检查我的工作并帮助我的用户发现错误。
有问题欢迎留言!
Sub RowInsert()
'Designate your data columns
ContainerCol = "A"
CarrierCol = "B"
'Designate where your data starts
FirstDataRow = 2
'Find last row to process
LastRow = Range(ContainerCol & Rows.Count).End(xlUp).Row
'Initialize variable for row counter
RowCount = 0
'Initialize while loop variable
i = FirstDataRow
'Loop while ContainerCol is populated
While Not IsEmpty(Cells(i, ContainerCol))
'Check if container and carrier are repeated from previous row. Increment counter if no repetition
If Cells(i, CarrierCol) <> Cells(i - 1, CarrierCol) Or Cells(i, ContainerCol) <> Cells(i - 1, ContainerCol) Then
RowCount = RowCount + 1
End If
'Check if carrier changes on next row
changeflag = 0 'Variable to indicate if carrier change detected, flag reset
If Cells(i, CarrierCol) <> Cells(i + 1, CarrierCol) Then
changeflag = 1
End If
'Insert row if carrier changing or 5 rows complete
If RowCount >= 5 Or changeflag = 1 Then
Rows(i + 1).EntireRow.Insert
i = i + 1 'Increment so that the loop picks up at the right spot on the next iteration
RowCount = 0 'Reset row counter
End If
'Increment loop counter
i = i + 1
Wend
MsgBox ("Separated rows until blank was found at row " & i - 1 & ".")
End Sub
您可以避免循环利用 helper 列(C 列,在我的以下示例中):
Sub InsertRows()
With Range("A2", Cells(Rows.Count, "A").End(xlUp)).Offset(, 4)
With .Offset(1).Resize(.Rows.Count - 1)
.FormulaR1C1 = "=IF(RC2<>R[-1]C2,1,"""")"
.Value = .Value
.SpecialCells(xlCellTypeConstants).EntireRow.Insert
End With
.FormulaR1C1 = "=IF(RC2="""",0,IF(RC1<>R[-1]C1,IF(R[-1]C=5,1,R[-1]C+1), R[-1]C))"
.Value = .Value
.Replace what:=5, replacement:=""
.Resize(.Rows.Count - 1).SpecialCells(xlCellTypeBlanks).Offset(1).EntireRow.Insert
.ClearContents
End With
End Sub
您可以根据需要更改 helper 列,只需将 .Offset(, 2)
更改为其他 .Offset(, n)
我是 VBA 的新手,我已尽我所能进行搜索,但仍然找不到答案。我需要编写一个宏,根据多个条件插入一个新行。行必须成组,不超过 5 行,并由载体分隔。但如果容器重复,则计为 1 行。
当前:
Container Carrier
ABC56 Carrier 1
XOS752 Carrier 1
IOW45 Carrier 1
WOFJ74 Carrier 1
NMC85 Carrier 1
DDJD7 Carrier 1
DFF789 Carrier 1
DFF789 Carrier 1
CSGS Carrier 1
GSW132 Carrier 1
WYWI78 Carrier 1
WTS758 Carrier 1
MNV74 Carrier2
ADS78 Carrier2
CTDS45 Carrier2
CTDS45 Carrier2
LHKGL78 Carrier2
XJSS772 Carrier2
XJSHS7 Carrier2
OIJS7 Carrier2
期望:
ABC56 Carrier 1
XOS752 Carrier 1
IOW45 Carrier 1
WOFJ74 Carrier 1
NMC85 Carrier 1
DDJD7 Carrier 1
DFF789 Carrier 1
DFF789 Carrier 1
CSGS Carrier 1
GSW132 Carrier 1
WYWI78 Carrier 1
WTS758 Carrier 1
MNV74 Carrier2
ADS78 Carrier2
CTDS45 Carrier2
CTDS45 Carrier2
LHKGL78 Carrier2
XJSS772 Carrier2
XJSHS7 Carrier2
OIJS7 Carrier2
你有什么方向我都愿意!我分别有这两个代码。一种按载体分离,一种分离成 5 行增量。然而,它并没有内置所有的逻辑。
5人一组:
Option Explicit
Sub InsertIT()
Dim x As Integer
x = 1 'Start Row
Do
Range("A" & x, "B" & x).Insert
x = x + 6
Loop
End Sub
按承运人分开:
Sub InsertRowAtChangeInValue()
For lRow = Cells(Cells.Rows.Count, "B").End(xlUp).Row To 2 Step -1
If Cells(lRow, "B") <> Cells(lRow - 1, "B") Then Rows(lRow).EntireRow.Insert
Next lRow
End Sub
我复制了您的示例数据,这个宏为我提供了您正在寻找的输出。
我使用了 while
循环而不是 for
循环,因为 VBA 记录了 for
循环开始时的结束值,以及编号插入行时需要处理更改的行数。
我正在使用计数器的概念,该计数器仅在满足条件时才递增,以说明重复的集装箱和承运人行。
我还使用标志设置的概念在检测到运营商更改时采取正确的操作。随着您在写作方面的学习和成长 vba,如果您选择使用标志,请记住根据需要重置它们,就像我在此处所做的那样。
最后,我在最后包含了用户消息,作为对宏功能的快速认知检查。根据用户消息,您可以快速滚动到指示的行并检查宏是否处理了整个 sheet。我发现包含这些消息有助于检查我的工作并帮助我的用户发现错误。
有问题欢迎留言!
Sub RowInsert()
'Designate your data columns
ContainerCol = "A"
CarrierCol = "B"
'Designate where your data starts
FirstDataRow = 2
'Find last row to process
LastRow = Range(ContainerCol & Rows.Count).End(xlUp).Row
'Initialize variable for row counter
RowCount = 0
'Initialize while loop variable
i = FirstDataRow
'Loop while ContainerCol is populated
While Not IsEmpty(Cells(i, ContainerCol))
'Check if container and carrier are repeated from previous row. Increment counter if no repetition
If Cells(i, CarrierCol) <> Cells(i - 1, CarrierCol) Or Cells(i, ContainerCol) <> Cells(i - 1, ContainerCol) Then
RowCount = RowCount + 1
End If
'Check if carrier changes on next row
changeflag = 0 'Variable to indicate if carrier change detected, flag reset
If Cells(i, CarrierCol) <> Cells(i + 1, CarrierCol) Then
changeflag = 1
End If
'Insert row if carrier changing or 5 rows complete
If RowCount >= 5 Or changeflag = 1 Then
Rows(i + 1).EntireRow.Insert
i = i + 1 'Increment so that the loop picks up at the right spot on the next iteration
RowCount = 0 'Reset row counter
End If
'Increment loop counter
i = i + 1
Wend
MsgBox ("Separated rows until blank was found at row " & i - 1 & ".")
End Sub
您可以避免循环利用 helper 列(C 列,在我的以下示例中):
Sub InsertRows()
With Range("A2", Cells(Rows.Count, "A").End(xlUp)).Offset(, 4)
With .Offset(1).Resize(.Rows.Count - 1)
.FormulaR1C1 = "=IF(RC2<>R[-1]C2,1,"""")"
.Value = .Value
.SpecialCells(xlCellTypeConstants).EntireRow.Insert
End With
.FormulaR1C1 = "=IF(RC2="""",0,IF(RC1<>R[-1]C1,IF(R[-1]C=5,1,R[-1]C+1), R[-1]C))"
.Value = .Value
.Replace what:=5, replacement:=""
.Resize(.Rows.Count - 1).SpecialCells(xlCellTypeBlanks).Offset(1).EntireRow.Insert
.ClearContents
End With
End Sub
您可以根据需要更改 helper 列,只需将 .Offset(, 2)
更改为其他 .Offset(, n)