2012-07-25 25 views
7

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

  1. क्या आईई विंडो पर फ़ोकस वापस लाने का एक आसान तरीका है?
  2. मैन्युअल रूप से इसे क्लिक किए बिना शॉर्टकट की प्रतिलिपि कैसे बनाते हैं?

कोड:

Sub Macro1() 
' 
Dim ie As Object 
Set ie = CreateObject("internetexplorer.application") 

ie.Visible = True 
ie.navigate "****url****" 

While ie.busy 
    DoEvents 
Wend 

ie.document.getElementById("SSOID").Value = "Z19516732" 
ie.document.getElementById("Advanced").Checked = False 
ie.document.all("Search").Click 

'this loop is to slow the macro as the java form is filled from the search 
For i = 1 To 400000000 
    i = i + 1 
Next i 

'ie.Object.Activate 
ie.document.getElementById("Advanced").Checked = False 
ie.document.getElementById("SSOID").Focus 
Application.SendKeys "{TAB 6}" ', True 

'bring up the control menu/right click 
Application.SendKeys "+{F10}" 

'copy shortcut is 8 items down on the list 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 
Application.SendKeys "{DOWN}" 

'enter was not working so the shortcut for the menu is 't' 
'SendKeys "{ENTER}" 
Application.SendKeys "{t}" 

Windows("Book21").Activate 
Range("A1").Select 
ActiveSheet.Paste 

End Sub 

उत्तर

6

अपने मॉड्यूल की शुरुआत में, कोड की इस पंक्ति में कहें:

Public Declare Function SetForegroundWindow Lib "user32" (ByVal HWND As Long) As Long 

यह एक Declare Statement कहा जाता है और आप SetForegroundWindow समारोह का उपयोग करने की अनुमति देगा कि विंडोज में बनाया गया है। यह फ़ंक्शन विंडोज सिस्टम के user32 डीएलएल में रहता है। वास्तव में कई डीएलएल के बीच कई अन्य कार्य हैं जो इस तरह से वीबीए के लिए सुलभ हैं (अधिक उदाहरणों के लिए लिंक देखें)।

अपने कोड में, अपने IE वस्तु के साथ बातचीत करते हुए, तो जैसे रिकॉर्ड HWND (उस खिड़की को handle):,

Dim HWNDSrc As Long 
HWNDSrc = ie.HWND 

फिर बाद आप जावा साथ सहभागिता की है, इस जारी रखने के लिए उपयोग करें:

SetForegroundWindow HWNDSrc 

यह (के रूप में नाम का तात्पर्य) खिड़की अग्रभूमि विंडो के रूप में HWND द्वारा की पहचान स्थापित करने के लिए विंडोज सिस्टम बताता है।

हालांकि, यह आवश्यक नहीं हो सकता है कि आप आईई के साथ कैसे बातचीत कर रहे हैं। दूसरे शब्दों में, यदि आपको विंडो को देखने/स्पर्श करने की आवश्यकता नहीं है, तो आप अभी भी ऑब्जेक्ट का उपयोग करके बातचीत कर सकते हैं जैसा आपके पास पहले से है।

तरीके शॉर्टकट आप GetElementById() और GetElementsByTagName() (see here for more info) जैसे कोड का उपयोग कर के लिए देख रहे मिल रहे हैं, लेकिन यह कैसे स्रोत बनाया गया था पर निर्भर करेगा। जैसे यदि आप HTML स्रोत जानते हैं तो <a href="...> लिंक खींचने के लिए अपेक्षाकृत आसान होना चाहिए।


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

Public Sub WaitForIE(myIEwindow As InternetExplorer, HWND As Long, WaitTime As Integer) 

    ' Add pauses/waits so that window action can actually 
    ' begin AND finish before trying to read from myIEWindow. 

    ' myIEWindow is the IE object currently in use 
    ' HWND is the HWND for myIEWindow 
    ' The above two variables are both used for redundancy/failsafe purposes. 
    ' WaitTime is the amount of time (in seconds) to wait at each step below. 
    ' This is variablized because some pages are known to take longer than 
    ' others to load, and some pages with frames may be partially loaded, 
    ' which can incorrectly return an READYSTATE_COMPLETE status, etc. 

    Dim OpenIETitle As SHDocVw.InternetExplorer 

    Application.Wait DateAdd("s", WaitTime, Now()) 

    Do Until myIEwindow.ReadyState = READYSTATE_COMPLETE 
     ' Wait until IE is done loading page and/or user actions are done. 
    Loop 

    Application.Wait DateAdd("s", WaitTime, Now()) 

    While myIEwindow.Busy 
     DoEvents ' Wait until IE is done loading page and/or user actions are done. 
    Wend 

    On Error Resume Next 
    ' Make sure our window still exists and was not closed for some reason... 
    For Each OpenIETitle In objShellWindows 
     If OpenIETitle.HWND = HWND Then 
      If Err.Number = 0 Then 
       Set myIEwindow = OpenIETitle 
       Exit For 
      Else 
       Err.Clear 
      End If 
     End If 
    Next OpenIETitle 
    On Error GoTo 0 

End Sub 
+0

मैंने कोशिश की कि पहले ForegroundgroundWindow, लेकिन इस बार यह काम किया, धन्यवाद! एचटीएमएल स्रोत हालांकि आवश्यक लिंक दिखाता नहीं है। हालांकि लिंक मुझे स्पष्ट रूप से जारी नहीं करता है। मुझे पाठ (प्रबंधक का नाम) चाहिए, लेकिन मैं इसे दायाँ क्लिक से कॉपी नहीं कर सकता। शायद पाठ को हाइलाइट करने का एक आसान तरीका है? मैं बस लिंक कॉपी और पेस्ट करने की योजना बना रहा था, फिर एचटी लिंक फॉर्म से नाम साफ करने के लिए कुछ त्वरित लाइनें करें। – orangehairbandit

+1

धन्यवाद गाफी!खिड़की के साथ वह पहला हिस्सा कमाल की तरह काम पर केंद्रित है। जैसे मैंने कहा कि मैंने पहले कोशिश की थी, लेकिन आपके पास जादू का स्पर्श होना चाहिए था। मेरे प्रश्न के दूसरे भाग के रूप में, शॉर्टकट बनाएं, मुझे मेरी गलती मिली। किसी भी कारण से, "फोकस" मैं खोज कंपेनेंट के लिए उपयोग कर रहा था, बस बस ध्यान केंद्रित कर रहा था लेकिन चयन नहीं कर रहा था। तो जब मैंने इसे ".select" पर स्विच किया और hte sendkeys को application.sendkeys "~" (एंटर कुंजी) के साथ निर्दिष्ट किया, तो यह सब एक साथ आए! मेरे पहले समय स्टैकफ्लो पर उपयोगकर्ता के रूप में सिर्फ एक पाठक नहीं है और यह बहुत बीमार बुरा है! धन्यवाद! – orangehairbandit

+0

@orangehairbandit Glad मैं मदद कर सकता था! – Gaffi