1

讓我回答大家的腦海中首先第一個問題...傳遞文件路徑變量從批次到VBA

爲什麼要使用批次調用VBA宏?

我現在有一個非常複雜的批次,其中包括手錶,文件夾觸發,多片的第三方軟件進行文件轉換步驟的電話,文件歸檔步驟,電子郵件觸發根據具體步驟,等等。由於此批處理腳本已經通過批處理 - > VBS - > Excel VBA程序調用了另外兩封電子郵件,我想繼續這個過程,以便重用代碼。 (目前的VBA代碼可以很容易地添加附件了。)

我的問題

我的問題是我安裝的原批程序上生成的文件。因此,我需要將完整的文件名(UNC路徑&文件名)作爲單個字符串變量從批處理傳遞給VBA腳本(這意味着還要通過VBS傳遞它,因爲從批處理調用VBA宏需要中間步驟 - 即批量 - > VBS - > VBA - >我的電子郵件)。

我的代碼

傳遞從批次變量 - > VBS

set ArchiveFullName=\\myArchivePath\myFile.rtf 
cscript //NoLogo "\\myEmailAutomationFolder\myEmailAutomation.vbs" /attachment:"%AttachmentFullName%" 

**構想使用 'CSCRIPT'(的代碼第3行)的這個方法來從通過可變一批VBS來自:Pass variable from Batch to VBS

從VBS傳遞變量到VBA

Dim xlApp 
    Dim xlBook 
    Dim attachmentFullName 
    attachmentFullName = WScript.Arguments.Named("attachment") 

    Set xlApp = CreateObject("Excel.Application") 
    Set xlBook = xlApp.Workbooks.Open("\\myPath\EmailAutomation.xlsm", 0, True) 

    xlApp.DisplayAlerts = False 
    xlApp.Run "Email_Received_Files", Cstr(attachmentFullName) 
    xlApp.Quit 

    Set xlBook = Nothing 
    Set xlApp = Nothing 

End Sub 

**此代碼的大部分工作,因爲它用於其他兩個自動電子郵件的代碼。但是,第3,4和10行是從VBS收​​集變量,並嘗試從VBA傳遞。這些是基於從建議:Pass Argument from VBS to VBA

接受變量在VBA

Sub Email_Received_Files(t As String) 
    Dim placementAttachment As String 

    'Grab attachment path from .vbs (which grabbed it from .bat) 
    Set placementAttachement = t 
    Set Range(C6) = placementAttachement 
End Sub 

上面的代碼只是在VBS提供的代碼的第二部分 - > VBA螺紋前面相連。我剛剛添加了一個調試步驟,將字符串放在工作表上,以便我知道它是否有效(還有我的電子郵件代碼,但顯然只是拍了一張快照)。

錯誤消息

這不告訴真正幫助確定其批次 - > VBS代碼或VBS - > VBA,但我得到一個編譯器錯誤當Excel揭開序幕。錯誤消息:

Compile error: Object required

代碼

疑難解答我沒有Visual Studio的這臺電腦上,所以沒有爲我調試VBS腳本,看看是否一個好方法變量正在從批處理接受。因此,我不確定變量未正確傳遞的位置 - 步驟1(批處理 - > VBS)或步驟2(VBS - > VBA)。

任何幫助將不勝感激!

+0

Excel中帶有一個內置的調試器,提供安裝了宏編輯器。對於VBScript調試,請參閱[這裏](http://www.robvanderwoude.com/vbstech_debugging.php)。一個好的第一步是使用'MsgBox'來顯示有問題的變量的值。至於你的錯誤信息:請顯示完整的錯誤信息,包括錯誤號碼。哪條線提高了錯誤?爲了調試,我還建議設置'xlApp.DisplayAlerts = True'和'xlApp.Visible = True'。 –

+2

「Set placementAttachement = t」語句可能是問題。 'Set'只能用於一個對象;你正在用一個字符串來使用它。試試'placementAttachement = t'。 – xidgel

回答

2

如果您實施這些更改,您會得到什麼?您應該看到從批處理> VBS> VBA傳遞的值。

您的批處理文件:

沒有變化。

set ArchiveFullName=\\myArchivePath\myFile.rtf 
cscript //NoLogo "\\myEmailAutomationFolder\myEmailAutomation.vbs" /attachment:"%AttachmentFullName%" 

您的VBS文件:

評論了,因爲沒有分宣佈退出小組。

添加一個msgbox,顯示attachmentFullName的值(用於測試)。

Dim xlApp 
Dim xlBook 
Dim attachmentFullName 
attachmentFullName = WScript.Arguments.Named("attachment") 
msgbox attachmentFullName,vbokonly,"Variable value in VBS"  'added this 

Set xlApp = CreateObject("Excel.Application") 
Set xlBook = xlApp.Workbooks.Open("\\myPath\EmailAutomation.xlsm", 0, True) 

xlApp.DisplayAlerts = False 
xlApp.Run "Email_Received_Files", Cstr(attachmentFullName) 
xlApp.Quit 

Set xlBook = Nothing 
Set xlApp = Nothing 
'Exit Sub       'removed this 

您的VBA文件:

註釋掉的命令集。

添加msgbox進行診斷。

Sub Email_Received_Files(t As String) 
    Dim placementAttachment As String 
    msgbox t,vbokonly,"Variable value in VBA" 

    'Grab attachment path from .vbs (which grabbed it from .bat) 
    'Set placementAttachement = t 
    'Set Range(C6) = placementAttachement 
End Sub 

在註釋掉set行上,它們需要一個對象。 't'行只需要刪除該集合。這只是一個字符串。 placementAttachement = t

Set Range行上,如果您嘗試將文件路徑存儲在單元格C6中,那麼只需丟失placementAttachement變量並直接從傳遞的值中設置它。

Range("C6").Value = T

+0

太棒了,只需稍微調整一下,我就可以使用我當前的電子郵件自動化代碼 - 謝謝@RLH! (也就像使用msgbox進行vbs調試)。 – TMY

+0

@TMY,如果他們看着同樣的問題,那麼發佈固定代碼以便其他人可以看到它會很好。 – RLH

+0

上面的代碼工作/是解決方案(以防其他人遇到此問題)。我的調整隻是基於更改僞變量名稱和路徑來將您的代碼合併到我現有的代碼中,然後刪除調試消息框,以便在沒有人爲干預的情況下運行該過程。 – TMY