Problème de Loop conditionnelle

azertym

XLDnaute Nouveau
Bonjour tout le monde,

Je rencontre un petit problème avec une macro que je suis entrain de réaliser pour permettre la communication entre Excel et JDE (un simulateur AS/400 d'IBM).

J'ai écris cette macro :

Code:
Private Sub OK_Click()


'===============================================================================================
'================================ Déclaration des variables ====================================
'===============================================================================================

'Login
Dim Utilisateur As String
Dim MotDePasse As String

Utilisateur = User.Text
MotDePasse = Mdp.Text

'Paramétrage du presse papier
Dim MyData As DataObject
Set MyData = New DataObject
Dim N_Article As String

'Incrémentation de la nomenclature excel
Dim i As Integer

'===============================================================================================
'================================ Authentification TN52/JDE ====================================
'===============================================================================================

        If Utilisateur = "User" And MotDePasse = "Password" Then
        
            Unload Me 'Fermeture de la fenêtre login (UserForm1)
         
            Shell ("Y:\Base\Fichiers Macro\TN5250J.bat") 'Lancement de TN5250j
            Application.Wait (Now + TimeValue("0:00:06")) 'Temps de pause 6s
            
            UsrCMD = "" & User & "{TAB}" 'Rappel de la saisie User
            SendKeys UsrCMD 'Importer la saisie dans JDE
            Application.Wait (Now + TimeValue("0:00:02")) 'Temps de pause 2s
            
            PassCMD = "" & Mdp & "{ENTER}" 'Rappel de la saisie Password
            SendKeys PassCMD 'Importer la saisie dans JDE
            Application.Wait (Now + TimeValue("0:00:02")) 'Temps de pause 2s
        
        Else
            Exit Sub
        End If

'===============================================================================================
'================================ Interrogation articles =======================================
'===============================================================================================

            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 02s
            SendKeys ("1"), True 'Article
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys ("2"), True 'Fiche article
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:03")) 'Temps de pause 01s
            SendKeys "i", True 'Interrogation
            
'Séléction des cellules en boucle

            i = 1
        
        Do While Cells(i, 3) <> ""
            i = i + 1
            Cells(i, 3).Copy 'Copie la cellule d'excel dans le presse papier
            SendKeys "^v", True 'Colle la cellule dans le champ code produit de JDE
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "{ENTER}", True
            SendKeys "+{TAB}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^!", True 'Selection du champ n° article (8 caractères)
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^c", True 'Copie du champ numéro article de JDE
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^s", True 'Suppression du champ n° Article
        
            
             
'Vérification du contenu du presse papier
            On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du presse papier.
            N_Article = MyData.GetText(1)
            
        If N_Article <> 0 Then
            Cells(i, 2).Value = "1" 'Presse papier vide = article à créer
            SendKeys "{TAB}", True 'Remise en position sur le code article
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "{TAB}", True 'Remise en position sur le code article
        End If

NotText:
        If Err <> 0 Then 'Permet l'arrêt de la boucle sans erreurs
            Cells(i, 2).Value = "1"
            SendKeys "{TAB}", True
        Else
            Cells(i, 2).Value = ""
            SendKeys "{TAB}", True
        End If
        
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
        Loop

End sub

Le problème c'est que j'aimerai modifier 2 choses, j'ai essayé plusieurs méthode mais soit j'ai des erreurs, soit ca me fait n'importe quoi.

Première question :
Je souhaiterai faire en sorte que ma boucle do while ne copie que les cellules comprise entre 30 999 999 et 32 000 000. Si la cellule n'est pas comprise entre ces 2 valeurs la macro passe a la cellule suivante.

J'ai donc essayé :
Code:
i = 1
        
        Do While Cells(i, 3) <> ""
If Cells(i, 3) > 30999999 or Cells(i, 3) <32000000 Then
            Cells(i, 3).Copy 'Copie la cellule d'excel dans le presse papier
            SendKeys "^v", True 'Colle la cellule dans le champ code produit de JDE
End If

Mais rien ne change, la macro fait exactement comme avant, elle prends en compte toute les cellules.

Deuxième question
J'ai remarqué un problème dans le déroulement de la macro.
Lorsque excel copie un code article d'une cellule dans JDE, si cet article est créé alors JDE affiche un code et le curseur de JDE revient en position initial dans la page (c'est cette partie qui pose problème pour la suite). Je vais donc chercher ce code avec :
Code:
SendKeys "+{TAB}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^!", True 'Selection du champ n° article (8 caractères)
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            SendKeys "^!", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^c", True 'Copie du champ numéro article de JDE
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^s", True 'Suppression du champ n° Article

