2013-11-25 13 views
13

मैं Outlook नियम स्क्रिप्ट से एक्सेल मैक्रो को कॉल कर रहा हूं।वीबीए आउटलुक एक्सेल मैक्रो को कॉल करना और मैक्रो तक प्रतीक्षा करें

प्रक्रिया है: मेल प्राप्त करें, Outlook नियम चलाएं जो Outlook स्क्रिप्ट चलाता है, उस स्क्रिप्ट से एक्सेल खोलें, एक्सेल मैक्रो चलाएं, एक्सेल बंद करें।

एप्लिकेशन को सहेजने और बंद करने के लिए एक्सेल मैक्रो किए गए Outlook नियम स्क्रिप्ट में मैं कैसे सत्यापित कर सकता हूं?

Sub AskMeAlerts() 
Dim appExcel As Excel.Application 
Dim wkb As Excel.Workbook 
Set appExcel = CreateObject("Excel.Application") 
appExcel.Workbooks.Open ("C:\Ask me question workflow.xlsm") 
appExcel.Visible = True 
appExcel.Run "'Ask me question workflow.xlsm'!AskMeFlow" 
appExcel.DisplayAlerts = False 
appExcel.ActiveWorkbook.Save 
appExcel.Quit Set appExcel = Nothing 
Set wkb = Nothing 
End Sub 
+0

कृपया हमें प्रासंगिक दिखाने आपके कोड के कुछ हिस्सों। (यानी नहीं पूरी बात) –

+0

'मंद appExcel Excel.Application मंद WKB Excel.Workbook सेट appExcel = CreateObject ("Excel.Application") appExcel.Workbooks.Open ("सी के रूप में के रूप में: \ मेरे कार्यप्रवाह प्रश्न पूछें .xlsm ") appExcel.Visible = सच appExcel.Run" 'मुझे workflow.xlsm प्रश्न पूछें'! AskMeFlow " ---- यहाँ मैं प्रतीक्षा करने के लिए जब तक मैक्रो किया जाता है चाहता हूँ ---- appExcel .DisplayAlerts = झूठी appExcel.ActiveWorkbook.Save appExcel.Quit ऐपएक्ससेल सेट करें = कुछ भी नहीं सेट wkb = कुछ भी नहीं एंड सब ' – user3016795

+1

मुझे लगता है कि आप स्वयं के लिए देख सकते हैं कि यह पूरी तरह से गैरकानूनी है ... कृपया अपना प्रश्न संपादित करें, अपना कोड वहां रखें, और '{}' बटन का उपयोग करके इसे सही तरीके से प्रारूपित करें। –

उत्तर

4

आप Outlook में

  1. पोर्ट अपने एक्सेल स्थूल और या तो इसे सीधे
  2. उपयोग चला सकते हैं एक झंडा कोड पूरा होने

कोड के नीचे एक मार्कर का उपयोग करता है पर कब्जा करने के कोड चलाने के लिए पहली शीट के ए 1 में (एक्सेल भाग में)। मैं भी अपने कोड tided है

दृष्टिकोण कोड

Sub AskMeAlerts() 
Dim appExcel As Excel.Application 
Set appExcel = New Excel.Application 
With appExcel 
    .DisplayAlerts = False 
    .Workbooks.Open ("C:\TEMP\Ask me question workflow.xlsm") 
    .Run "'Ask me question workflow.xlsm'!AskMeFlow" 
    If .activeworkbook.sheets(1).[a1].Value = "Complete" Then 
     MsgBox "Code has run" 
     .activeworkbook.sheets(1).[a1].Value = vbNullString 
     .activeworkbook.Save 
     .DisplayAlerts = True 
     .activeworkbook.Close 
     appExcel.Quit 
     Set appExcel = Nothing 
    End If 
End With 
End Sub 

उत्कृष्टता कोड

Sub AskMeFloW() 
'do stuff 
ThisWorkbook.Sheets(1).[a1] = "Complete" 
End Sub 
+0

मैं आपका कोड गलत तरीके से पढ़ रहा हूं, लेकिन AskMeAlerts() subroutine केवल '.activeworkbook.sheets का मूल्यांकन नहीं करेगा (1)। [ए 1]। वैल्यू = "पूर्ण" 'गलत के रूप में और फिर ब्लॉक को छोड़ दें? क्या आपके पास किसी प्रकार का प्रतीक्षा कार्य होना चाहिए, या तो कोई या कब? –

+0

@NickPeranzi नं। ऊपर दिए गए कोड का परीक्षण करने का प्रयास करें (एक 'MsgBox .activeworkbook.sheets (1) जोड़ें। ("ए 1")। मूल्य' पहले और बाद में)। – brettdj

