簡體   English   中英

通過python啟動時宏運行兩次

[英]Macro is running twice when launch via python

挑戰:我正在通過 python 運行 Excel 宏,宏顯示日期輸入表單。 但是,一旦我在宏的輸入表單中輸入日期並單擊“確定”按鈕,相同的輸入表單將再次顯示,需要輸入它。

在宏中,我只調用了 1 次輸入表。

Sub Load_NAV_Data()
    On Error GoTo ERR_HANDLER
    Dim strSQL As String
    Dim strStandardDate As String
    Dim intNumberColumns As Long
    Dim intNumberRows As Long

    Dim objCol As Object
    Dim ingColSu As Long
    Dim iCols As Long

    '--------------------------------
    ' Connect to DB
    '--------------------------------

    '--------------------------------
    ' Get standard date
    '--------------------------------
    StandardDateForm.Show
    strStandardDate = StandardDateForm.StandardDate
    Unload StandardDateForm

    If strStandardDate = StrConv(strStandardDate, vbWide) Then
        strStandardDate = StrConv(strStandardDate, vbNarrow)
    End If

    MsgBox strStandardDate

    '--------------------------------
    ' SQL
    '--------------------------------
    Dim Rs As New ADODB.Recordset
    Set Rs = New ADODB.Recordset
    Rs.CursorLocation = adUseClient

    strSQL = "SELECT HR.ID,"
    strSQL = strSQL & "HR.EMPNAME "
    strSQL = strSQL & "FROM HR "
    strSQL = strSQL & "WHERE (HR.Date='" & strStandardDate & "') AND (HR.WORKINGYEAR>$0)"

    Rs.Open strSQL, cn

    '--------------------------------
    ' Get Column Name
    '--------------------------------
    For intNumberColumns = 0 To Rs.Fields.Count - 1
        Worksheets("NAV Price").Cells(1, intNumberColumns + 1).Value = Rs.Fields(intNumberColumns).Name
    Next intNumberColumns


    '--------------------------------
    ' Output to Excel
    '--------------------------------
    intNumberRows = 2

    Do Until Rs.EOF
        Cells(intNumberRows, 1).Value = Rs.Fields("ID").Value
        Cells(intNumberRows, 2).Value = Rs.Fields("EMPNAME").Value

        intNumberRows = intNumberRows + 1
        Rs.MoveNext
    Loop

    '--------------------------------
    ' Disconnect to DB
    '--------------------------------

    If Not Rs Is Nothing Then
        If Rs.State = adStateOpen Then Rs.Close
        Set Rs = Nothing
        End If
    If Not cn Is Nothing Then
        If cn.State = adStateOpen Then cn.Close
        Set cn = Nothing
    End If

    cn.Close
    Rs.Close

ERR_HANDLER:
    'Error message
    Debug.Print Err.Number & ")" & Err.Description
    MsgBox Err.Number & ")" & Err.Description

    '--------------------------------
    ' Disconnect to DB
    '--------------------------------
    If Not Rs Is Nothing Then
        If Rs.State = adStateOpen Then Rs.Close
        Set Rs = Nothing
        End If
    If Not cn Is Nothing Then
        If cn.State = adStateOpen Then cn.Close
        Set cn = Nothing
    End If
End Sub

在 python 中,我們用下面的方法調用宏

excel = Win32com.client.Dispatch('Excel.Application')
excel.Visible = 0

private_wb = excel.Workbooks.Open("Macro file path")
data_sheet = private_wb.Worksheets("Data")
excel.Application.Run("Macro.Load_NAV_Data()")

private_wb.Close(SaveChanges = 1)

--- skip logic ---

submit_wb = excel.Workbooks.Add()
submit_sheet = submit_wb.Worksheets(1)
submit_sheet.name = "Submit"

submit_wb.SaveAs("Path where to save")
private_wb.Close(SaveChanges = 0)
submit_wb.Close(SaveChanges = 0)

當我只運行宏時,輸入表單將只顯示一次,但從 python 顯示兩次。

您能指導我解決問題嗎?

對於那些有同樣問題的人,這僅僅是由於調用 VBA Sub 時的括號。 如果 sub 不需要任何參數,則不需要括號。

而不是這個:

excel.Application.Run("Macro.Load_NAV_Data()")

它應該是:

excel.Application.Run("Macro.Load_NAV_Data")

暫無
暫無

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

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