2012-07-25 28 views
7

Oluşturduğum makrosu bir Excel elektronik tablosundan isimler alıyor, Internet Explorer'ı açar ve çevrimiçi dizini arar. Dizini aradıktan sonra, yöneticinin adıyla bir Java formu oluşturur. Yönetici ismini manuel olarak işaretleyebilirim, sağ tıkla, kısayolu kopyala ve daha sonra formata geri gönderebiliyorum. Ancak, tutarlı sekme ve kısayolu kopyalama ile ilgili sorunlar yaşıyorum.Internet explorer ile VBA etkileşimi

  1. Odağı IE penceresine geri getirmenin basit bir yolu var mı?
  2. Manuel olarak tıklatmadan kısayolu nasıl kopyalarız?

Kodu:

sizin modülün başında
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 

cevap

6

, bu kod satırı koyun: Bu Declare Statement denir ve SetForegroundWindow işleve erişmek sağlayacak

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

o Windows yerleşiktir. Bu işlev, Windows sisteminin user32 DLL dosyasında bulunur. Aslında bu şekilde VBA için erişilebilir olan birden fazla DLL arasında başka bir dizi işlev vardır (daha fazla örnek için bağlantıya bakın). Kodunuzda

, IE nesne ile etkileşimde bulunurken, şöyle HWND (şu pencereye handle) kayıt:

Dim HWNDSrc As Long 
HWNDSrc = ie.HWND 

Ardından, Java ile etkileşim sonra, bu devam etmek kullanın:

SetForegroundWindow HWNDSrc 

Bu, Windows sisteminin HWND tarafından tanımlanan pencereyi ön plan penceresi olarak (adından da anlaşılacağı gibi) ayarlamasını söyler. Ancak, IE ile nasıl etkileşim kurduğunuza bağlı olarak, bu gerekli olmayabilir. Başka bir deyişle, pencereyi görmeniz/ona dokunmanız gerekmiyorsa, hala kodunuzda olduğu gibi nesneyi kullanarak etkileşimde bulunabilirsiniz.

GetElementById() ve GetElementsByTagName() (see here for more info) gibi kodları kullanarak aradığınız kısayolu elde etmenin yolları vardır, ancak kaynağın nasıl oluşturulduğuna bağlı olacaktır. Örneğin. HTML kaynağını biliyorsanız, bir <a href="...> bağlantısının çekilmesi nispeten kolay olmalıdır.

Kodunuzu ikinci kez inceledikten sonra, makroyu yavaşlatmak için bir döngü kullandığınızı farkettim. Benim her zaman benzer yöntemler için kullandığım bir işleve sahibim. Umarım bu, ihtiyacınız olanı yapmanıza yardımcı olur. Kodumu kendi orijinalimden değiştirdim, çünkü davanızda geçerli olmayan ek özelliklerim vardı. Eğer herhangi bir hata varsa, gerektiği gibi ayarlayabilirim.

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

Bu setForegroundWindow'u denedim, ancak bu sefer işe yaradı, Teşekkürler! Ancak html kaynağı, gereken bağlantıyı göstermiyor. Bağlantıya ihtiyacım olan şey tam olarak değil. Metne ihtiyacım var (Yöneticinin adı), ancak sağ tıklama ile kopyalayamıyorum. Belki de metni vurgulamanın basit bir yolu var mı? Bağlantıyı kopyalayıp yapıştırmayı planlıyorum ve daha sonra hte link formunun ismini temizlemek için bazı hızlı çizgiler çiziyorum. – orangehairbandit

+1

Teşekkürler Gaffi!Pencere odaklama ile ilk bölüm müthiş gibi çalışır. Daha önce denediğimi söylediğim gibi, ama sihirli dokunuşa sahip olmalısın. Sorumluluğun ikinci kısmı olarak, kısayol oluşturdum, hatamı buldum. Her ne sebeple olursa olsun, arama kompostu için kullandığım ".Focus" sadece odaklanıp seçmiyordu. Bu yüzden ".select" olarak değiştirdiğimde ve bir application.sendkeys "~" (Enter tuşu) ile belirtilen hte sendkeys, hepsi bir araya geldi! Benim ilk kez burada bir kullanıcı olarak sadece bir okuyucu ve onun güzel hasta kötü bir yığın olarak! Teşekkürler! – orangehairbandit

+0

@orangehairbandit Glad Yardım edebilirim! – Gaffi

İlgili konular