+0

तो फिर "ध्वज" भी मायने रखता है? चूंकि Outlook मैक्रो को रूट कथन निष्पादित करने और मान की जांच करने के बीच कोई प्रतीक्षा नहीं है, तो क्या इसका मतलब यह है कि Outlook मैक्रो। वैल्यू कथन निष्पादित नहीं करता है। Run कथन (एक्सेल मैक्रो) पूरा हो गया है? –

2

वास्तव में एक आसान तरीका (यह जल्दी का मिश्रण है और बाद में बाध्यकारी था), के द्वारा होता है एक ताला लागू करना

यह कोड एक पूर्वनिर्धारित स्थान में, फ़ाइल के अस्तित्व की जांच करके त्वरित और गंदे समाधान है।

C:\Ask me question workflow.xlsm में

इस उप जोड़ें:

Sub WrapAskMeFlow() 
    Dim tmpFile As String 
    tmpFile = "C:\AskMeFlow.tmp" 
    Open tmpFile for Output as #1 
    Close #1 
    AskMeFlow 
    Kill tmpFile 
End Sub 

अपने दृष्टिकोण मैक्रो ऐड में:

Sub AskMeAlerts() 
Dim appExcel As Excel.Application 
Dim wkb As Excel.Workbook 
Set appExcel = CreateObject("Excel.Application") 
appExcel.Workbooks.Open ("C:\Ask me question workflow.xlsm") 
appExcel.Visible = True 
appExcel.Run "'Ask me question workflow.xlsm'!WrapAskMeFlow" 
appExcel.DisplayAlerts = False 
While Dir("C:\AskMeFlow.tmp")="":DoEvents:Wend 
While Dir("C:\AskMeFlow.tmp")<>"":DoEvents:Wend 
appExcel.ActiveWorkbook.Save 
appExcel.Quit Set appExcel = Nothing 
Set wkb = Nothing 
End Sub 
2

विकल्प 1

अपने विशिष्ट मामले में सबसे आसान विकल्प के निर्माण के लिए किया जाएगा आउटलुक की बजाय एक्सेल मैक्रो में कमांड को सेव करें और छोड़ दें।

Sub AskMeAlerts() 
Dim appExcel As Excel.Application 
Dim wkb As Excel.Workbook 'Is this declaration necessary for some code elsewhere? You do not use this variable and I would recommend removing the declaration. 
     Set appExcel = CreateObject("Excel.Application") 
     With appExcel 
      .Workbooks.Open ("C:\Ask me question workflow.xlsm") 
      .Visible = True 
      .Run "'Ask me question workflow.xlsm'!AskMeFlow" 
     'No need to explicitly set alert values or save workbook as Excel macro will handle this. 
     End With 
     Set appExcel = Nothing 
     Set wkb = Nothing 'Again, is this necessary? 
End Sub 

फिर आप जोड़ सकते हैं "workflow.xlsm सवाल मुझसे पूछें" फ़ाइल के अंत में निम्नलिखित:

Application.DisplayAlerts = False 
ThisWorkbook.Close SaveChanges:=True 
Application.Quit 

है, तो आप अपने आउटलुक कोड में संशोधन कर सकता है नोट: यदि आप मैक्रो को मैन्युअल रूप से या अन्य उपयोग मामलों में भी चलाएंगे जहां आप कार्यपुस्तिका को सहेजने, बंद करने और छोड़ने के लिए नहीं चाहते हैं, तो आप AskMeFlow मैक्रो में एक इनपुट चर जोड़ने पर विचार कर सकते हैं जो गलत पर डिफ़ॉल्ट है लेकिन सेट है आउटलुक द्वारा सच है। मुझे लगता है कि यह इस उत्तर के दायरे से थोड़ा सा है, इसलिए मैं आगे विस्तार नहीं करूंगा, लेकिन अगर आपको इस विकल्प में दिलचस्पी है तो मुझे बताएं।

विकल्प 2

संशोधित। उरी के समाधान देखें; मैंने सुझाए गए सुधार मूल रूप से उस समाधान को बदल नहीं सकते हैं।

विकल्प 3

एक्सेल कोड की प्रकृति पर निर्भर करता है, आप एक समारोह में बारी और आउटपुट चर ले सकता है। नीचे की तरह कुछ:

