簡體   English   中英

Excel VBA選擇日期范圍並將其移動到新工作表

[英]Excel VBA to select a date range and move it to a new sheet

我正在嘗試使用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中處理日期。

您要讓用戶通過接受他們鍵入的字符串來決定日期的格式。錯誤的選擇是眾所周知的用戶不可靠。 將用戶輸入轉換為真實日期(如果無法輸入,請再次輸入),然后使用您選擇的格式掩碼將日期格式化為統一的字符串,以在文件名中使用。

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

有關擺脫依賴於選擇和激活來實現目標的更多方法,請參見如何避免在Excel VBA宏中使用“選擇”

您正在尋找功能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

將兩個潛水艇放在一個模塊中。 (由於您使用了宏記錄器,因此我假定它為您的第二個子程序創建了一個新模塊...。)為此,只需復制並粘貼代碼即可。

為了使它成為一個按鈕解決方案,您需要從第一個調用第二個子:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM