Excel·VBA一键计算每月合计

76 篇文章 24 订阅

《vba吧提问-怎么写每月合计的代码》,对表格中每月合计的行进行计算

Sub 选中列每月合计()
    '适用单/多列选中、单/多列部分选中
    Dim rng As Range, first_row, last_row, first_col, last_col, col_add, sum_j, i
    month_total = Array(1, "本月合计")  '每月合计所在列号
    Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算
    first_row = rng.Row     '选中区域开始行号
    last_row = first_row + rng.Rows.count - 1  '选中区域结束行号
    first_col = rng.Column  '选中区域开始列号
    last_col = first_col + rng.Columns.count - 1  '选中区域结束列号
    col_add = Split(Columns(first_col).Address(0, 0), ":")  '选中区域开始行号字母
    sum_j = first_row
    
    For i = first_row To last_row
        If InStr(Cells(i, CInt(month_total(0))), CStr(month_total(1))) > 0 Then
            Cells(i, first_col).Formula = "=SUM(" & col_add(0) & sum_j & ":" & col_add(0) & i - 1 & ")"
            If last_col > first_col Then  '单列AutoFill报错
                Cells(i, first_col).AutoFill Destination:=Range(Cells(i, first_col), Cells(i, last_col))
            End If
            Range(Cells(i, first_col), Cells(i, last_col)).Value = Range(Cells(i, first_col), Cells(i, last_col)).Value
            Range(Cells(i, first_col), Cells(i, last_col)).Interior.Color = vbYellow  '清除公式,标记颜色
            sum_j = i + 1  '更新值避免重复计算
        End If
    Next
    
End Sub
举例

在这里插入图片描述

自动按月合计

参照《Excel·VBA选中列一键计算小计总计》,对上面的代码改为自动按月合计,无需事先在每个月份后手动添加“本月合计”行,使用更加方便

Sub 选中列自动每月合计()
    '适用单/多列选中、单/多列部分选中;上一个sub的自动按月版
    Dim key_col&, rng As Range, i&, j&, k&
    Dim first_row&, last_row&, first_col&, last_col&, start_row&, end_row&
'--------------------参数填写:key_col都为数字
    key_col = 1    '日期列号,对连续相同月份的进行合计;非日期不统计
    Set rng = Intersect(ActiveSheet.UsedRange, Selection)  'intersect语句避免选择整列造成无用计算
    first_row = rng.row     '选中区域开始行号
    last_row = first_row + rng.Rows.Count - 1  '选中区域结束行号
    first_col = rng.column  '选中区域开始列号
    last_col = first_col + rng.Columns.Count - 1  '选中区域结束列号
    
    With ActiveSheet
        start_row = first_row: end_row = last_row + 1  'end_row+1方便最后一个区域计算
        Do
            If TypeName(.Cells(start_row, key_col).Value) <> "Date" Then
                start_row = start_row + 1
            Else
                month_s = Format(.Cells(start_row, key_col), "yyyy.mm")  '年月
                For j = start_row + 1 To end_row
                    month_t = Format(.Cells(j, key_col), "yyyy.mm")
                    If TypeName(.Cells(j, key_col).Value) <> "Date" Or month_t <> month_s Then  '非日期、非同月
                        .Rows(j).Insert
                        .Cells(j, key_col) = month_s & "合计"
                        For k = first_col To last_col
                            .Cells(j, k).FormulaR1C1 = "=SUM(R[-" & j - start_row & "]C:R[-1]C)"
                        Next
                        '也可清除公式仅保留结果
                        Range(.Cells(j, first_col), .Cells(j, last_col)).Value = Range(.Cells(j, first_col), .Cells(j, last_col)).Value
                        start_row = j + 1: end_row = end_row + 1  '开始、结束行号更新值
                        Exit For  '结束for循环
                    End If
                Next
            End If
        Loop Until start_row >= end_row
    End With
    Debug.Print "按月合计行插入完成"
End Sub
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
遇到一个问题是这样的:有个做采购的同事,他来找到我,让我给他设计一个execl表格,能完成它日常采购东西的流水账,要求是能够自动输入当天日期和时间。 然后我开始分析这个问题,用=now()这个函数能够做到自动获得当前日期和时间,但是问题在于怎么触发它,于是我有想到if语句。然后我制作一张简单的样表,A2设置为输入序号,B2里放日期和时间,当A2输入内容后,B2自动输入当前日期和时间。那么B2列里设置函数=IF(A2="","",NOW()) 开始以为就这么简单,但是发现这个表格如果重新打开后,所以B列都会变为最新的日期,而且当A2被重新编辑后,B2就会变更日期为最新日期,这样完全实现不了采购同事的需求。于是我查阅了资料,找到了Target更新事件和Offset获得焦点,让他们配合起来达到目的,经过不懈的努力,终于让我把代码写成功了,初步达到了采购同事的要求。特此把代码写在下面。供大家参考(以下代码最好配合实际案例的execl表的环境进行阅读,这样事半功倍,execl表,我把它挂载到一个下载链接吧): Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 1 And Target.Column <> 5 Or Target.Count > 1 Then Exit Sub On Error Resume Next With Target If .Column = 1 And .Offset(0, 1).Value = "" Then '判断该单元格是否已经写入时间 .Offset(0, 1) = Now() End If If .Column = 5 Then '计算合计价格 .Offset(0, 1) = .Offset(0, 0) * .Offset(0, -1) End If End With End Sub
Excel VBA中实现批量提取Word表格内容可以通过以下步骤进行: 1.首先,在Excel的工作簿中打开Visual Basic Editor(VBE)。 2.在VBE的工具栏上,选择“插入”→“模块”,在模块中编写VBA代码。 3.在编写代码之前,确保已经添加对Microsoft Word对象库的引用。可以通过在VBE中选择“工具”→“引用”来添加引用。 4.在VBA代码的模块中,使用Word对象变量来打开Word文档。例如,可以使用以下代码打开一个名为"Document1.docx"的Word文档: ``` Dim wdApp As Word.Application Dim wdDoc As Word.Document Set wdApp = New Word.Application Set wdDoc = wdApp.Documents.Open("C:\路径\Document1.docx") wdApp.Visible = True ``` 5.接下来,使用“With”语句和对象变量来引用Word文档中的表格,然后遍历表格中的每个单元格,并将其值复制到Excel工作表中。 ``` With wdDoc For Each tbl In .Tables For Each cell In tbl.Range.Cells '将单元格值复制到Excel工作表中的指定位置 Worksheets("Sheet1").Cells(rowNum, colNum).Value = cell.Range.Text '更新行号和列号 rowNum = rowNum + 1 colNum = colNum + 1 Next cell Next tbl End With ``` 6.在代码结束时,记得关闭Word文档和应用程序对象。 ``` wdDoc.Close wdApp.Quit Set wdDoc = Nothing Set wdApp = Nothing ``` 以上步骤将通过Excel VBA实现一键批量提取Word表格内容。可以根据具体需求进行适当的修改和调整,如指定目标表格的位置、添加错误处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔_51

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值