-
Fototrend
A Microsoft Excel topic célja segítséget kérni és nyújtani Excellel kapcsolatos problémákra.
Kérdés felvetése előtt olvasd el, ha még nem tetted.
Új hozzászólás Aktív témák
-
Mutt
senior tag
válasz
dm1970
#52644
üzenetére
Szia,
Van programozási tapasztalatod (For - Next ciklus)?
Én MM/FI modulokban dolgozom, onnan tudok példát mutatni.
Egy komplex változat fent van a GitHub-on.
Illetve YT-on Varga Csongor videói is tudnak segíteni.Mielőtt tovább megyünk, pár tanács!
1. Óvatosan a szkriptekkel, mert nagy kárt tudsz okozni!
2. Ha nincs teszt környezeted, ahol tudod ellenőrízni a szkriptet, akkor nagyon legyél körültekintő.
3. A SAP bonyolult, a SAP szkript mégrosszabb. Előbb kérdezz vkit.
4. Használd a Scripting Trackert (letölthető innen), hogy kiderítsd melyik mező miről szól.Itt egy Móricka példa. MM02-es tranzakcióval a 93062409-es anyagnak a material group-ját LEDG101-re írtam át. A script ez lett:
If Not IsObject(application) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.Children(0)
End If
If Not IsObject(session) Then
Set session = connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "mm02"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "93062409" 'ez az anyagszám
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").caretPosition = 8
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").text = "LEDG101" 'ennek a mezőnek az értékét akarom módosítani vmire
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").setFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").caretPosition = 7
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[0]").sendVKey 0A példámban a szkriptet szeretném lefuttatni másik anyagszámokon (19-es sor) és akár más értéket megadni (24-es sor)
1. Excelben egy lapon megadom hogy mely anyagoknak milyen új értéket akarok megadni
pl.
2. Kell egy For - Next ciklus ami ezen végigmegy.
VBA Editorban egy új modulban ez például az A-oszlopban lévő értéket kiírja.Sub minta()
With ActiveSheet
lastrow = .Range("A" & Rows.Count).End(xlUp).Row
For c = 2 To lastrow
Debug.Print .Range("A" & c)
Next c
End With
End Sub3. Most már csak a SAP scriptet kell ide tenni. Az első 14 sor a SAP-hoz kapcsolódást csinálja, ezt elég egyszer megtenni. Vagyis ez a For-Next elé kerül. A többi lépés pedig bele a For-Next-be.
Annyi javítás kell, hogy az "Application" Excelben már foglalt, így más kell helyette használni pl. "SAPApplication".4. Nekem két változó értékem van az A és B-oszlopban, amit szeretném ha a szkript használna.
A lenti sornak a végén a fix anyagszám helyett kell nekem az A-oszlop értéke.session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "93062409"A helyes kód a fenti helyett ez lesz:
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = .Range("A" & c)A
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").text = "LEDG101"sor helyett pedig ezsession.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").Text = .Range("B" & c)5. Érdemes egy visszajelzést is adni, hogy melyik sorban járunk és ha kell akkor meg is tudjuk szakítani a futtatást. Ezért a "Next c" elé kerüljön be ez.
DoEvents
.Range("C" & c) = "Kész"6. Rakj ki egy gombot és rendeld hozzá a makrót. Érdemes tesztelni 1-2 kombináción, ha van teszt environment akkor azon, ha nincs akkor a mentést sort kommenteld ki először.
A teljes minta kód:
Sub minta()
If Not IsObject(SAPApplication) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set SAPApplication = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = SAPApplication.Children(0)
End If
If Not IsObject(session) Then
Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject SAPApplication, "on"
End If
With ActiveSheet
lastrow = .Range("A" & Rows.Count).End(xlUp).Row
For c = 2 To lastrow
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "mm02"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = .Range("A" & c)
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").caretPosition = 8
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").Text = .Range("B" & c)
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").SetFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP01/ssubTABFRA1:SAPLMGMM:2004/subSUB2:SAPLMGD1:2001/ctxtMARA-MATKL").caretPosition = 7
session.findById("wnd[0]/tbar[0]/btn[11]").press
session.findById("wnd[0]").sendVKey 0
DoEvents
.Range("C" & c) = "Kész"
Next c
End With
End SubEzzel készen is vagy, de azért sok mindent lehet rajta fejleszteni mint például
- vannak felesleges sorok (általában a caretPosition-osok ilyenek)
- nincs semmilyen hibaellenőrzés (pl. nincs jogosultságod vmihez, nem jó érték van az inputban)
- nem annyira jó az első kliens első sessionjéhez csatlakozni, lehet hogy éppen másra használod.Ha kell segítség akkor dobd fel ide/keress meg.
üdv
Új hozzászólás Aktív témák
- EAFC 26
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Genshin Impact (PC, PS4, Android, iOS)
- Lexus, Toyota topik
- A fociról könnyedén, egy baráti társaságban
- Villanyszerelés
- sziku69: Fűzzük össze a szavakat :)
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- Disney+
- VGA kibeszélő offtopik
- További aktív témák...
- Samsung Galaxy S23 Plus / 8/256GB / Kártyafüggetlen / 12 Hó Garancia
- ÁRGARANCIA!Épített KomPhone Ryzen 5 7500F 32/64GB RAM RX 7800 XT 16GB GAMER PC termékbeszámítással
- Telefon felvásárlás!! Apple iPhone 16, Apple iPhone 16e, Apple iPhone 16 Plus, Apple iPhone 16 Pro
- Új Lenovo E14 Thinkpad WUXGA IPS Ryzen7 7730U 16GB 512GB SSD Radeon RX Vega8 Win11 Pro Garancia
- Bomba ár! Lenovo ThinkPad L520 - i3-2GEN I 4GB I 160GB I DVDRW I 15,6" HD I Cam I W10 I Garancia!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: NetGo.hu Kft.
Város: Gödöllő

Fferi50