Sub AskMeAlerts() 
Dim appExcel As Excel.Application 
Dim wkb As Excel.Workbook 
Dim StrOutput as string 
StrOutput = "Excel macro did not complete." 
Set appExcel = CreateObject("Excel.Application") 
appExcel.Workbooks.Open ("C:\Ask me question workflow.xlsm") 
appExcel.Visible = True 
StrOutput = appExcel.Run "'Ask me question workflow.xlsm'!AskMeFlow" 
MsgBox StrOutput 
appExcel.DisplayAlerts = False 
appExcel.ActiveWorkbook.Save 
appExcel.Quit Set appExcel = Nothing 
Set wkb = Nothing 
End Sub 

फिर आप एक समारोह के लिए AskMeFlow बदल सकते हैं और निम्नलिखित कोड जोड़ना होगा:

Function AskMeFlow() as String 
AskMeFlow = "Uncaught error executing Excel code." 
'Your code here 
AskMeFlow = "Excel code completed successfully!" 
End Function 
+0

विकल्प 1 प्रश्नों को संबोधित नहीं करता है (यानी एक्सेल कोड पूर्ण होने पर पता लगाना)। विकल्प 2 प्रतीत होता है, लेकिन यह एक मौजूदा उत्तर tweaking है। – brettdj

+0

विकल्प 1 बताता है, उपर्युक्त विकल्प 1 के रूप में, एक्सेल को बंद करने की प्रतीक्षा इस विशिष्ट परिदृश्य में सबसे अच्छा सहारा नहीं हो सकता है। एक्सेल कोड को Outlook में पोर्ट करने के लिए आपका सुझाव कार्यात्मक रूप से सभी Outlook मैक्रो क्रियाओं को स्थानांतरित करने के मेरे सुझाव के बराबर है जो वास्तव में एक्सेल मैक्रो में एक्सेल मैक्रो पूर्णता पर निर्भर करता है। मैं तर्कवादी के रूप में आने की कोशिश नहीं कर रहा हूं, और अगर मैं इस तरह से आ रहा हूं तो मैं क्षमा चाहता हूं; धन्यवाद प्रतिक्रिया देना के लिए। –

+0

आप बिल्कुल तर्क के रूप में नहीं आ रहे हैं - आपने एक अच्छा सवाल उठाया है। इसी प्रकार आपकी पोस्ट पर मेरी टिप्पणियां रचनात्मक के रूप में थीं - भले ही अन्य फोरम मानकों द्वारा एसओ काफी अचानक और प्रत्यक्ष हो। अब मैं विकल्प 1 पर आपके द्वारा तर्कित तर्क को समझता हूं। – brettdj

1

तो Sub AskMeFlow उपयोगकर्ता के हस्तक्षेप के बिना गणना करने, मैं तुम्हें बस Excel के CalculationState ट्रैक कर सकते हैं लगता है ।

Sub AskMeAlerts() 
    With CreateObject("Excel.Application") 
     .Workbooks.Open ("C:\Ask me question workflow.xlsm") 
     .Visible = True 

     ' Ensure Autocalculation is on 
     .Calculation = -4105 ' xlCalculationAutomatic 

     .DisplayAlerts = False 
     .Run "'Ask me question workflow.xlsm'!AskMeFlow" 

     ' Wait until calculation is done 
     Do Until .CalculationState = 0 ' xlDone 
      DoEvents 
     Loop 

     .ActiveWorkbook.Save 
     .ActiveWorkbook.Close 
     .Quit 
    End With 
End Sub 

यह और भी बेहतर हो सकता है अगर AskMeFlowWorkbook_Open घटना में मार डाला ("ThisWorkbook" मॉड्यूल के भीतर) ऑटो है।

1

एक्सेल मैक्रो सभी कार्यपुस्तिकाओं को बंद करके पूरा करना चाहिए, और Outlook अभी भी कार्यपुस्तिकाएं खुले होने पर प्रतीक्षा करेंगे।

Excel में:

// do work 
Application.ActiveWorkbook.Save 
Application.DisplayAlerts = False 
For Each wrkbk In Application.Workbooks 
    If wrkbk.Name <> ThisWorkbook.Name Then wrkbk.Close 
Next 
ThisWorkbook.Save 
ThisWorkbook.Close 

आउटलुक मैक्रो Workbooks.Count जब तक पूल कर सकते हैं = शून्य

While appExcel.Workbooks.Count > 0 :DoEvents:Wend 
appExcel.DisplayAlerts = False 
appExcel.Quit 
Set appExcel = Nothing 
-1

निम्नलिखित के साथ अपने कोड अंत:

On Error Resume Next 
    On Error GoTo 0 

ExitFunction: 
    Set objShell = Nothing 

End Function 
संबंधित मुद्दे