Problème d'itération [Résolu]

Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
Bonjour,

Depuis jeudi, je suis bloqué sur une macro.
Je m'explique, je souhaiterai que ma macro concatène les cellules en dessous d'une cellule en gras et la copie dans une autre cellule d'une autre colonne (pas de problème à ce niveau).

Au fait, la variable ne s'incrémente pas, du coup elle concatène à l'infini la première cellule rencontrée.

A mon avis, le problème vient de la boucle, j'ai beau modifié mais hélas. S'il vous plait, j'ai besoin de votre aide.
Je vous remercie d'avance.

Ci dessous le code en question


For X = 1 To UBound(arTemp)

Debug.Print "-------> trouvé Ligne : " & arTemp(X)
' * Ici mettre le code pour la concaténation
If Cells(arTemp(X), "C").Value = ValCherchee Then
Cells(arTemp(X), "C").Font.Bold = True
Do While Cells(arTemp(X) + 1, "C").Font.Bold = False
If Cells(arTemp(X) + 1, "C").Font.Bold = False Then
concat = concat & "," & Chr(10) & Cells(arTemp(X) + 1, "C").Value
Cells(ligneCell, "B").Value = Right(concat, Len(concat) - 1)
Cells(ligneCell, "B").Select
Else
End If
Loop
X = X + 1
End If

Next


--
Afficher la suite 

Votre réponse

4 réponses

Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
0
Merci
Bonsoir,

Tu fais une boucle FOR / NEXT...
Pourquoi ajoutes tu un X = X+1 ... c'est ta boucle qui le gère tout seul !!


Par contre.. ton DO WHILE.. lui ne risque pas de s'incrémenter...
X ... à une valeur définie lorsque tu rentres dedans..mais après.. tu ne l'augmente plus...

Il faut que tu ajoutes une seconde variable...

Je n'ai pas regardé ton code en détail (ni même cherché à l'analyser...) mais avec un rapide coup d'oeil je peux déjà te proposer :

 For X = 1 To UBound(arTemp)
       Debug.Print "-------> trouvé Ligne : " & arTemp(X)
       ' * Ici mettre le code pour la concaténation
       If Cells(arTemp(X), "C").Value = ValCherchee Then
          Cells(arTemp(X), "C").Font.Bold = True
          Z = X
          Do While Cells(arTemp(Z) + 1, "C").Font.Bold = False
              concat = concat & "," & Chr(10) & Cells(arTemp(Z) + 1, "C").Value
              Cells(ligneCell, "B").Value = Right(concat, Len(concat) - 1)
              Cells(ligneCell, "B").Select
              Z = Z + 1
         Loop
     End If
 Next





Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
> jordane45
Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
-
J'obtien l'erreur 13: "Incompatibilité de type".
Au fait je pense que c'est l'arTemp() qui pose problème, sa valeur reste figer donc la variable associée (Z) ne pourra pas s'incrémenter. Est il possible de faire incrémenter l'arTemp()?

Ci dessous le code total

Sub Conc()
'------------------------------------------------------
' Tableau contenant la liste des lignes trouvées
' par la méthode findAll()
'------------------------------------------------------
Dim arTemp() As String
'------------------------------------------------------
' Autres variables :
'------------------------------------------------------
Dim nomF As String
Dim n As Integer
nomF = "CODE_DTR"
Dim PlageRecherche As String
PlageRecherche = "C2:C30000"
Dim MaRange As Range
Set MaRange = Range("A2:A30000")
Dim concat As String
Dim Z As Integer

'------------------------------------------------------
' Début du traitement :
'------------------------------------------------------
'On parcourt la colonne A
For Each cell In MaRange
ValCherchee = cell.Value
ligneCell = cell.Row
concat = ""
If ValCherchee <> "" Then
'---------------------------------------------------------------
bFound = FindAll(ValCherchee, Sheets(nomF), PlageRecherche, arTemp())
'---------------------------------------------------------------
Debug.Print "Ligne: " & ligneCell & " : " & ValCherchee & " ---> " & bFound
If bFound = True Then
Debug.Print "Nb occurences : " & UBound(arTemp)

For X = 1 To UBound(arTemp)