Puis je le copie et excel analyse le presse papier, si le presse papier contient quelque chose alors il passe a la cellule suivante (ce qui signifie que l'article est déjà créé). Cette opération fonctionne parfaitement.

Le problème c'est si le code article n'est pas créé, tout se décale car le curseur ne revient pas ou il devrait, il reste sur le champ ou je colle le code article (comme quoi il y'a une erreur et que le code article n'existe pas), donc la suite de la macro est complètement foiré.

Je voudrais donc changer mon champ de sélection et ne plus dire si presse papier vide alors mettre un 1 dans excel mais plutôt si presse papier différent de I alors mettre un 1 dans excel.

J'ai essayé de changer ma macro par :
Code:
'Vérification du contenu du presse papier
            On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du presse papier.
            N_Article = MyData.GetText(1)
            
        If N_Article <> "I" Then
            Cells(i, 2).Value = "1" 'Presse papier vide = article à créer
            SendKeys "{TAB}", True 'Remise en position sur le code article
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "{TAB}", True 'Remise en position sur le code article
        End If

NotText:
        If Err <> "I" Then 'Permet l'arrêt de la boucle sans erreurs
            Cells(i, 2).Value = "1"
            SendKeys "{TAB}", True
        Else
            Cells(i, 2).Value = ""
            SendKeys "{TAB}", True
        End If
        
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
        Loop

Mais ca ne marche pas :s.

Si quelqu'un veut bien apporter son aide je lui en serai très reconnaissant !

Merci d'avance.
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Problème de Loop conditionnelle

Bonjour Azertym :),
Pour la première question, ta condition est bien > 30 999 999 ET < 32 000 000 (And), pourquoi utiliser OU (Or) :rolleyes: ?
Pour la deuxième, je déteste utiliser les simulations de touches... Tu ne peux pas attaquer ton BAT en TXT et le traiter ligne par ligne :confused: ?
Bonne suite :cool:
 

azertym

XLDnaute Nouveau
Re : Problème de Loop conditionnelle

Salut JNP,
Désolé pour la faute avec le And et le Or, j'avais bien mis And au début ;). Le problème c'est qu'en fait il ne me copie plus la cellule d'excel quand je fais ceci :
Code:
   i = 1
        Do While Cells(i, 3) <> ""
        If Cells(i, 3) > 30999999 And Cells(i, 3) < 32000000 Then
            Cells(i, 3).Copy 'Copie la cellule d'excel dans le presse papier
            SendKeys "^v", True 'Colle la cellule dans le champ code produit de JDE
        End If

Il me colle ce que j'ai actuellement en presse papier (or la c'était tout le code que j'ai collé plus haut :confused:). Je ne vois pas pourquoi il ne veut plus sélectionner la cellule ....

Concernant ta réponse à la deuxième question je ne vois pas du tout comment faire ça. As tu un exemple que je vois un peu la façon de faire ?
 

JNP

XLDnaute Barbatruc
Re : Problème de Loop conditionnelle

Re :),
Si je disais que je n'aime pas les SendKeys, c'est parce que tu n'es pas sûr d'être sur la bonne fenêtre au bon moment :rolleyes:... Et vu le nombre de SendKeys et de Application.Wait, j'avoue que j'ai du mal à saisir ce que fait exactement ta macro :eek:...
L'idéal serait d'avoir un bout de ton fichier BAT (sans données confidentielles) et de ton Excel, avec avant et après :rolleyes:...
Sur le principe, j'ai cru comprendre que tu modifiais ton fichier BAT en fonction des cellules... Donc si tu utilises
Code:
Dim MyString, MyNumber
Open "FICHTEST" For Input As #1    ' Ouvre le fichier en lecture.
Do While Not EOF(1)    ' Effectue la boucle jusqu'à la fin du fichier.
    Input #1, MyString, MyNumber    ' Lit les données dans deux variables.
    ' Affiche les données dans la fenêtre Exécution.
    Debug.Print MyString, MyNumber
Loop
Close #1    ' Ferme le fichier.
tu vas pouvoir lire ton fichier ligne par ligne, et l'enregistrer dans un autre fichier, ligne par ligne, avec
Code:
Open "FICHTEST" For Output As #1    ' Ouvre le fichier en écriture.
Print #1, "Ceci est un test"    ' Écrit le texte dans le fichier.
Print #1,    ' Insère une ligne vierge dans le fichier.
Print #1, "Zone 1"; Tab ; "Zone 2"    ' Sépare la chaîne en deux.
' Sépare les chaînes de caractères avec des espaces.
Print #1, "Bonjour" ; " " ; "à tous"
Print #1, Spc(5) ; "5 espaces à gauche"    ' Écrit cinq espaces à gauche.
Print #1, Tab(10) ; "Bonjour"    ' Écrit le mot à partir de la colonne 10.

' Affecte les valeurs de type Boolean, Date, Null et Error.
Dim MyBool, MyDate, MyNull, MyError
MyBool = False : MyDate = #February 12, 1969#
MyNull = Null
MyError = CVErr(32767)
' True, False, Null et Error sont traduits en fonction
' des paramètres régionaux de votre système. Les
' littéraux date sont écrits au format de date abrégée standard.
Print #1, MyBool ; " est une valeur booléenne"
Print #1, MyDate ; " est une date"
Print #1, MyNull ; " est une valeur nulle"
Print #1, MyError ; " est une valeur d'erreur"
Close #1    ' Ferme le fichier.
il suffira de supprimer le premier fichier et de renommer le 2ème pour que le tour soit joué :p...
Ces exemples de codes sont tirés de l'aide, mais tu trouveras pas mal d'exemple en cherchant sur le forum :)...
Bon courage :cool:
 

