在Excel中使用VBA创建应计模板

在Excel中使用VBA创建应计模板,vba,excel,Vba,Excel,我正在创建一个自动应计模板。它有以下要求: 数据必须首先按科目排序,然后按业务单元排序。必须为两个组的每个业务单元插入抵销行:具有帐户“101”的行和具有所有其他帐户编号的行 抵销行应反映上述适当的业务单位 如果是针对“101”组,则抵销行的账号应为“750”,如果是针对所有其他账户组,则应为“780” 抵销行的交易类型应始终为“25” 抵销行上的金额应为上述组的负小计,这意味着应将上述行“归零” 我的代码目前按帐户然后按业务单位对数据进行排序。 它正确地插入了业务单元。它还正确地在抵销行上

我正在创建一个自动应计模板。它有以下要求:

  • 数据必须首先按科目排序,然后按业务单元排序。必须为两个组的每个业务单元插入抵销行:具有帐户“101”的行和具有所有其他帐户编号的行
  • 抵销行应反映上述适当的业务单位
  • 如果是针对“101”组,则抵销行的账号应为“750”,如果是针对所有其他账户组,则应为“780”
  • 抵销行的交易类型应始终为“25”
  • 抵销行上的金额应为上述组的负小计,这意味着应将上述行“归零”
我的代码目前按帐户然后按业务单位对数据进行排序。 它正确地插入了业务单元。它还正确地在抵销行上为交易类型插入“25”。它没有做到的是说“如果上面的行是101那么750,或者如果上面的行不等于101那么780。它也没有为上面的组创建负小计

如果您希望看到最终结果,请查看“最终结果”选项卡

我已经把文件寄出去了

Sub应计almacro()
Application.ScreenUpdating=False
Application.DisplayAlerts=False
'清除所有过滤器
使用ActiveSheet
.AutoFilterMode=False
以
“筛选和排序
行(“10:10”)。选择
自动筛选
ActiveWorkbook.Worksheets(“应计模板”).AutoFilter.Sort.SortFields_
清楚的
ActiveWorkbook.Worksheets(“应计模板”).AutoFilter.Sort.SortFields_
添加键:=范围(“B10”),排序:=xlSortOnValues,顺序:=xlAscending_
DataOption:=xlSortNormal
使用ActiveWorkbook.Worksheets(“应计模板”).AutoFilter.Sort
.Header=xlYes
.MatchCase=False
.方向=xlTopToBottom
.SortMethod=xl拼音
.申请
以
ActiveWorkbook.Worksheets(“应计模板”).AutoFilter.Sort.SortFields_
清楚的
ActiveWorkbook.Worksheets(“应计模板”).AutoFilter.Sort.SortFields_
添加键:=范围(“A10”),排序:=xlSortOnValues,顺序:=xlAscending_
DataOption:=xlSortNormal
使用ActiveWorkbook.Worksheets(“应计模板”).AutoFilter.Sort
.Header=xlYes
.MatchCase=False
.方向=xlTopToBottom
.SortMethod=xl拼音
.申请
带范围(“A10”,范围(“A”&行数)。结束(xlUp))
.小计分组依据:=1,函数:=xlSum,总计列表:=数组(1)_
替换:=真,分页符:=假,摘要低于数据:=真
.Offset(2,-1).特殊单元格(xlCellTypeConstants).Offset(,1).ClearContents
.Offset(,-1).entireclumn.Delete
.entireclumn.RemoveSubtotal
以
以
'在中插入空行
Dim Col作为变体
一行一行地长
最后一排一样长
变暗,变长
黯淡的星空如长
Col=“B”
StartRow=10
BlankRows=1
lastRow=单元格(Rows.Count,Col).End(xlUp).Row
使用ActiveSheet
对于R=从最后一行到StartRow+1步骤-1
如果.Cells(R,Col)=“101”和.Cells(R+1,Col)“101”,则
.单元格(R+1,列).EntireRow.Insert Shift:=xlDown
如果结束
下一个R
以
下面是新方法
使用ActiveSheet.Range(“A10:A”和lastRow)
设置myrange=.SpecialCells(xlCellTypeBlanks)
如果不是myrange,那就什么都不是了
myrange.FormulaR1C1=“=R[-1]C”
.Value=.Value
如果结束
以
使用ActiveSheet.Range(“C10:C”和lastRow)
设置myrange=.SpecialCells(xlCellTypeBlanks)
如果不是myrange,那就什么都不是了
myrange.FormulaR1C1=“25”
如果结束
以
Application.ScreenUpdating=True
Application.DisplayAlerts=True
端接头

我不能100%确定我是否理解正确。但在我看来,您正在寻找以下几行代码以完成宏:

Dim lngStartRow As Long
Dim lngEndRow As Long

lngStartRow = 11

For lngEndRow = 11 To Sheet1.Cells(Sheet1.Rows.Count, Col).End(xlUp).Row
    If Trim(Sheet1.Cells(lngEndRow, 4).Formula) = vbNullString Then
        Sheet1.Cells(lngEndRow, 4).Formula = "=-SUM(D" & lngStartRow & ":D" & lngEndRow - 1 & ")"
        lngStartRow = lngEndRow + 1
    End If
Next lngEndRow

基本上,
For…Next
循环遍历行并检查空行(从第一行11开始)。如果有一个空行(在列D中),则所有上述单元格都将用一个
SUM
公式进行汇总。此外,“新的起点“对于下一个
行,SUM
被设置为下一个可用行。重复该过程,直到列D中的所有行都已汇总(最后一个块除外)。如果您还希望包括最后一个块,则必须使用
+1

扩展循环。请发布您迄今为止编写的VBA代码,并包括您尝试编写请求的任务。另外,请指出程序在代码中的什么地方停止/运行出错/或行为不符合预期。谢谢。简言之,我一直在开发VBA,在每个更正行条目中插入负小计金额。我可以用它来小计整个专栏,但我只需要它来小计上面的小组。拉尔夫,你理解对了。我需要总结最后一个街区。用+1展开循环的确切含义是什么?
对于lngEndRow=11到Sheet1.Cells(Sheet1.Rows.Count,Col)。End(xlUp)。Row+1
Ralph,这很有效。此外,我还需要一些代码,上面写着“对于每个摘要块,其中account=101,那么account in offset line=750,否则offset line=780。我在下面创建了这段代码,但它将750插入了每个offset line的account列。
使用ActiveSheet.Range(“B10:B”&lastRow)设置myrange=.SpecialCells(xlCellTypeBlanks)如果不是myrange什么都不是,那么如果myrange.Offset(rowOffset:=-1,columnCoffset:=0)。Value=“101”然后myrange.FormulaR1C1=“750”否则myrange.FormulaR1C1=“780”如果End If End If End If End If End With
使用我提供的解决方案,调整代码以实现您的愿望应该不会有任何问题。如果您(再次)是这样的话遇到一个错误/问题,然后你可以发布一个新的问题,它永远不好提出问题(本质上)由5个或更多的问题组成。总之,我认为这个问题解决了。
Dim lngStartRow As Long
Dim lngEndRow As Long

lngStartRow = 11

For lngEndRow = 11 To Sheet1.Cells(Sheet1.Rows.Count, Col).End(xlUp).Row
    If Trim(Sheet1.Cells(lngEndRow, 4).Formula) = vbNullString Then
        Sheet1.Cells(lngEndRow, 4).Formula = "=-SUM(D" & lngStartRow & ":D" & lngEndRow - 1 & ")"
        lngStartRow = lngEndRow + 1
    End If
Next lngEndRow