Kezdőoldal » Számítástechnika » Programok » VB Script miért nem fut...

VB Script miért nem fut korrektül?

Figyelt kérdés
Egy excel makró kezdi a folyamatot,majd ez elindít a windows explorerrel egy vbs-t,ablakot is vált (általában itt szokott hibázni) ami végül elindít egy SAP vbs-t.A probléma az,hogy nagyon gyakran elveszti a fonalat a progi. Lehet ezt valahogy fixálni,hogy ne csak minden 3,4-ik futás legyen hibátlan ,hanem mind ?

2015. aug. 13. 00:35
1 2
 1/11 coopper ***** válasza:

Szia.


Az ablakváltásra két módszer van elvileg :


1. a szabályos (ami nem müködik - legalábbis nállam) :


Set WshShell = WScript.CreateObject("WScript.Shell")

.

.

.

Rem Elvileg ez aktiválná az ablakot, de nállam nem müködött, nem jött fel az ablak

WshShell.AppActivate "Ablak cimsora".


2. ALT+TAB küldése az abléakoknak ez szokott müködni :


Set WshShell = WScript.CreateObject("WScript.Shell")

.

.

.

Rem ALT+TAB küldése, hogy az ablak aktiválódjon

WshShell.sendkeys "%{TAB}"



Illetve gondot okozhat még az is, hogy nem várja meg a script, hogy az ablak activálódjon (időzités) ezt esetlegesen késleltetésekkel meg lehet kerülni, mindkét esetben 1 másodperces várakozás az ablak aktiválása után :


WshShell.AppActivate "Ablak cimsora".

wscript.sleep 1000


illetve :


WshShell.sendkeys "%{TAB}"

wscript.sleep 1000



Sok sikert

Üdv.

2015. aug. 13. 06:50
Hasznos számodra ez a válasz?
 2/11 SimkoL ***** válasza:
coopper nagyon jól látod a probléma gyökerét. Amikor 'töményen' fut egy program nem érdekli, hogy más is szeretne valamit csinálni vagy ha csinál is nem vesz róla tudomást. Erre találták ki - nem tudom más nyelvekben - ez Delphi - hogy hívják - az Application.ProcessMessages-t. Talán jól mutatja ez [link] is, hogy pár sleep és Application.Procesmessages csodát tud művelni.
2015. aug. 13. 08:22
Hasznos számodra ez a válasz?
 3/11 A kérdező kommentje:

Köszönöm a gyors válaszokat. A lassítást kipróbálom,beírom az ablakváltós részekhez.

Ez a módszer működik a váltáshoz:

Option Explicit

Dim WshShell

Set wshShell = CreateObject("WScript.Shell")

wshShell.AppActivate("ablak neve")

2015. aug. 14. 00:57
 4/11 A kérdező kommentje:
Beírtam az ablakváltásokhoz a "sleep" -et. A script komótosabb lett,de más nem változott. Ugyanúgy elveszti a fonalat,amikor a VBA-nak át kell váltani VBS-re (excell ablak átvált SAP ablakra)
2015. aug. 14. 23:50
 5/11 coopper ***** válasza:

Szia.


Továbbra is azon az állásponton vagyok, hogy nem jó az ablakváltás.


Amit irtál kipróbáltam a következő scriptel :


Option Explicit

Dim objShell

Dim Ciklus

Set objShell = CreateObject("WScript.Shell")

Ciklus=true

While Ciklus

_ _If (objShell.AppActivate("Jegyzettömb") = False) Then

_ _ _ _objShell.AppActivate "Jegyzettömb"

_ _else

_ _ _ _Ciklus=false

_ _End If

Wend


Nos a fenti kód, csak abban az esetben aktiválja a Jegyzettömböt, ha előtte a jegyzettümb aktiv volt, és úgy lett inaktiv, hogy "mellé" kattintottam. Ha a "kis méretre állitás" gombot használtam abban az esetben a csak lent villogott a tálcán és nem jött fel a képernyőre.


Kipróbáltam az ALT+TAB-os módszert annak pediglen az a hátránya, hogy nem tudod igazából hány ALT+TAB-ot kell küldeni, hogy pontosan az az ablak aktiválódjon amit szeretnél.


Próbáld mással !


Én pl. az ilyen automatizálási folymatokat Macro Expres-vel szoktam megoldani. (Mivel ebben van olyan funkció, hogy "Run/Activate and Wait") de próbálhatod más programmal is google keresés : Windows Automation Tool : [link]


Sok sikert.

Üdv.

2015. aug. 15. 08:16
Hasznos számodra ez a válasz?
 6/11 A kérdező kommentje:
Ezt munkahelyen használom. Az a baj,hogy nem engedélyezett akármilyen program telepítése. Így elég szűkös a keret,ezzel kell bírkóznom.
2015. aug. 15. 15:02
 7/11 SimkoL ***** válasza:
Talán még akkor az user32.dll-ből 'berántani a FindWindowA és a SendMessageA függvényeket és azokat használni. Annyira nem ismerem a VBS 'belső' működését, valószínű hogy ezekre támaszkodik csak kicsit megvariálta a felhasználó kedvéért. Egy próbát megérne. Nem nagyon vagyok itthon, hogy elszórakozzam vele, de itt [link] van mintaszerűség rá.
2015. aug. 17. 07:26
Hasznos számodra ez a válasz?
 8/11 A kérdező kommentje:

uhh,ez nekem "kínai".

Variáltam kicsit,az eredmény : futtatom a scriptet-tökéletes. Futtatom újra,erre ablakváltáskor hibázik (vagy nem vált át és marad az excel táblázat,vagy átvált és ott egyből ront) És érdekesség, ha hiba után visszamegyek a kezdő állapotra,és újra futtatom,akkor megint korrektül végigmegy. Következőnél megint hiba,visszaállítom, újra tökéletes.

2015. aug. 17. 21:19
 9/11 A kérdező kommentje:

Találtam egy ilyen magyarázatot.Nektek ez talán többet mond:

Here is the script running showing hwnd, PID, and window title (and error code). Note how when script


starts there is no active window for about two seconds (windows is waiting for your program to create


one for it to make active. It only waits 2 seconds). Usually at program starts, but also other times, for


short periods there will be no active window. You must trap this. Here's a script that does.

On error resume next

Set wso=CreateObject("WindowScriptingObject")

Do

x = wso.ActiveWindow

wscript.echo x


wscript.echo wso.windowtext(x)


wscript.echo (err.number)

err.clear

wscript.echo wso.windowpid(x)


wscript.echo (err.number)

err.clear

wscript.sleep 1000

Loop

2015. aug. 17. 21:34
 10/11 coopper ***** válasza:

Szia.


SimkoL a következőre gondolt (szerintem, de ez csak VBA-ban müködik, VBS-ben nen - legalábbis nállam nem megy): [link]


Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long


Igy fel tudnád használni a Showwindow funkciót arra, hogy aktiváld a megfelelő ablakot.


De ha ezen a vonalon elindulunk akkor semmi más nem kell a dologhoz, mint egy "külső" showwindows program (tehát semmi más dolgod nincs mint irni valamilyen programozási nyelven egy ilyen showwindows programot.


Összegoogliztam egy ilyen programot és Delphiben megirtam (használd belátásod szerint) : [link]


Innen letölthető az Exe van benne meg a forrás : [link] (Nagyképüen a program neve : FAAW - FAAW.EXE-t és a FAAW.DPR-t (mint forrás fájlt) tartalmazza a zip fálj - konzolos a program)


Itt a virustotal analizis a FAAW.EXE-re : [link]


Használata : FAAW.EXE Ablak cimsora

Használható az ablak név darabja is. pl. Jegyzettömb helyett Jegyzet


De azért figyelj a következőre, egy példával illusztrálom :


Set Shell = CreateObject("WScript.Shell")

Shell.Exec("calc")

Shell.Exec("FAAW.exe Jegyzet")


Ez a Script Elinditja a Számológépet és aztán aktiválja a Jegyzettömböt (Természetesen csak akkor, ha a jegyzettömb el van inditva).


Mit vár az ember a fenti scriptől ?


Azt, hogy indditsa el a számológépet és aztán aktiválja a jegyzettömböt. Erre mi lesz az eredmény ?


Igaz, ugyan, hogy a script elinditja a számológépet, és aktiválja (legalábbis felhozza a Jegyzettömböt), de attól függetlenűl a Számológép lesz az Aktiv ablak. (???)


Ahhoz hogy ez ne igy legyen nállam be kellet rakni a scripbe egy kis késleltetést :


Set Shell = CreateObject("WScript.Shell")

Shell.Exec("calc")

WScript.Sleep 250

Shell.Exec("FAAW.exe Jegyzet")


Igy már úgy müködik ahogyan elvárnánk a scriptől, tehát Számológép elindul, a jegyzettömb pedig aktiválódik és az is lesz az aktiv ablak.


(A késleltetés valószinűleg gép függő, tehát nem biztos hogy minden gépen elég a 250 miliszekundomos késleltetés - a régebbi, lassabb gépeken biztosan több késleltetés kell)


Sok sikert.

üdv.

2015. aug. 18. 07:04
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!