Boucle While dans boucle While

Bonjour à tous,

Depuis quelques temps maintenant, j'essaye de me perfectionner en VBA. Aussi, régulièrement dans le cadre de mes projets au travail, j'essaye au plus possible de faire du VBA. Lorsque je rencontre un point de difficulté, en général en farfouillant sur internet j'arrive à trouver une solution. Mais voilà, aujourd'hui internet me fait défaut. Bon en vrai je pense que le vrai problème n'est pas internet mais plutôt la chose qu'il y a entre le PC et la chaise de bureau ^^. Je ne parviens pas à trouver les termes qui expliquerai en quelques mots mon problème. Du coup, je n'arrive pas à chercher bien ^^.

Fin bref, tout ça pour dire : les amis je m'en remets à votre gentillesse et bienveillance pour aider une pauvre aire comme moi. ^^.

Voici mon problème :

J'ai un fichier Excel avec 3 feuilles (2 seront utile ici).

Ce fichier me sert à organiser tout un plan de tests. Pour faire simple :

J’ai des pièces qui doivent être testées. Ces pièces sont donc assemblées puis testées.

Il existe une multitude d’assemblage de pièces différentes: Ces assemblages sont appelés dans mon fichier « Groupe » (en réel j’ai 396 groupes – pour simplifier j’ai réduit ici à 7 groupes ^^.

Chaque groupe subit donc ensuite une série de test. Cependant, tous les groupes ne subissent pas les mêmes testes et pas forcément dans le même ordre. Dans mon fichier, l’ordre des tests est définit par « sub-group ». Et le test en lui-même est nommé dans « test »

  • feuille 1 = "Tout"

Dans cette feuille, on retrouve toute les informations. Chaque ligne correspond à 1 test pour 1config.

segaeffa
  • feuille 2 = "Plan de test_DVP"

Dans cette feuille, chaque ligne correspond à une config seulement. Et l’idée est que dans cette ligne, on puisse voir l’ordre des essais pour cette config.

Je m’explique en colonne B il y a le N° de groupe (= « N° du plan de test »).

Les colonnes G à Q correspondent chacune à un essai. L’idée est que pour chaque configuration (groupe), je puisse voir dans la cellule sous chaque test si la config doit avoir ce test et à quel moment faire ce test (en position a, b, c, ...)

dtusdysh

Du coup , le code que j’ai fait doit normalement remplir les lettres a, b, c, … dans le tableau de la feuille « plan de test_DVP ». Le souci est là. Quand je lance mon module ( lié à un bouton), il ne se passe rien. Et je ne sais pas du tout pourquoi ☹. voici le code :

Sub MàJ()
Deb_lign_plan = 28
Deb_Col_plan = 7
Deb_lign_tout = 13

While Sheets("Plan de test_DVP").Cells(Deb_lign_plan, 2) = Sheets("Tout").Cells(Deb_lign_tout, 1)
While Sheets("plan de test_DVP").Cells(27, Deb_Col_plan).Value <> Sheets("Tout").Cells(Deb_lign_tout, 5)
Deb_Col_plan = Deb_Col_plan + 1
Wend
Sheets("plan de test_DVP").Cells(28, Deb_Col_plan).Value = Sheets("Tout").Cells(Deb_lign_tout, 2)
Deb_lign_tout = Deb_lign_tout + 1
Wend
Deb_lign_plan = Deb_lign_plan + 1
End Sub

Voila, j'espère sincèrement que vous pourrais m'aider. Je vous souhaite à tous un bon appétit et une bonne journée.

cdt.

Salut Gwladouch,

à l'aveugle malgré tes jolies photos...
Si ça foire,... envoie ton fichier... puisque tu l'as fait !!

Sub MàJ()
'
Dim sWkDVP As Worksheet, rCel As Range, iRow%, iRowT%
'
Set sWkDVP = Worksheets("Plan de test_DVP")
'
With Worksheets("Tout")
    For x = 13 To .Range("A" & Rows.Count).End(xlUp).Row
        iRow = .Columns(1).Find(what:=.Range("A" & x).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlPrevious).Row
        iRowT = sWkDVP.Columns(2).Find(what:=.Range("A" & x).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row
        For y = x To iRow
            Set rCel = sWkDVP.Rows(27).Find(what:=.Range("E" & y).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext)
            If Not rCel Is Nothing Then Cells(iRowT, rCel.Column) = IIf(Cells(iRowT, rCel.Column) <> "", " / ", "") & Right(.Range("D" & y).Value, 1)
        Next
        x = iRow
    Next
End With
'
End Sub


A+

Pouha lala mais quel nouille ^^. J'étais sûre d'avoir mis le fichier Excel.

Merci Curulis57 pour le temps que tu as octroyé à mon "pitit" problème.

Du coup, pour corriger ma bêtise ^^, vous pouvez trouver ci-joint mon fichier Excel avec dans VBA en commentaire mon ancienne ligne de code et en normal ta ligne de code Curulis57.

Malheureusement, lorsque je mets ton code une erreur apparait sur une de tes lignes.

erreur

Et la chance n'étant pas de mon coté ( ou plutôt mon ignorance étant bien présente ^^) je ne comprends la ligne.

kkkkk

J'ai mis mes commentaires sur ton code pour que tu puisses voir ce que j'ai compris ^^.

Je continue à essayer de trouver une solution ( et comprendre les lignes ^^). En espérant qu'à plusieurs esprits nous trouvions une solution.

13kiwi.xlsm (73.22 Ko)
cdt.
Gwlad

Salut Gwladouch,

comme quoi, à l'aveugle, pas facile avec notre petit cerveau humain...
J'ai déplacé le code vers le module VBA de 'Plan de test_DVP' et supprimé 'Module 2'.
La macro démarre sur un double-clic sur la feuille 'Plan de test_DVP'

EDIT : au fait, combien de lignes de tests à lire y a-t-il d'habitude ? Si c'est trop long, il faudra passer par des tableaux... À toi de dire!

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim rCel As Range, iRow%, iRowT%
'
Cancel = True
Application.ScreenUpdating = False
'
With Worksheets("Tout") 'Avec la feuille "tout"
    For x = 13 To .Range("A" & Rows.Count).End(xlUp).Row 'pour x= 13 jusqu'à la dernière ligne remplie
        iRow = .Columns(1).Find(what:=Format(.Range("A" & x).Value, "000"), lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlPrevious).Row 'cherche la dernière ligne de même code en [A:A]
        iRowT = Columns(2).Find(what:=Format(.Range("A" & x).Value, "000"), lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row 'cherche la ligne correspondante dans 'Plan de test DVP'
        Cells(iRowT, 7).Resize(1, 11).Value = ""    'effacement des anciennes valeurs
        For y = x To iRow   'lecture des tests dans 'Tout'
            Set rCel = Rows(27).Find(what:=.Range("E" & y).Value, lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext)   'cherche la colonne du test
            If Not rCel Is Nothing Then _
                Cells(iRowT, rCel.Column) = IIf(Cells(iRowT, rCel.Column) <> "", Cells(iRowT, rCel.Column) & " / ", "") & Right(.Range("D" & y).Value, 1)   'écriture
        Next
        x = iRow    'mise à jour de x pour continuer la boucle
    Next
End With
'
Application.ScreenUpdating = True
'
End Sub
22kiwi.xlsm (72.42 Ko)


A+

Salut Curulis,

Tu es trop fort. Je te remercie pour ton aide.

Et merci pour les commentaires de cette façon je comprends et donc j'apprends ^^.

Pour répondre à ta question effectivement, j'ai beaucoup de lignes en vrai ^^. Dans l'onglet "tout", les lignes d'information vont de 13 à 1218 .

Par contre, quand tu dis "il faut passer par des tableaux", je t'avoue que je ne comprends pas trop .^^

cdt.

Gwladouch

Réaliser ces calculs par "tableaux" revient à faire les calculs en RAM (mémoire vive de l'ordi) donc quasi instantanément...

- Combien de fois par jour dois-tu faire ces calculs ?
- Combien de secondes faut-il pour réaliser la MÀJ avec mon code quand 'Tout' est plein à ras-bord ?


A+

Haaa ok.

Ba je devrais le faire une fois par mois. Après s'il doit mettre 10min à faire le calcul. Une fois par moi sa ne me dérange pas trop. J'irai prendre un café ^^.

Mais en réalité le café sera pour plus tard car je viens de le tester sur mon fichier et sa marche nickel. II cherche environs 1min ce qui est suffisamment rapide pour moi mais trop rapide pour prendre un café ^^.

Par contre, tu m'intrigues je ne savais pas que l'on pouvait aller sur la mémoire vive directement. Après 'j’imagine que c'est plus risqué si on fait une bêtise.

Tu serais où je peux trouver des explications sur ce type codage par hasard?

Quoi qu'il en soit, outre ma curiosité qui me pousse à vouloir continuer cette conversation pour comprendre comment fonctionne le codage sur RAM je crois que je n'ai d'autre choix de que de cliquer sur "problème résolu". Grace à toi, j'ai appris et n'ai pas fait perdre de temps à ma boite^^.

Encore mille merci. Peut être qu'un jour j'aurais assez de pratiques et de connaissances je pourrais te rendre l'appareil. Qui sait, ne dit-on pas l'élève peut dépasser le maître.

Du coup, Maître merci pour le temps que tu m'a accordé et tes explications.

Cdt.

Gwladouch.

Oh, doucement, on ne programme pas directement la RAM : on utilise des variables-tableau.
Pour imager, on saisit dans cette variable-tableau une Range de valeurs et, au lieu de travailler sur la feuille, par affichages successifs très chronophages, on réalise d'abord les calculs "en mémoire" et ensuite, on affiche en une fois les résultats.

Je te fais ça dans la foulée...
Seul souci de taille : tu n'auras plus le temps de même seulement penser à un café ! C'est bête, hein ?


A+

Huum je comprends

Du coups, le calcul est noté une fois et il fait tout d'un coup.

C'est bien ça. Du coup, tu gagnes en temps.

Rala mais le café est tellement sacré. Ba je vais enregistrer une vidéo quand un programme Excel tourne sur disons 15 min. Comme ça je pourrais lancer la vidéo pour prendre un café et faire croire que ça tourne mouhahaha

A+

Rien de sorcier dans un tableau!
En gros, c'est une grille de valeurs correspondant au Range que tu as "capté" et à laquelle tu donnes un nom.
Ici, tTab ("t" = "t"ableau : une habitude de préfixer mes variables) = le tableau Tab(leau) : difficile, hein ?
tExtract est, quasi toujours, le nom que je donne au tableau des résultats (Extraction de données).

Un tableau range ses valeurs comme Excel : par lignes et colonnes (bon, pas toujours, mais, une chose à la fois...)
La seule "magie" est de comprendre que, même si tu captures, par ex. tTab = [B7:E18], tTab(1,1) sera égal à [B7], c-à-d, la première cellule de la Range capturée.
C'est la seule gymnastique à intégrer dans nos pauvres esprits humains.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tTab, tExtract
'
Cancel = True
Application.ScreenUpdating = False
'
tTab = Worksheets("Tout").Range("A13:E" & Worksheets("Tout").Range("A" & Rows.Count).End(xlUp).Row).Value   ' = tableau de 'Tout'
Range("G28:Q" & Range("B" & Rows.Count).End(xlUp).Row).Value = ""           'effacement du détail des tests précédents...
tExtract = Range("B27:Q" & Range("B" & Rows.Count).End(xlUp).Row).Value     '...histoire d'affecter un tableau vierge à tExtract
'
For x = 1 To UBound(tTab, 1)                'lecture des données de tTab
    For y = 6 To UBound(tExtract, 2)        'recherche du libellé du test dans tExtract et écriture
        If tTab(x, 5) = tExtract(1, y) Then _
            tExtract(CInt(tTab(x, 1)) + 1, y) = _
                IIf(tExtract(CInt(tTab(x, 1)) + 1, y) <> "", tExtract(CInt(tTab(x, 1)) + 1, y) & " / ", "") & Right(tTab(x, 4), 1)
    Next
Next
Range("B27").Resize(UBound(tExtract, 1), UBound(tExtract, 2)).Value = tExtract      'affichage de tExtract après calculs
'
Application.ScreenUpdating = True
'
End Sub

- donc, ici, je capte 'Tout' [A13:Exx] dans tTab : pas besoin de plus puisque l'intitulé du test se trouve en colonne [E:E] ;
- dans 'Plan de test_DVP', j'efface d'abord d'anciens résultats dans [G28:Qxx] ;
- puis je place dans tExtract [B27:Qxx] l'ensemble du Range, donc tExtract(1,1)= " N°du plan de test" ;
- pourquoi [B27] et pas [B28] ? Parce que, ainsi, j'ai à ma disposition, "en mémoire", les intitulés des tests en ligne 27 ;
- UBound(tTab, 1) = limite supérieure du nombre de lignes d'un tableau ;
- UBound(tExtract, 2) = limite supérieure du nombre de colonnes d'un tableau ;
- la boucle x lit tTab, ligne par ligne ;
- la boucle y compare tTab(x,1) = Range("A" & x).value avec tExtract(1-ère ligne, la 27-, index de 6 à 16 = colonnes G à Q) pour trouver le bon test ;
- une chose à savoir : les données d'un tableau sont des Variant, c-à-d, qu'elles acceptent tous types de données ;
- donc, quand il s'agit de faire, par ex. des opérations mathématiques entre valeurs de tableau, il vaut mieux, crois-moi, les convertir au mieux. Ici, histoire de tomber sur le bon index de tExtract, je convertis tTab(x,1) en Cint(tTab(x,1)) = en Integer (nombre entier) ;
- écriture dans tExtract. Tu peux lire : tExtract(CInt(tTab(x, 1)) + 1, y ): pourquoi ?
- parce que la ligne 1 de tExtract est la ligne des intitulés des tests. Le plan de test 001 commence donc en fait en tExtract(1 + 1,...) = en 2e ligne de tExtract.

Quand je te parle de gymnastique...

La seule obligation, dans ce code (mais on peut tout adapter), est la certitude d'avoir des n° de test chronologiques !!!!!!! 001, 002, 003, 004... Si tel n'est pas TOUJOURS le cas, il faudra adapter...

Espérant avoir pu être un brin pédagogue...

15kiwi.xlsm (71.42 Ko)


A+

curulis57,

Tu es trop fort. C'est trop bien. j'essaye de comprendre plus en détail tout ce que tu m'as écris. ^^

j'ai pas trop le temps la aujoud'hui de prendre 1h pour bien tout comprendre. ^^

Mais je regarderai dimanche a tête reposée. En tout cas, franchement t vraiment gentil de m'aider à apprendre et comprendre.^^

MILLE MILLIARD ET MILLION de merci ^^.

Rechercher des sujets similaires à "boucle while"