Excel VBA选择日期范围并将其移动到新工作表

时间:2015-08-08 20:00:38

标签: excel vba excel-vba

我正在尝试使用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中的日期。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您正在寻找函数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

对于"一键式解决方案",我想你的意思是只在一次点击中运行两个宏。您只需在Macro2末尾调用SaveWorkbookAsNewFile(),即:

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

答案 2 :(得分:0)

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

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

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

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

Sub Macro2(BillStart as String, BillEnd as String)

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

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

Range("A1").Value = BillStart