2011-01-12 10 views
6

मैं वीबीए में खोल कमांड के साथ आवेदन के बीच आगे और पीछे स्विच करना चाहता हूं। मैं प्रक्रिया में सामान करने के लिए SendKeys का उपयोग कर रहा हूं ए फिर बी को संसाधित करने के लिए आगे बढ़ें, फिर प्रक्रिया ए को संसाधित करने के लिए। यह पहले पुनरावृत्ति के लिए ठीक काम करता है। जब मैं प्रक्रिया बी पर वापस जाने के लिए AppActivate का उपयोग करता हूं, तो यह वास्तव में बी को संसाधित करने के लिए फ़ोकस स्विच करता है। फिर भी, यह SendKeys के बाद के आदेशों को अनदेखा करता है।वीबीए खोल कमांड में AppActivate और Sendkeys का उपयोग

उदाहरण कोड:

Sub pastePDF2TXT_v3(pdfName As String, txtName As String) 


Dim acrobatID 
Dim acrobatInvokeCmd As String 
Dim acrobatLocation As String 

Dim notepadID 

Dim acrobatID2 
Dim notepadID2 

Debug.Print "here" 


acrobatLocation = "C:\Program Files\Adobe\Acrobat 9.0\Acrobat\Acrobat.exe" 

acrobatInvokeCmd = acrobatLocation & " " & pdfName 

acrobatID = Shell(acrobatInvokeCmd, 1) 
AppActivate acrobatID 
SendKeys "^a", True '^A selects everything already in the pdf file. 
SendKeys "^c", True '^C copies the selection to the clipboard. 



notepadID = Shell("NOTEPAD.EXE " & txtName, 1) ' invoke notepad on the text file. 
AppActivate notepadID       ' set the new app as teh active task. 

SendKeys "^a", True '^A selects everything already in the text file. 
SendKeys "^v", True '^V pastes the new stuff over the top of the old text file (deleting the old stuff) 
SendKeys "%{END}", True ' makre sure last line of text file 
SendKeys "{ENTER}", True 



AppActivate acrobatID ' NOTE: APPEARS TO WORK UP TO THIS POINT. 

SendKeys "{ENTER}", True ' NOTE: SECOND APP IGNORES SUBSEQUENT COMMANDS FROM HERE DOWN. 
SendKeys "^a", True '^A selects everything already in the pdf file. 
SendKeys "^c", True '^C copies the selection to the clipboard. 
SendKeys "%f", True 'alt f, x to exit Notepad.exe 
SendKeys "x", True 
'acrobatID.Quit 


Debug.Print "start second" 

AppActivate notepadID       ' set the new app as teh active task. 


SendKeys "%{END}", True 'Go to end of text file. 
SendKeys "^v", True '^V pastes the new stuff at end of file. 
SendKeys "{ENTER}", True 

SendKeys "^s", True 

SendKeys "%f", True 'alt f, x to exit Notepad.exe 
SendKeys "x", True 

notepadID.Quit 
acrobatID.Quit 

End Sub 

उत्तर

2

यह एक जवाब की तुलना में एक टिप्पणी की और अधिक हो सकता है, लेकिन मैं "टिप्पणी" की अनुमति दी जानी करने के लिए नहीं है, इसलिए ...

यह आप अद्भुत है जहां तक ​​आपने किया है उतना ही मिल गया है। संभावना है, आप इस काम को भरोसेमंद बनाने में सक्षम नहीं होंगे - अवधि। जैसे ही आप इसे काम करते हैं, कुछ भविष्य में रिलीज में एक्रोबैट यूआई कैसे व्यवहार करता है, इस बारे में कुछ बदल जाएगा, या विंडोज़ नियमों में एक और बदलाव करेगी कि चीजें अन्य चीजों के लिए घटनाएं कैसे भेज सकती हैं, और फिर आप फिर से हो जाते हैं ।

आप इस मामले में शायद क्या चल रहे हैं, विंडोज एक एप्लिकेशन को रोकने से रोकने का प्रयास कर रहा है जब उपयोगकर्ता स्पष्ट रूप से पहले व्यक्ति के साथ बातचीत कर रहा है। आप एक ही प्रकार की समस्याओं को देखने की कोशिश कर रहे हैं जैसे कि एक एप्लिकेशन में बटन एक अस्थायी फ़ाइल में डेटा लिखते हैं और इसे संपादित करने के लिए एमएस वर्ड खोलते हैं। विंडोज वर्तमान ऐप से और एमएस वर्ड से दूर स्थानांतरित करने से फोकस को रोकता है क्योंकि आपने अभी मौजूदा ऐप में एक बटन पर क्लिक किया है।

तो - इस असंभव तकनीकी समस्या को हल करने की कोशिश करने के बजाय, चलो एक कदम वापस लें और पूछें कि आप मूल रूप से यह सब करने के द्वारा क्या हासिल कर रहे थे। इस तरह, शायद, हम आपको वह स्थान प्राप्त कर सकते हैं जहां आप जा रहे हैं :)

+0

