excel - 有没有办法在包含某些条件的行下方插入一定数量的行?
问题描述
我有一个电子表格,其中包含从第 2 行第 1 列开始的数据,并且有 42 列。我正在尝试编写一个 VBA 代码,它将搜索从第 2 行开始的所有数据行,如果第 32 列中的值大于 575,我需要代码在该行下方插入足够的行,以便无论该值是什么(无论是 600 还是 2,000)都可以分成 575 的增量。例如,如果第 5 行第 32 列的值为 800,我希望代码在第 5 行下方添加一行,并且我希望它自动填充新行第 32 列中 575 的值,并将原始行中的值替换为负 575。此外,在我的数据的第一列中,我有日期。对于创建的每个新行,我希望它比原始行中的日期早一周。这是我的数据的示例:
第 1 列 ...第 32 列.......第 42 列
2019 年 8 月 15 日 // 3873
这是我运行代码后希望它的样子。
第 1 列……第 32 列……第 42 列
2019 年 8 月 15 日 // 423
2019 年 8 月 8 日 // 575
2019 年 8 月 1 日 // 575
2019 年 7 月 25 日 // 575
2019 年 7 月 18 日 // 575
2019 年 7 月 11 日 // 575
2019 年 7 月 4 日 // 575
斜线标记只是用于显示列中的分隔。我希望所有其他列的数据与上面的行保持一致。有没有好的方法来做到这一点?
这是我到目前为止提出的代码。但是,它的问题是我似乎无法弄清楚如何对其进行编程,以便它知道根据数量的大小来添加多少行。截至目前,它只是在第 32 列的值大于 575 的任何行下方添加一行。此外,它只是添加空白行。我的代码中没有任何内容说明要在新创建的行中放入什么值
Sub BlankLine()
Dim Col As Variant
Dim BlankRows As Long
Dim LastRow As Long
Dim R As Long
Dim StartRow As Long
Dim LargeOrder As Integer
Col = "AF"
StartRow = 1
BlankRows = 1
LargeOrder = 575
LastRow = Cells(Rows.Count, Col).End(xlUp).Row
Application.ScreenUpdating = False
With ActiveSheet
For R = LastRow To StartRow + 1 Step -1
If .Cells(R, Col).Value > LargeOrder Then
.Cells(R + 1, Col).EntireRow.Insert Shift:=xlDown
End If
Next R
End With
Application.ScreenUpdating = True
End Sub
正如我之前提到的,我需要添加代码来容纳将原始数量分解为 575 的增量所需的许多行,并在创建的每一行中减去一周。预先感谢您的帮助。
解决方案
有很多方法可以实现目标。一种是代替反向循环,您向下插入余额金额,然后在下一行重新计算,依此类推,直到遇到空白。可以尝试使用临时数据测试的代码
Option Explicit
Sub addLine()
Dim Col As Variant
'Dim BlankRows As Long
'Dim LastRow As Long
Dim R As Long
Dim StartRow As Long
Dim LargeOrder As Integer
Dim Ws As Worksheet
Dim ActNum As Double, Balance As Double
Set Ws = ThisWorkbook.ActiveSheet
Col = "AF"
StartRow = 2
'BlankRows = 1
LargeOrder = 575
R = StartRow
With Ws
ActNum = .Cells(R, Col).Value
Do While ActNum <> 0
If ActNum > LargeOrder Then
.Cells(R + 1, Col).EntireRow.Insert Shift:=xlDown
.Range(.Cells(R, 1), .Cells(R, 42)).Copy Destination:=.Cells(R + 1, 1)
.Cells(R + 1, 1).Value = .Cells(R + 1, 1).Value - 7
'simpler calculation
Balance = IIf(ActNum Mod LargeOrder > 0, Int(ActNum / LargeOrder) * LargeOrder, ActNum - LargeOrder)
'Balance = IIf(ActNum Mod LargeOrder > 0, Int(ActNum / LargeOrder) * LargeOrder, Int(ActNum / LargeOrder) * LargeOrder - LargeOrder)
.Cells(R + 1, Col).Value = Balance
.Cells(R, Col).Value = ActNum - Balance
End If
R = R + 1
ActNum = .Cells(R, Col).Value
Loop
End With
End Sub
编辑:可以尝试以下修改后的代码来满足需求的变化
Option Explicit
Sub addLine2()
Dim Col As Variant
Dim LastRow As Long
Dim R As Long, i As Long
Dim StartRow As Long
Dim RowtoAdd As Long
Dim Ws As Worksheet
Dim ActNum As Double, Balance As Double
Set Ws = ThisWorkbook.ActiveSheet
Col = "AS"
StartRow = 2
LastRow = Ws.Cells(Rows.Count, Col).End(xlUp).Row
R = StartRow
With Ws
Do
RowtoAdd = .Cells(R, Col).Value
LastRow = LastRow + RowtoAdd
For i = 1 To RowtoAdd
.Cells(R + 1, Col).EntireRow.Insert Shift:=xlDown
.Cells(R, 1).EntireRow.Copy Destination:=.Cells(R + 1, 1)
.Cells(R + 1, 1).Value = .Cells(R + 1, 1).Value - 7
.Cells(R + 1, 32).Value = ""
R = R + 1
Next i
R = R + 1
Loop Until R > LastRow
End With
End Sub
推荐阅读
- mongodb - 使用官方 mongodb golang 包调试查询(命令监控)
- python - 减去字符串中的数字
- python - 如何表示类的实例与将其作为输入的类之间的关系?
- javascript - 警告:收到非布尔属性的“假”。如何传递布尔值?
- javascript - 尝试实现css动画以将div背景变形为圆形按钮
- r - 在与一组点正交的线上找到最近的点?
- html - Bootstrap 5 Modal 不工作如何使其顺利工作
- c++ - 基于 lval/rval 的部分模板特化?
- git - 通过“IP”端口 22 和 client_loop 重置连接:发送断开连接:从 bitbucket 克隆 repo 时管道损坏
- python-3.x - 如何将文件存储到硒python中的文件夹中