Debug.Print "-------> trouvé Ligne : " & arTemp(X)
' * Ici mettre le code pour la concaténation
If Cells(arTemp(X), "C").Value = ValCherchee Then
Cells(arTemp(X), "C").Font.Bold = True
Z = X
Cells(arTemp(Z), "C").Select
Do While Cells(arTemp(Z) + 1, "C").Font.Bold = False
concat = concat & "," & Chr(10) & Cells(arTemp(Z) + 1, "C").Value
Cells(ligneCell, "B").Value = Right(concat, Len(concat) - 1)
Cells(ligneCell, "B").Select
Z = Z + 1
Loop
End If

Next

End If

End If
Next
End Sub

jordane45
Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
> sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
C'est bien
For X = 1 To UBound(arTemp)

Qu'il faut laisser.


sa valeur reste figer donc la variable associée (Z) ne pourra pas s'incrémenter.

Hein ?????

- Que vaut Z au moment du crash ?
- Que vaut UBound(arTemp) ?
- Que vaut X au moment du crash ?
- Que contient ton tableau arTemp (issue je suppose d'un FINDALL..^^ ) ?
sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
> jordane45
Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
-
Rectification
- Que vaut Z au moment du crash : 2 mais Z=Z+1 = faux
- Que vaut UBound(arTemp) : 1
- Que vaut X au moment du crash : 1
- Que contient ton tableau arTemp (issue je suppose d'un FINDALL..^^ ) : L'indice n'appartient pas à la sélection oui il est issu d'un FINDALL.
sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
Pourquoi Z = Z + 1 est égal à Faux?
Je ne comprend pas pourquoi?
jordane45
Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
-
Z = 2 Au moment du crash.. alors que ton Ubound est égale à 1 ... donc oui... arTemp(2) n'existe pas... d'où l'erreur !
Là il faut revoir la logique du code...

Il faudrait que tu rédiges une sorte de pseudo algorithmie .. sur ce que tu souhaites faire... (sous forme textuelle)..
Par exemple :
1 - Je cherche toutes les cellules qui contiennent xxxx
2 - Pour chacune de ces cellules... je fait ZZZZZZ
- Si une cellule contient "tata"... alors je fais.... "titi" ...


Une fois que tu auras réussi à écrire ce que tu souhaites faire.. ça sera plus simple de coder.
Commenter la réponse de jordane45
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
Tout cela me parait bien enchevêtré, à ce point enchevêtré que je ne parviens même pas à en deviner le but exact.
Je vais me contenter de répondre à ta dernière question, à savoir :
Pourquoi Z = Z + 1 est égal à Faux?
Je ne comprend pas pourquoi?

Faux ne peut être affiché que si tu as demandé un affichage du type de z (un opérateur de comparaison tel que =, <>, >, <, or, xor, etc ...= ) z +1 et non de l'affichage de z + 1

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
Bonjour ucfoutu,

Au fait, je cherche à faire incrémenter une variable dans une boucle Do while. Le premier passage se passe sans problème mais lors du deuxième de passage, Z = Z + 1 vaux Faux et je ne comprend pas pourquoi. Mais comme vous l'avez remarqué mon sujet n'est pas bien rédigé d'ou je tourne en rond depuis logntemps.

Du coup sur demande de Jordane, j'ai rédigé un algoritheme pour clarifier le problème. J'espère que je serai mieux compris.

Merci encore une fois du temps passé sur le sujet.
Commenter la réponse de ucfoutu
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
0
Merci
Ok Jordane et merci encore pour le temps passer sur mon sujet:

J'ai un tableau de 3 colonnes
Colonne A contient des références
Colonne C contient aussi ces même références et sont en gras et en dessous cellule en gras, on a une ou plusieurs cellules coresspondant à des codes DTR (non en gras) que je souhaite concaténer dans la colonne B.

Soit en algoritheme:

Chercher B11-PAV (celulle A2) dans C
Si B11-PAV est trouvé dans C,
Alors B11-PAV est en gras
On concaténe les cellules en dessous de B11-PAV dans la celulle B2,
Si on rencontre une cellule en gras dans C,
On arrête de concaténer
On recommance la recherche avec la valeur de A3 et ainsi de suite.
Commenter la réponse de sokpassy85
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Il me semble t'avoir répondu en ce qui concerne ce "faux" ...
Fais cette petite expérience (tu vas vite comprendre) :
Dim z As Integer
z = 2
MsgBox z + 1 ' affichera bien 3
MsgBox z = z + 1 ' affichera faux car z ne saurait être égal à z + 1

sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
Ok j'ai compris,
Par ce que ubound est égal à 1 donc impossible d'aller au delà dou le m'essage d'erreur numéro '9'.

Comment faire donc pour résoudre ce problème?

Merci d'avance.
sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
C'est bon, j'ai trouvé en posant Z = arTemp(X).

Merci Jordane, Merci ucfoutu. Grâce à vous je peux maintenant dormir tranquille, finit les cauchemards. ouffff

Merciii encore et encore!
jordane45
Messages postés
23650
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 décembre 2018
> sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
Si la question est résolue..
Merci de ne pas oublier de clôturer le sujet
(en cliquant sur le lien "Marquer comme résolu" qui se trouve sous le titre de la question)

Cordialement,
Jordane
sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
Ci dessous le code entier ça peut être utile à d'autres.

Function FindAll(ByVal sText As String, ByRef oSht As Worksheet, ByRef sRange As String, ByRef arMatches() As String) As Boolean
' --------------------------------------------------------------------------------------------------------------
' FindAll - To find all instances of the1 given string and return the row numbers.
' If there are not any matches the function will return false
' --------------------------------------------------------------------------------------------------------------
On Error GoTo Err_Trap
Dim rFnd As Range ' Range Object
Dim iArr As Integer ' Counter for Array
Dim rFirstAddress ' Address of the First Find
' -----------------
' Clear the Array
' -----------------
Erase arMatches
Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)

If Not rFnd Is Nothing Then
rFirstAddress = rFnd.Address
Do Until rFnd Is Nothing
iArr = iArr + 1
ReDim Preserve arMatches(iArr)
arMatches(iArr) = rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligne
Set rFnd = oSht.Range(sRange).FindNext(rFnd)
If rFnd.Address = rFirstAddress Then Exit Do ' Do not allow wrapped search
Loop
FindAll = True
Else
' ----------------------
' No Value is Found
' ----------------------
FindAll = False
End If
' -----------------------
' Error Handling
' -----------------------
Err_Trap:
If Err <> 0 Then
MsgBox Err.Number & " " & Err.Description, vbInformation, "Find All"
Err.Clear
FindAll = False
Exit Function
End If
End Function
Sub Conc()
'------------------------------------------------------
' Tableau contenant la liste des lignes trouvées
' par la méthode findAll()
'------------------------------------------------------
Dim arTemp() As String
'------------------------------------------------------
' Autres variables :
'------------------------------------------------------
Dim nomF As String
Dim n As Integer
nomF = "CODE_DTR"
Dim PlageRecherche As String
PlageRecherche = "C2:C30000"
Dim MaRange As Range
Set MaRange = Range("A2:A30000")
Dim concat As String
Dim Z As Integer
'Dim cellulleCourante As Integer

'------------------------------------------------------
' Début du traitement :
'------------------------------------------------------
'On parcourt la colonne A
For Each cell In MaRange
ValCherchee = cell.Value
ligneCell = cell.Row
concat = ""
If ValCherchee <> "" Then
'---------------------------------------------------------------
bFound = FindAll(ValCherchee, Sheets(nomF), PlageRecherche, arTemp())
'---------------------------------------------------------------
Debug.Print "Ligne: " & ligneCell & " : " & ValCherchee & " ---> " & bFound
If bFound = True Then
Debug.Print "Nb occurences : " & UBound(arTemp)

For X = 1 To UBound(arTemp)

Debug.Print "-------> trouvé Ligne : " & arTemp(X)
' * Ici mettre le code pour la concaténation
If Cells(arTemp(X), "C").Value = ValCherchee Then
Z = arTemp(X)
Cells(Z, "C").Font.Bold = True
Cells(Z, "C").Select
'Do While celCourante.Value.Font.Bold = False
Do While Cells(Z + 1, "C").Font.Bold = False
concat = concat & "," & Chr(10) & Cells(Z + 1, "C").Value
Cells(ligneCell, "B").Value = Right(concat, Len(concat) - 1)
Cells(ligneCell, "B").Select
Z = Z + 1
Loop
End If

Next

End If

End If
Next
End Sub
Sub test()
Dim Z As Integer
Y = 2
MsgBox Y + 1 ' affichera bien 3
MsgBox Y = Y + 1 ' affichera faux car z ne saurait être égal à z + 1
End Sub

sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Dernière intervention
25 novembre 2014
-
Oui Jordane avec un grand plaisir.

Merciii encore!
Commenter la réponse de ucfoutu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.