क्या मैं पीडीएफ़ पाठ है कि का एक समूह (1000 से अधिक) है कि मैं चाहता हूँ समय ध्यान में उस खिड़की को लाने के लिए अनुमति देने के लिए के माध्यम से पार्स कुछ पाठ मुक्त रूप और अनुपयोगी है। पाठ के अन्य हिस्सों को लगभग लगातार स्वरूपित किया गया है और मैं बाद में विश्लेषण के लिए उस जानकारी को प्राप्त कर सकता हूं और इसे डेटाबेस (एक्सेल स्प्रेडशीट) में डाल सकता हूं। डेटा को टेक्स्ट फ़ाइल में डालने के बाद, मैं अपनी इच्छित सामग्री प्राप्त करने और एक CSV बनाने के लिए एक पर्ल स्क्रिप्ट के साथ विश्लेषण करता हूं। ऐसा करने का यह एक चतुरा तरीका है - आपके द्वारा दिए जाने वाले कारणों से, क्योंकि यह सौंदर्यपूर्ण रूप से बदसूरत है और यह सभी मामलों में लगातार काम नहीं कर रहा है। – elbillaf

+0

सामान्य विधि काम करता है यदि पीडीएफ केवल एक पृष्ठ है, लेकिन बहुविध के लिए, एक्रोबैट केवल^ए (प्रेषक से) पर एक पृष्ठ का चयन करता है, इसलिए मुझे आगे और पीछे जाना होगा - जो काम नहीं करता है। मैं अपने वर्तमान कार्य के लिए इस मुद्दे को हल करने में सक्षम था, लेकिन मुझे इस तरह की समस्या को हल करने के लिए एक सामान्य विधि चाहिए ताकि भविष्य के तरीके इतनी परेशान न हों। – elbillaf

+1

क्या आप Acrobat GUI को स्वचालित करने की कोशिश करने के बजाय http://www.pdf2txt.com/ जैसे कुछ उपयोग कर सकते हैं? –

3

मुझे पता है कि यह प्रश्न पुराना है, लेकिन मैंने इसी समस्या में भाग लिया है, लेकिन मुझे नहीं लगता कि उत्तर चुना गया था सही है

जब आप AppActivate को कॉल करते हैं, तो स्क्रिप्ट रोक दी जाती है, लक्ष्य एप्लिकेशन को समाप्त करने की प्रतीक्षा कर रहा है। आवेदन समाप्त होने के बाद, स्क्रिप्ट जारी है। मुझे इस मुद्दे का कोई समाधान नहीं दिख रहा है।

संपादित करें:

मैं एक बैच फ़ाइल का उपयोग AppActivate आदेश के लिए CSCRIPT कॉल करने के लिए, और मैं तुम्हें सख्ती से एक VBS फ़ाइल का उपयोग कर रहे नोटिस। एक नई विंडो के रूप में CMD पर कॉल करने का प्रयास करें और CSCRIPT //NoLogo //B WScript.CreateObject("WSCript.shell").AppActivate("Window Name") को तर्क के रूप में पास करें, और देखें कि क्या समस्या को बाधित करता है।

+0

मैंने पहले से ही उस परियोजना को समाप्त कर दिया है और अब मैं उस मुद्दे पर काम नहीं कर रहा हूं; हालांकि, इस तरह की चीज हर कुछ वर्षों में सतह पर आती है, इसलिए मैं अगले चारों ओर जाने के लिए इसे ध्यान में रखूंगा। धन्यवाद, टीएफएफ। – elbillaf

2

इसी तरह, मैं एक शैल कमांड के साथ खोले गए पीडीएफ दस्तावेज़ पर एपएक्टिवेट का उपयोग करने की कोशिश कर रहा था ताकि मैं उस पर सेंडकेस का उपयोग कर सकूं। यह हमेशा रन टाइम त्रुटि '5' उत्पन्न करेगा। मेरा समाधान, अंततः AppActivate का उपयोग नहीं करना था, वास्तव में दस्तावेज़ खोलने से इसे सबसे आगे लाया जाता है। समस्या यह है कि SendKeys कथन शेल कमांड के तुरंत बाद निष्पादित करता है लेकिन पीडीएफ को खोलने के लिए दूसरे या दो की आवश्यकता होती है। मेरा समाधान प्रेषक कथन को उत्तेजित करने से पहले दो सेकंड के लिए कोड को रोकना है।

मैंने पटल फ़्लम्प के समय देरी कर्टोजी का उपयोग किया। यहाँ धागा की जाँच करें: http://www.dbforums.com/microsoft-access/1219379-time-delay-vba.html

+0

जो मेरे लिए काम किया। मैंने एक समय देरी का उपयोग किया जैसे: एप्लीकेशन। अभी प्रतीक्षा करें + टाइमवैल्यू ("00: 00: 2") – Selrac

2

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

Sub SavePDFasText() 
Dim AdobeReaderPath As String 
Dim PdfFilePath As String 
Dim PDFid, NotepdId As Double 

AdobeReaderPath = "C:\Program Files\Adobe\Reader 10.0\Reader\AcroRd32.exe" 
PdfFilePath = "D:\PowerGenMacro\opm_11.pdf" 
PDFid = Shell(AdobeReaderPath & " " & PdfFilePath, vbNormalFocus) 
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 5) 
'Alt+f+a+x is required to save the pdf as text in the adobe reader 
SendKeys "%(FAX)", True 
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 2) 
SendKeys "%S", True 
SendKeys "^q", True 

End Sub 
0

खिड़कियों स्विच करने के लिए SendKeys "% {टैब}" प्रयास करें लेकिन तब केवल 2 सक्रिय विंडो रहते हैं।

या को केवल प्रेषक {टैब} के बाद सक्रिय करें ताकि स्विच एंट्री बॉक्स स्विचबीजी विंडोज सेमीडी से पहले नहीं चुना जा सके।

या कोशिश appactivate खिड़की नाम का प्रयास, 1 तो 2000 डिग्री सो

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