Vba Excel VBS在同一工作表上依次复制此1

Vba Excel VBS在同一工作表上依次复制此1,vba,excel,Vba,Excel,我有一本工作手册,我需要为它创建一个按钮点击,它将每个月运行一次。我需要它以设定的顺序在同一张纸上执行多个程序 到目前为止,这是我的代码,做所有的功能。我需要一些帮助,以正确的方式对它进行排序,以便它按照列表运行,如果你知道一种更简单的编码方式,可能会进行整理 将单元格L3的值增加1 在单元格C7和L7中的日期加上1个月 复制单元格N40并将值粘贴到N42中 复制单元格G36并将值粘贴到G37中 复制单元格G49并将值粘贴到G50中 复制范围N12:N27并将值粘贴到J12:J27中 另存为“付

我有一本工作手册,我需要为它创建一个按钮点击,它将每个月运行一次。我需要它以设定的顺序在同一张纸上执行多个程序

到目前为止,这是我的代码,做所有的功能。我需要一些帮助,以正确的方式对它进行排序,以便它按照列表运行,如果你知道一种更简单的编码方式,可能会进行整理

  • 将单元格L3的值增加1
  • 在单元格C7和L7中的日期加上1个月
  • 复制单元格N40并将值粘贴到N42中
  • 复制单元格G36并将值粘贴到G37中
  • 复制单元格G49并将值粘贴到G50中
  • 复制范围N12:N27并将值粘贴到J12:J27中
  • 另存为“付款
    L3
    L7
    .xlsm”
  • 这是我到目前为止的代码

        Private Sub CommandButton3_Click()
             Dim mPay As Range
             Dim mTarget As Range
             Dim cisCurrent As Range
             Dim cisTarget As Range
             Dim taxCurrent As Range
             Dim taxTarget As Range
             Dim ttdCurrent As Range
             Dim ttdTarget As Range
             Dim TTD As String
        'Define the ranges
             Set ttdCurrent = ws.Range("N40")
              Set ttdTarget = ws.Range("N42")
             Set mPay = ws.Range("N12:N27")
              Set mTarget = ws.Range("J12:J27")
             Set cisCurrent = ws.Range("G36")
              Set cisTarget = ws.Range("G37")
             Set taxCurrent = ws.Range("G49")
              Set taxTarget = ws.Range("G50")
        'copy and paste special-add
             ttdCurrent.Copy
              ttdTarget.PasteSpecial xlValues
             ttdCurrent.Copy
              ttdTarget.PasteSpecial xlValues
             mPay.Copy
              mTarget.PasteSpecial xlValues
             cisCurrent.Copy
              cisTarget.PasteSpecial xlValues
             taxCurrent.Copy
              taxTarget.PasteSpecial xlValues
    End Sub
    
    我已经设法想出了一些代码来更改日期,将L3增加1并保存文档

    增加L3,并在日期后添加1个月:

    Private Sub CommandButton4_Click()
    Dim rDate As Range
    Dim rDate2 As Range
    
    Set rDate = ActiveSheet.Range("C7")
    Set rDate2 = ActiveSheet.Range("L7")
    
    With ActiveSheet
        Range("L3").Value = Range("L3").Value + 1
        rDate.Value = DateAdd("m", 1, rDate.Value)
            rDate.Value = DateSerial(Year(rDate), Month(rDate) + 1, 0)
        rDate2.Value = DateAdd("m", 1, rDate2.Value)
            rDate2.Value = DateSerial(Year(rDate), Month(rDate) + 1, 0)
    
    End With
    End Sub
    
    这是保存为的代码:

    Private Sub CommandButton6_Click()
    Dim MyPath As String, MyRange As Range, MyDate As Range
    
    MyPath = ActiveWorkbook.Path
    Set MyDate = Sheets("SUB CON PAYMENT FORM").Range("L7")
    Set MyRange = Sheets("SUB CON PAYMENT FORM").Range("L3") 'with the name of a cell
    ThisWorkbook.SaveAs Filename:=MyPath & "\" & "Payment" & " " & MyRange.Value & " " & MyDate.Text & ".xlsm"
    End Sub
    

    我们将非常感谢您提供的任何帮助

    我在想,你是在要求一种更专业、更高效的编码方式吗?如果是这样的话,也许我能给你一些建议:

  • 在代码中使用
    选项Explicit
    。这是为了确保在使用对象之前声明它
  • 添加
    Application.screenUpdate=False
    以增强宏性能
  • 如果要将值复制到相同的单元格中,则可以通过在单元格中写入公式来替换复制宏。例如,您可以使用公式
    =N40
    对单元格(N42)进行编码,以便在更新单元格(N40)时自动复制值。间接地,您将减少代码中变量的声明。因此,性能将得到提高
  • 通常,我会将“模式”:workbook.worksheet设置为变量。例如

    Dim MyWorkbook As Workbook
    Dim MyWorksheet As Worksheet
    Set MyWorkbook = Workbooks("Book1.xlsm")
    Set MyWorksheet = WorkbookTemplate.Sheets("WorksheetName")
    
    而不仅仅是在执行事务/任务时使用它们

  • 最后,请使用有意义的变量来简化您未来的增强。如果你有兴趣了解更多,你可以读一本叫《干净的代码》的书


  • 这就是我想到的,希望我做的一切都是正确的

    如果你看到一个错误或更好的编码方式,请让我知道,我一直在学习

    Private Sub CommandButton3_Click()
    Dim aws As Worksheet
    Dim MyPath As String, MyRange As Range, MyDate As Range
    Dim rDate As Range, rDate2 As Range
        With Application
            .ScreenUpdating = False
            .EnableEvents = False
            .CutCopyMode = False
        End With
    
    Set aws = ActiveWorkbook.Sheets("SUB CON PAYMENT FORM")
    Set MyRange = Sheets("SUB CON PAYMENT FORM").Range("L3")                    'Payment No
    Set MyDate = Sheets("SUB CON PAYMENT FORM").Range("L7")                     'Date "MMMM YYYY"
    Set rDate = ActiveSheet.Range("C7")
    Set rDate2 = ActiveSheet.Range("L7")
    
    MyPath = ActiveWorkbook.Path
    
    ActiveWorkbook.Sheets("Details").Rows(2 & ":" & Sheets("Details").Rows.Count).ClearContents 'This clears all data below the header in Details
    ActiveWorkbook.Sheets("Global").Rows(1 & ":" & Sheets("Global").Rows.Count).ClearContents   'This clears all data below in Global
    
    With ActiveSheet
        Range("L3").Value = Range("L3").Value + 1                               'Increases Payment No# by 1
            rDate.Value = DateSerial(Year(rDate), Month(rDate) + 1, Day(29))    'Increases Date by 1 Month
            rDate2.Value = DateSerial(Year(rDate), Month(rDate) + 1, 0)         'Increases Date by 1 Month
                With aws
                .Range("N40").Copy                                              'Copies total to date Value
                .Range("N42").PasteSpecial xlValues                             'Pastes total to date Value to Total Last Payment
                    With aws
                    .Range("G49").Copy                                          'Copies Total VAT to Date
                    .Range("G50").PasteSpecial xlValues                         'Pastes Total VAT to Date into Last Payment
                    .Range("G36").Copy                                          'Copies This Months Labour
                    .Range("G37").PasteSpecial xlValues                         'Pastes This Months Laboue into Last Payment
                    End With
                    With aws
                    .Range("N12:N27").Copy                                      'Copies CC Code Gross Value
                    .Range("J12:J27").PasteSpecial xlValues                     'Pastes CC Code Gross Value into Previous
                    End With
                End With
        Range("A1").Activate                                                    'Selects Cell A1
    End With
    
    ThisWorkbook.SaveAs Filename:=MyPath & "\" & "Payment" & " " & MyRange.Value & " " & MyDate.Text & ".xlsm" 'This saves a new document in our naming convention
    
    End Sub
    

    我看到了您试图做的事情,我看到了您的代码,但我没有看到具体的问题或您陷入困境的地方。请使用特定的question@gtwebb嗨,希望这更有意义。所以你的问题是,一切都很好,但我不知道如何订购?如果它们都需要运行,我会把它们绑在一个按钮上。在您的命令中,单击“仅运行3个您已经编写的常规宏”(调整值、复制单元格、保存工作表)。@GTWEB hi yes只是不确定排序的最佳方式。有更好的编码方法吗?谢谢