2011-01-12 94 views
6

Tôi muốn chuyển đổi qua lại giữa ứng dụng với lệnh shell trong VBA. Tôi đang sử dụng SendKeys để thực hiện các công việc trong tiến trình A rồi chuyển sang tiến trình B, rồi xử lý A rồi xử lý B. Nó hoạt động tốt cho lần lặp đầu tiên. Khi tôi sử dụng AppActivate để quay trở lại quá trình B, nó thực sự chuyển tiêu điểm trở lại quá trình B. BAO GIỜ, nó bỏ qua các lệnh tiếp theo từ SendKeys.Sử dụng lệnh AppActivate và Sendkeys trong lệnh shell VBA

đang

Ví dụ:

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 

Trả lời

2

Điều này có thể nhiều hơn một bình luận hơn là một câu trả lời, nhưng tôi dường như không được phép "bình luận", vì vậy ...

Thật ngạc nhiên là bạn đã đi xa như bạn đã làm. Rất có thể, bạn sẽ không bao giờ có thể thực hiện công việc này một cách đáng tin cậy - thời gian. Ngay sau khi bạn làm cho nó hoạt động, một cái gì đó sẽ thay đổi về cách giao diện người dùng Acrobat trong bản phát hành trong tương lai, hoặc Windows sẽ thay đổi các quy tắc cho những thứ có thể gửi sự kiện đến những thứ khác. .

Những gì bạn có thể gặp phải trong trường hợp này là Windows đang cố gắng ngăn ứng dụng lấy cắp tiêu điểm từ người khác khi người dùng dường như bận rộn tương tác với người đầu tiên. Bạn thấy cùng một loại vấn đề cố gắng làm những việc như có một nút trong một ứng dụng ghi dữ liệu vào một tệp tạm thời và mở MS Word để chỉnh sửa nó. Windows ngăn không cho tiêu điểm chuyển từ ứng dụng hiện tại sang MS Word vì bạn chỉ cần nhấp vào nút trong ứng dụng hiện tại. Vì vậy, thay vì cố gắng giải quyết vấn đề kỹ thuật không thể này, chúng ta hãy lùi lại một bước và hỏi bạn ban đầu hy vọng đạt được điều gì bằng cách thực hiện tất cả những điều này. Bằng cách đó, có lẽ, chúng tôi có thể đưa bạn đến nơi bạn đang cố gắng đi :)

+0

Những gì tôi có một bó (hơn 1000) của file PDF có văn bản mà tôi muốn là phân tích cú pháp. Một số văn bản có dạng tự do và không sử dụng được. Các phần khác của văn bản được định dạng gần như nhất quán và tôi có thể nhận được thông tin đó và đưa nó vào cơ sở dữ liệu (bảng tính excel) để phân tích sau này. Sau khi dữ liệu được đưa vào một tệp văn bản, tôi phân tích cú pháp thông qua tập lệnh perl để lấy nội dung tôi muốn và tạo CSV. Đây là một cách sucky để làm điều này - vì những lý do bạn đưa ra, cũng bởi vì nó là thẩm mỹ xấu xí và nó dường như không hoạt động nhất quán trong mọi trường hợp. – elbillaf

+0

Phương pháp chung hoạt động nếu pdf chỉ là một trang, nhưng đối với nhiều trang, acrobat chỉ chọn một trang trên^A (từ các phím gửi) vì vậy tôi phải đi qua lại - điều này có vẻ không hoạt động. Tôi đã có thể giải quyết vấn đề này cho nhiệm vụ hiện tại của mình, nhưng tôi muốn một phương pháp chung để giải quyết loại vấn đề này để các phương pháp trong tương lai sẽ không gây khó chịu. – elbillaf

+1

Bạn có thể sử dụng một cái gì đó như http://www.pdf2txt.com/ thay vì cố gắng để tự động hoá Acrobat GUI? –

3

Tôi biết câu hỏi này cũ, nhưng tôi đã gặp phải vấn đề tương tự, nhưng tôi không nghĩ câu trả lời đã được chọn là đúng.

Khi bạn gọi AppActivate, tập lệnh sẽ dừng lại, chờ ứng dụng đích kết thúc. Sau khi ứng dụng được chấm dứt, kịch bản tiếp tục. Tôi không thấy giải pháp cho vấn đề này.

EDIT:

tôi sử dụng một batch file để gọi cscript cho lệnh AppActivate, và tôi nhận thấy bạn đang sử dụng đúng một tập tin VBS. Hãy thử gọi số CMD làm cửa sổ mới và vượt qua CSCRIPT //NoLogo //B WScript.CreateObject("WSCript.shell").AppActivate("Window Name") làm đối số và xem điều đó có bỏ qua vấn đề không.

+0

Tôi đã hoàn thành dự án đó và không còn làm việc vấn đề đó; Tuy nhiên, loại điều này bề mặt vài năm một lần, vì vậy tôi sẽ ghi nhớ điều này trong lần tiếp theo. cảm ơn, tff. – elbillaf

2

Tương tự như vậy, tôi đã cố gắng sử dụng AppActivate trên tài liệu pdf tôi đã mở bằng lệnh shell để tôi có thể sử dụng SendKeys trên đó. Nó sẽ luôn tạo ra lỗi thời gian chạy '5'. Giải pháp của tôi, cuối cùng là không sử dụng AppActivate ở tất cả, trong thực tế mở tài liệu mang đến cho nó đứng đầu anyway. Vấn đề là câu lệnh SendKeys thực hiện ngay sau lệnh shell nhưng pdf cần một hoặc hai giây để mở ra. Giải pháp của tôi là tạm dừng mã trong vài giây trước khi giải thích câu lệnh sendkeys.

Tôi đã sử dụng độ trễ thời gian trì hoãn của bướu cổ. Hãy xem chủ đề tại đây: http://www.dbforums.com/microsoft-access/1219379-time-delay-vba.html

+0

làm việc cho tôi. Tôi đã sử dụng thời gian trễ như: Application.Wait Now + TimeValue ("00: 00: 2") – Selrac

2

Sau nhiều giờ nghiên cứu trên các diễn đàn khác nhau, tôi có thể không sử dụng được các đối tượng thư viện Adobe và chức năng với Adobe Reader. Tùy chọn khả thi duy nhất còn lại là sử dụng lệnh Shell để sử dụng tùy chọn "lưu dưới dạng văn bản" có sẵn trong trình đơn tệp của Adobe Reader.Các phím tắt là Alt + f + một + x + s. Tôi đã thực hiện những điều này trong mã bên dưới hoạt động hoàn hảo, mặc dù tôi đã được yêu cầu chèn chậm trễ trong một số bước.

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

Hãy thử SendKeys "% {tab}" để chuyển đổi cửa sổ nhưng sau đó giữ chỉ có 2 cửa sổ hoạt động.

hoặc thử chỉ hoạt động sau khi gửi {Tab} để hộp nhập văn bản không được chọn trước khi chuyển cửa sổ cmd.

hoặc thử thử tên cửa sổ appactivate, 1 sau đó ngủ 2000 ° để có thời gian để đưa cửa sổ đó vào tập trung

Các vấn đề liên quan