【问题标题】:Excel VBA to select a date range and move it to a new sheetExcel VBA 选择日期范围并将其移动到新工作表
【发布时间】:2015-08-10 20:36:35
【问题描述】:

我正在尝试使用 Excel VBA 脚本在一个例程中执行一些操作,我不确定是否可行。

我有两个 VBA 脚本,其中一个是我制定的,一个是我使用“宏记录器”的,我需要以某种方式将它们放在一起......这里是:

Sub SaveWorkbookAsNewFile()
Dim CurrentWorkbook As String
Dim CurrentFormat As Long
Dim DStart As String
Dim DEnd As String

DStart = Application.InputBox("Please enter start date. (dd-mm-yyyy)")
DEnd = Application.InputBox("Please enter end date. (dd-mm-yyyy)")

CurrentWorkbook = ThisWorkbook.FullName
CurrentFormat = ThisWorkbook.FileFormat

ThisWorkbook.SaveAs DStart & " to " & DEnd
End Sub

这适用于我需要的部分,即为开始和结束日期范围创建 2 个变量,然后将文档另存为该名称。

Sub Macro2()
  Rows("5624:5679").Select
  Selection.Copy
  Windows("01-08-2015 to 09-09-2015.xlsm").Activate
    Sheets("Sheet1").Select
    Range("A1").Select
    ActiveSheet.Paste
  Windows("Dash 2014Test.xlsx").Activate
    Sheets("Sheet2").Select
    Rows("835:846").Select
    Application.CutCopyMode = False
    Selection.Copy
  Windows("01-08-2015 to 09-09-2015.xlsm").Activate
    Sheets("Sheet2").Select
    ActiveSheet.Paste
  Windows("Dash 2014Test.xlsx").Activate
    Sheets("Sheet3").Select
    Rows("1611:1620").Select
    Application.CutCopyMode = False
    Selection.Copy
  Windows("01-08-2015 to 09-09-2015.xlsm").Activate
    Sheets("Sheet3").Select
    Range("A1").Select
    ActiveSheet.Paste
  Windows("Dash 2014Test.xlsx").Activate
End Sub

我想做的是用第一个 VBA 脚本中的日期变量替换第二个 VBA 脚本中的所有范围(手动范围),以获得一个按钮解决方案(如果可能)。有任何想法吗?我从来都不擅长在 Excel 中处理日期。

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    你让用户通过接受他们输入的字符串来决定日期的格式。糟糕的选择,因为用户是出了名的不可靠。将用户输入转换为真实日期(如果不能,让他们再次输入),然后使用您选择的格式掩码将日期格式化为要在文件名中使用的统一字符串。

    Sub SaveWorkbookAsNewFile()
        Dim CurrentWorkbook As String
        Dim CurrentFormat As Long
        Dim dtStart As Date
        Dim dtEnd As Date
    
        On Error GoTo bm_SlapWrist
        dtStart = Application.InputBox("Please enter start date. (dd-mm-yyyy)")
        dtEnd = Application.InputBox("Please enter end date. (dd-mm-yyyy)")
    
        With ThisWorkbook
            CurrentWorkbook = .FullName
            CurrentFormat = .FileFormat
            .SaveAs Filename:=Format(dtStart, "dd-mm-yyyy to ") & Format(dtEnd, "dd-mm-yyyy"), _
                    FileFormat:=CurrentFormat
        End With
        Call Macro2(ThisWorkbook.Name)
        Exit Sub
    
    bm_SlapWrist:
        If Err.Number = 13 Then  'bad date: Type mismatch
            MsgBox "Try to get it right this time.", vbCritical, Title:="Bad User!"
            Err.Clear
            Resume
        End If
    
    End Sub
    

    宏记录器必然非常冗长;试图用最广泛的代码覆盖所有可能性。一般来说,宏录制器下发的代码可以被大量解析。

    Sub Macro2(strWB As String)
        Dim wb As Workbook
    
        Set wb = Workbooks(strWB)
    
        'I'll assume that you started with this workbook since you keep going back to it.
        With Workbooks("Dash 2014Test.xlsx")
            'I do not know which worksheet you started on so I'll use Sheet1
            With .Worksheets("Sheet1")
                .Rows("5624:5679").Copy _
                    Destination:=wb.Worksheets("Sheet1").Range("A1")
            End With
            With .Worksheets("Sheet2")
                .Rows("835:846").Copy _
                    Destination:=wb.Worksheets("Sheet2").Range("A1")
            End With
            With .Worksheets("Sheet3")
                .Rows("1611:1620").Copy _
                    Destination:=wb.Worksheets("Sheet3").Range("A1")
            End With
            .Activate
        End With
    End Sub
    

    请参阅How to avoid using Select in Excel VBA macros,了解更多摆脱依赖选择和激活来实现目标的方法。

    【讨论】:

      【解决方案2】:

      您正在寻找函数Format,它将输入中的日期转换为字符串,如下所示:

      myString = Format(myDate, "dd-mm-yyyy")
      

      这是一个示例,其中FileName 是在全局范围内声明的全局变量,在SaveWorkbookAsNewFile() 中分配并在Macro2 中使用:

      Dim fileName As String
      Sub SaveWorkbookAsNewFile()
      '...
      DStart = Application.InputBox("Please enter start date. (dd-mm-yyyy)")
      DEnd = Application.InputBox("Please enter end date. (dd-mm-yyyy)")
      fileName = Format(DStart,"dd-mm-yyyy") + " to " + Format(DEnd,"dd-mm-yyyy") + ".xlsm"
      '...
      End Sub
      

      因此,每次你只需要写:

      Windows(fileName).Activate
      

      至于“一键解决方案”,我猜你的意思是一键运行两个宏。您可以简单地在SaveWorkbookAsNewFile() 末尾调用Macro2,即:

      Sub SaveWorkbookAsNewFile()
      '..
      'all the code
      '...
      Macro2 '<-- calling the other macro
      End Sub
      

      【讨论】:

        【解决方案3】:

        将两个潜艇放入一个模块中。 (由于您使用了宏记录器,我假设它为您的第二个子创建了一个新模块......)为此,只需复制并粘贴代码。

        要使其成为一个按钮解决方案,您需要从第一个调用第二个子:

        ThisWorkbook.SaveAs BillStart & " to " & BillEnd
        Macro2 BillStart, BillEnd
        End Sub
        

        这将在第一个 sub 在技术上完成之前启动 Macro2,因此它在单击按钮时出现。但是,请注意我将变量名放在Macro2 之后。这样我们就可以在下一个宏中使用它们,但我们需要先对 Macro2 进行调整:

        Sub Macro2(BillStart as String, BillEnd as String)
        

        现在您也可以在 Macro2 中使用 BillStart 和 BillEnd。 (这称为“传递变量”)

        要在一个范围内使用它们,只需使用:

        Range("A1").Value = BillStart
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-07
          • 1970-01-01
          相关资源
          最近更新 更多