Excel VBAselectdate范围并将其移动到新工作表

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

我有两个VBA脚本,其中一个是我制定的,其中一个是我用的“macroslogging器”,不知何故,我需要把它们放在一起…这里是:

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 

这一个适用于我需要的位,即为开始和结束date范围创build2个variables,然后将文档保存为该名称。

 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脚本(手动范围)中的所有范围replace为第一个VBA脚本中的datevariables,对于一个button解决scheme(如果可能的话)。 有任何想法吗? 我从来没有在excel中使用date。

你让用户通过接受他们input的string来决定date的格式。糟糕的select,因为用户是臭名昭着的不可靠的。 将用户input转换为真正的date(如果不能,则再次input),然后使用您select的格式掩码将date格式化为统一的string,以便在文件名中使用。

 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 

macros录像机非常详细, 试图用最广泛的代码覆盖所有的可能性。 一般来说,macroslogging器提供的代码可以被大大parsing。

 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 

请参阅如何避免使用Excel中的selectVBAmacros来获取更多的方法来摆脱依靠select和activate来实现您的目标。

你正在寻找函数Format ,其中input的date,并将其转换为像这样的string:

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

下面是一个例子,其中FileName是在全局范围内声明的全局variables,在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 

至于“一键解决scheme”,我想你的意思是只在一次点击中运行这两个macros。 您可以简单地在SaveWorkbookAsNewFile()的末尾调用Macro2 ,即:

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

把两个子都放到一个模块中。 (既然你使用了macroslogging器,我假设它为你的第二个子创build了一个新的模块…)要做到这一点,只需复制并粘贴代码即可。

为了使这是一个单一的button解决scheme,您将需要从第一个调用第二个子:

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

这将在第一个子技术完成之前启动Macro2,所以它在同一个button上点击。 但是请注意,我在Macro2之后放置了variables名称。 这将使得我们可以在下一个macros中使用它们,但是我们首先需要对Macro2进行调整:

 Sub Macro2(BillStart as String, BillEnd as String) 

现在,您可以在Macro2中使用BillStart和BillEnd。 (这被称为“传递variables”)

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

 Range("A1").Value = BillStart