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