Boucle VBA macro Excel

Résolu/Fermé
LeLutin68 Messages postés 12 Date d'inscription mercredi 15 avril 2015 Statut Membre Dernière intervention 16 février 2022 - 15 févr. 2022 à 17:40
 Lelutin68 - 16 févr. 2022 à 19:30
Bonjour :)

Je vous contacte car je suis novice en Macro et je souhaiterai un coup de main pour finaliser un code.

L'objectif est de copier pour chaque lignes des données présentes dans un onglet (dans 4 colonnes) puis de les coller (en l'occurence sur SAP... ) pour une référence (Material number) puis passer à la suivante ...


Material number Plant Planned price 3 date
3104486 1100 0,01 01.01.2022
3104487 1100 0,01 01.01.2022
....

Code qui fonctionne pour la première ligne et que je souhaiterai répéter jusqu'à la fin (Material number)

Sub ma8cro()

Set SapGuiAuto = GetObject("SAPGUI")
Set objGui = SapGuiAuto.GetScriptingEngine
Set objConn = objGui.Children(0)
Set session = objConn.Children(0)

session.FindById("wnd[0]").Maximize
session.FindById("wnd[0]/tbar[0]/okcd").Text = "/NMM02"
session.FindById("wnd[0]").SendVKey 0

session.FindById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = Range("A2")
session.FindById("wnd[0]/usr/ctxtRMMG1-MATNR").CaretPosition = 7
session.FindById("wnd[0]").SendVKey 0

session.FindById("wnd[1]/usr/ctxtRMMG1-WERKS").Text = Range("B2")
session.FindById("wnd[1]/usr/ctxtRMMG1-WERKS").CaretPosition = 4
session.FindById("wnd[1]").SendVKey 0

session.FindById("xxx").Text = Range("C2")
session.FindById("xxx").Text = Range("D2")

session.FindById("xxx").SetFocus
session.FindById("xxx").CaretPosition = 10
session.FindById("wnd[0]").SendVKey 0
session.FindById("wnd[1]/usr/btnSPOP-OPTION1").Press


End Sub



Merci infiniment pour votre aide :)

Alex le lutin









Configuration: Windows / Chrome 98.0.4758.82
A voir également:

3 réponses

yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480
15 févr. 2022 à 19:59
bonjour,
il serait préférable que tu utilises les balises de code auqnd tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
je crois deviner que tu veux exécuter plusieurs fois un groupe d'instructions (quel groupe?) en faisant varier le numéro de la ligne (deux pour le moment).
est-ce correct?
quand la boucle devrait-elle s'arreter?
le xxx me semble un peu mystérieux.
0
Bonjour

Merci pour la réponse,

J'aimerai répéter ce code pour les lignes suivantes, en l'occurrence remplacer les valeurs A2, B2, C2, D2 par les valeurs des lignes suivantes, A3, B3, C3, D3.. Ainsi de suite, je ne sais pas si je suis clair.. J'ai en fait 3000 lignes pour lesquels j'aimerai exécuter ce code.

J'ai remplacé un long texte et remplacé par xxxx dans le code, mais cela reste échangé.

Les variables sont les cellules des colonnes A à D :)

Je suis vraiment novice :(


Merci

Alex
0
yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480
Modifié le 15 févr. 2022 à 20:33
Si c'est un nombre précis de lignes, cela peut de faire ainsi (non testé):
dim nlig as long
for nlig = 2 to 3001
    ' insérer ici tout le code à répéter
    ' au lieu de Range("B2"), mettre Cells(nlig,"B")
next nlig

Souvent, au lieu d'un nombre de lignes connu à l'avance, on souhaite s'arreter en fonction de ce que contient la dernière ligne. Cela peut se programmer aussi.
0
LeLutin68 Messages postés 12 Date d'inscription mercredi 15 avril 2015 Statut Membre Dernière intervention 16 février 2022 > yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024
16 févr. 2022 à 08:02
Bonjour :)
Ca fonctionne ! merci beaucoup pour l'aide :)

Ci dessous le code fonctionnel :


Sub macro()



Set SapGuiAuto = GetObject("SAPGUI")
Set objGui = SapGuiAuto.GetScriptingEngine
Set objConn = objGui.Children(0)
Set session = objConn.Children(0)


'Insert your SAP Script here


session.FindById("wnd[0]").Maximize
session.FindById("wnd[0]/tbar[0]/okcd").Text = "/NMM02"
session.FindById("wnd[0]").SendVKey 0

Dim nlig As Long
For nlig = 2 To 3

session.FindById("wnd[0]/usr/ctxtRMMG1-MATNR").Text = Cells(nlig, "A")
session.FindById("wnd[0]/usr/ctxtRMMG1-MATNR").CaretPosition = 7
session.FindById("wnd[0]").SendVKey 0

session.FindById("wnd[1]/usr/ctxtRMMG1-WERKS").Text = Cells(nlig, "B")
session.FindById("wnd[1]/usr/ctxtRMMG1-WERKS").CaretPosition = 4
session.FindById("wnd[1]").SendVKey 0

session.FindById("wnd[0]/usr/tabsTABSPR1/tabpSP27/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2952/txtMBEW-ZPLP3").Text = Cells(nlig, "C")
session.FindById("wnd[0]/usr/tabsTABSPR1/tabpSP27/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2952/ctxtMBEW-ZPLD3").Text = Cells(nlig, "D")
session.FindById("wnd[0]/usr/tabsTABSPR1/tabpSP27/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2952/ctxtMBEW-ZPLD3").SetFocus
session.FindById("wnd[0]/usr/tabsTABSPR1/tabpSP27/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2952/ctxtMBEW-ZPLD3").CaretPosition = 10
session.FindById("wnd[0]").SendVKey 0
session.FindById("wnd[1]/usr/btnSPOP-OPTION1").Press

Next nlig


End Sub
0
LeLutin68 Messages postés 12 Date d'inscription mercredi 15 avril 2015 Statut Membre Dernière intervention 16 février 2022 > yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024
16 févr. 2022 à 08:15
ReBonjour yg_be

J'en profite si je peux me permettre; pour perfectionner la Macro ;
"for nlig = 2 to 3001"

Comment faire pour pouvoir remplacer "3001" par la dernière ligne avec des cellules non vides ? :)

Pourrais tu m'aider ?

Merci beaucoup

Alex le lutin
0
LeLutin68 Messages postés 12 Date d'inscription mercredi 15 avril 2015 Statut Membre Dernière intervention 16 février 2022 > LeLutin68 Messages postés 12 Date d'inscription mercredi 15 avril 2015 Statut Membre Dernière intervention 16 février 2022
16 févr. 2022 à 11:15
Trouvé :)

Solution :

for nlig = 2 to Columns("A:A").Find("*", Range("A1"), , , xlByRows, xlPrevious).Row
0
yg_be Messages postés 22764 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 7 mai 2024 1 480 > LeLutin68 Messages postés 12 Date d'inscription mercredi 15 avril 2015 Statut Membre Dernière intervention 16 février 2022
16 févr. 2022 à 15:51
Il est aussi possible, au lieu d'un
for
, d'utiliser un
do
, et de tester une condition d'arrêt.
https://docs.microsoft.com/fr-fr/dotnet/visual-basic/language-reference/statements/do-loop-statement
0
Merci je vais tester ça :)
0