Problème d'itération

Résolu
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014 - Modifié par sokpassy85 le 24/11/2014 à 20:50
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014 - 25 nov. 2014 à 11:42
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


--
A voir également:

4 réponses

jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
Modifié par jordane45 le 25/11/2014 à 02:55
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
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
25 nov. 2014 à 09:00
Bonjour Jordane,

Merci pour votre aide.
C'est ce je constatais la boucle faisait du surplace. J'ai approté les modifications et j'ai ce message d'erreur: "'Erreur d'exécution 9': L'indice n'appartient à la séléction'" au second passage sur la ligne de code:

Do While Cells(arTemp(Z) + 1, "C").Font.Bold = False

Je pense y'a erreur ailleurs dans la boucle do while mais je n'arrive à comprendre.

Je vous remercie d'avance.
0
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
25 nov. 2014 à 09:14
Dans ton for ...
essaye avec X=0 to ubound (arTemp)-1
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014 > jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
Modifié par sokpassy85 le 25/11/2014 à 09:32
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

0
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344 > sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
25 nov. 2014 à 09:33
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..^^ ) ?
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014 > jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
Modifié par sokpassy85 le 25/11/2014 à 09:49
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 25/11/2014 à 10:47
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
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
25 nov. 2014 à 11:11
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.
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
Modifié par sokpassy85 le 25/11/2014 à 11:13
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 nov. 2014 à 11:18
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

0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
25 nov. 2014 à 11:27
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.
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
25 nov. 2014 à 11:34
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!
0
jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344 > sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
25 nov. 2014 à 11:37
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
0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
25 nov. 2014 à 11:41
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

0
sokpassy85 Messages postés 64 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 25 novembre 2014
25 nov. 2014 à 11:42
Oui Jordane avec un grand plaisir.

Merciii encore!
0
Rejoignez-nous