azertym

XLDnaute Nouveau
Re : Problème de Loop conditionnelle

Merci beaucoup de ton aide JNP, le soucis c'est qu'en fait le fichier.bat n'est qu'un simple fichier qui permet l’exécution d'une application java --'. Donc je pense qu'il m'est impossible de dialoguer ainsi entre les 2 logiciels. Sinon c'est vrai que ta méthode est très intéressante, je vais la retenir pour plus tard car je vais sans doute en avoir besoin pour la suite de mon projet :).

En tout cas tu as bien compris le but de la macro. C'est d'aller chercher des données dans excel, les envoyer dans jde, jde renvoi des informations, qu'excel analyse et établi des conclusions.

En fait le but de cette macro c'est de définir les articles qui doivent être créer dans des nouvelles nomenclatures générée sur excel.
Le bureau d'étude doit faire tout ça à la main normalement, des copier coller à tout va alors quand la nomenclature fait plus de 50 articles ils ne sont pas à l'abri d'un oublie ou d'une fausse manipulation et en plus de ça, ça prends énormément de temps.

EDIT : Concernant mon problème de la première question j'avais oublié de mettre i = i + 1

Voici le bon code (même si pour l'instant je n'arrive pas a faire en sorte qu'il passe a la cellule suivante si c'est pas un article 31000000)
Code:
      i = 1
        Do While Cells(i, 3) <> ""
            i = i + 1
        If Cells(i, 3) > 30999999 And Cells(i, 3) < 32000000 Then
            Cells(i, 3).Copy 'Copie la cellule d'excel dans le presse papier
        End If
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Problème de Loop conditionnelle

Re :),
N'utilisant pas JDE, je ne pourrai pas aller beaucoup plus loin :eek:...
Mais en cherchant sur le Net, JDE a l'air d'être construit sur une base Oracle, et Excel sait travailler avec Oracle via une liaison ODBC :p... C'est peut-être par là que tu as le plus de chance de développer proprement :rolleyes:...
Bon courage :cool:
 

azertym

XLDnaute Nouveau
Re : Problème de Loop conditionnelle

Encore une fois pour pas compliqué la chose on utilise pas l'interface direct de JDE mais un autre alternatif qui est TN5250J. C'est exactement la même chose sauf que l'un c'est du oracle et l'autre c'est du java et python ... Et je me retrouve avec celui qui est en java et python ^^. Sinon la communauté de JDE est très active j'aurai pu trouver directement mes réponses, mais hélas non tout est à faire :s.
 

azertym

XLDnaute Nouveau
Re : Problème de Loop conditionnelle

Pour ceux à qui ca pourrait intéresser, j'ai résolu une bonne partie du problème pour la boucle :

Voici le code :
Code:
'Séléction des cellules en boucle

            i = 1
       
        Do While Cells(i, 3) <> ""
            i = i + 1
If Cells(i, 3) > 30999999 And Cells(i, 3) < 32000000 Then
            Cells(i, 3).Copy 'Copie la cellule d'excel dans le presse papier
            SendKeys "^v", True 'Colle la cellule dans le champ code produit de JDE
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "{ENTER}", True
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "^!", True 'Selection du champ n° article (8 caractères)
            SendKeys "^c", True 'Copie du champ numéro article de JDE
     
'Vérification du contenu du presse papier
            On Error GoTo NotText
            MyData.GetFromClipboard 'Recherche du presse papier.
            N_Article = MyData.GetText(1)
            
        If N_Article <> "I" Then
            Cells(i, 2).Value = "1" 'Presse papier vide = article à créer
            SendKeys "{TAB}", True 'Remise en position sur le code article
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "+{TAB}", True 'Remise en position sur le premier caractère code d'action
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "+{TAB}", True 'Mise en position N° Article
            SendKeys "^s", True 'Suppression N°Article
            SendKeys "{TAB}", True 'Remise en position code d'action
            SendKeys "i", True
        End If

NotText:
        If Err <> 0 Then 'Permet l'arrêt de la boucle sans erreurs
            Cells(i, 2).Value = "1"
            SendKeys "{TAB}", True
        Else
            Cells(i, 2).Value = "" 'Presse papier non vide = article déjà créé
            SendKeys "+{TAB}", True 'Remise en position sur le premier caractère code d'action
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
            SendKeys "+{TAB}", True 'Mise en position N° Article
            SendKeys "^s", True 'Suppression N°Article
            SendKeys "{TAB}", True 'Remise en position code d'action
            SendKeys "i", True
        End If
        
            Application.Wait (Now + TimeValue("0:00:01")) 'Temps de pause 01s
        
End If
Loop

Le seul soucis maintenant c'est que je n'arrive pas a exploiter vraiment le presse papier pour détecter si il y'a un I ou non :s
 

Discussions similaires

Réponses
47
Affichages
2 K

Statistiques des forums

Discussions
312 104
Messages
2 085 345
Membres
102 868
dernier inscrit
JJV