Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb pour "boucher les trous" dans une collection ...

4 réponses
Avatar
Alfred WALLACE
Bonjour (re)

voici ce que j'ai :

Sub donnees_de_champ_unique()
Dim Tabentree

' on se positionne quelque part
range("A20").select
ActiveCell.Offset(1, 0).Select ' (on descend d'une cellule pour pas
avoir le titre de la colonne)

'on remplit la "collection Tabentree par toutes les valeurs de cette
colonne
Tabentree =3D Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value


Ok, mon soucis est que, dans cette colonne, j'ai des trous...

Je n'arrive pas =E0 formaliser une boucle qui, lorsqu'elle rencontre un
"trou" (une valeur de tabentr=E9e vide
pour un indice donn=E9) le comble avec la valeur de l'indice pr=E9cedent.


J'imagine un truc comme =E7=E0 :
For II =3D LBound(Tabentree, 1) To UBound(Tabentree, 1) ' on boucle du
premier element au dernier =E9l=E9ment
On Error Resume Next

Si la valeur de tabentree pour l'indice II est vide
copier "la valeur de tabentree =E0 l'indice II -1" dans
"tabentree de l'indice II"
finSI
Next


Voil=E0, je n'arrive pas =E0 l=E9crire, pouvez vous m'aider svp ?

Merci

Jos=E9

4 réponses

Avatar
FdeCourt
Salut,

Une solution :

Sub testde()
Tabentree = Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value
For II = LBound(Tabentree, 1) To UBound(Tabentree, 1)
If Tabentree(II, 1) <> "" Then valeur = Tabentree(II, 1)
If Tabentree(II, 1) = "" Then Tabentree(II, 1) = valeur
Next
Range(Cells(3598, 5), Cells(3598 + UBound(Tabentree, 1) - 1, 5)) =
Tabentree
End Sub





Bonjour (re)

voici ce que j'ai :

Sub donnees_de_champ_unique()
Dim Tabentree

' on se positionne quelque part
range("A20").select
ActiveCell.Offset(1, 0).Select ' (on descend d'une cellule pour pas
avoir le titre de la colonne)

'on remplit la "collection Tabentree par toutes les valeurs de cette
colonne
Tabentree = Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value


Ok, mon soucis est que, dans cette colonne, j'ai des trous...

Je n'arrive pas à formaliser une boucle qui, lorsqu'elle rencontre un
"trou" (une valeur de tabentrée vide
pour un indice donné) le comble avec la valeur de l'indice précedent.


J'imagine un truc comme çà :
For II = LBound(Tabentree, 1) To UBound(Tabentree, 1) ' on boucle du
premier element au dernier élément
On Error Resume Next

Si la valeur de tabentree pour l'indice II est vide
copier "la valeur de tabentree à l'indice II -1" dans
"tabentree de l'indice II"
finSI
Next


Voilà, je n'arrive pas à lécrire, pouvez vous m'aider svp ?

Merci

José


Avatar
Alfred WALLACE
Bonjour FdeCourt,
excuse de ne pas avoir répondu avant.

Pourrais tu simplement m'expliquer la dernière ligne ?
et en particulier le Range ?


Range( Cells(3598, 5) , Cells( 3598 + UBound(Tabentree, 1) - 1 ,
5 ) )

normalement, la fonction cells à les parametre ligne et colonne (?)
cells(ligne, colonne)

si l'on écrivais : [A:A] = Tabentree est-ce ce ne serait pas pareil
?


Merci encore.

José








Salut,

Une solution :

Sub testde()
Tabentree = Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value
For II = LBound(Tabentree, 1) To UBound(Tabentree, 1)
If Tabentree(II, 1) <> "" Then valeur = Tabentree(II, 1)
If Tabentree(II, 1) = "" Then Tabentree(II, 1) = valeur
Next
Range(Cells(3598, 5), Cells(3598 + UBound(Tabentree, 1) - 1, 5)) =
Tabentree
End Sub





Bonjour (re)

voici ce que j'ai :

Sub donnees_de_champ_unique()
Dim Tabentree

' on se positionne quelque part
range("A20").select
ActiveCell.Offset(1, 0).Select ' (on descend d'une cellule pour pas
avoir le titre de la colonne)

'on remplit la "collection Tabentree par toutes les valeurs de cette
colonne
Tabentree = Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value


Ok, mon soucis est que, dans cette colonne, j'ai des trous...

Je n'arrive pas à formaliser une boucle qui, lorsqu'elle rencontre un
"trou" (une valeur de tabentrée vide
pour un indice donné) le comble avec la valeur de l'indice préceden t.


J'imagine un truc comme çà :
For II = LBound(Tabentree, 1) To UBound(Tabentree, 1) ' on boucle du
premier element au dernier élément
On Error Resume Next

Si la valeur de tabentree pour l'indice II est vide
copier "la valeur de tabentree à l'indice II -1" dans
"tabentree de l'indice II"
finSI
Next


Voilà, je n'arrive pas à lécrire, pouvez vous m'aider svp ?

Merci

José




Avatar
FdeCourt
Excuse moi, mais cette dernière ligne me permettait juste de vérifier
que j'enregistrais correctement les valeurs dans la matrice.

Tu n'as pas besoin de cette ligne, a moins que tu ne veuilles coller
les informations de ta matrice dans ta feuille (donc à la palce des
anciennes valeurs).
Dans ce cas, un truc dans ce genre (à optimiser) à ma place de la
dernière ligne :

Range(Cells(ActiveCell().Row, ActiveCell().Column + 1), _
Cells(ActiveCell().Row + UBound(Tabentree, 1) - 1,
ActiveCell().Column)) = Tabentree

Qui peut se traduire par :
Range(cells(row1, col1), cells(row2, col2)) = tabentree
avec row1 = Cells(ActiveCell().Row
col1 = ActiveCell().Column + 1
row2 = ActiveCell().Row + UBound(Tabentree, 1) - 1
col2 = ActiveCell().Column


Perso j'utilise une fonction de ce type parcequ'à partir de données
en vrac, je fait un tableau croisée dynamique, et à partir de ce
tableau croisé dynamique, aprèsqu'il ait été modifié par des
utilisateurs, je refais un autre tableau croisé dynamique qui me
permet d'avoir des données complètes et propre.

Pour ca, je n'utilise pas une matrice, mais je remplis automatiquement
les champs vide par la dernière valeur (et je le cache avec le format
";;;") :

Dim I, RowMax As Double
RowMax = Cells(65536, 1).End(xlUp).Row
Col = Selection.Column
With ActiveSheet
For I = 2 To RowMax
If .Cells(I, Col).Value <> "" Then valeur = .Cells(I, Col).Value
If .Cells(I, Col).Value = "" Then .Cells(I, Col).Value = valeur:
.Cells(I, Col).NumberFormat = ";;;"
Next
End With




Bonjour FdeCourt,
excuse de ne pas avoir répondu avant.

Pourrais tu simplement m'expliquer la dernière ligne ?
et en particulier le Range ?


Range( Cells(3598, 5) , Cells( 3598 + UBound(Tabentree, 1) - 1 ,
5 ) )

normalement, la fonction cells à les parametre ligne et colonne (?)
cells(ligne, colonne)

si l'on écrivais : [A:A] = Tabentree est-ce ce ne serait pas pareil
?


Merci encore.

José








Salut,

Une solution :

Sub testde()
Tabentree = Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value
For II = LBound(Tabentree, 1) To UBound(Tabentree, 1)
If Tabentree(II, 1) <> "" Then valeur = Tabentree(II, 1)
If Tabentree(II, 1) = "" Then Tabentree(II, 1) = valeur
Next
Range(Cells(3598, 5), Cells(3598 + UBound(Tabentree, 1) - 1, 5)) =
Tabentree
End Sub





Bonjour (re)

voici ce que j'ai :

Sub donnees_de_champ_unique()
Dim Tabentree

' on se positionne quelque part
range("A20").select
ActiveCell.Offset(1, 0).Select ' (on descend d'une cellule pour pas
avoir le titre de la colonne)

'on remplit la "collection Tabentree par toutes les valeurs de cette
colonne
Tabentree = Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value


Ok, mon soucis est que, dans cette colonne, j'ai des trous...

Je n'arrive pas à formaliser une boucle qui, lorsqu'elle rencontre un
"trou" (une valeur de tabentrée vide
pour un indice donné) le comble avec la valeur de l'indice préced ent.


J'imagine un truc comme çà :
For II = LBound(Tabentree, 1) To UBound(Tabentree, 1) ' on boucle du
premier element au dernier élément
On Error Resume Next

Si la valeur de tabentree pour l'indice II est vide
copier "la valeur de tabentree à l'indice II -1" dans
"tabentree de l'indice II"
finSI
Next


Voilà, je n'arrive pas à lécrire, pouvez vous m'aider svp ?

Merci

José






Avatar
Alfred WALLACE
Bonjour
ne t'excuse pas, merci pour tes explications !!!

Je vais tacher de les exploiter au mieux.


cordialement
José


Excuse moi, mais cette dernière ligne me permettait juste de vérifier
que j'enregistrais correctement les valeurs dans la matrice.

Tu n'as pas besoin de cette ligne, a moins que tu ne veuilles coller
les informations de ta matrice dans ta feuille (donc à la palce des
anciennes valeurs).
Dans ce cas, un truc dans ce genre (à optimiser) à ma place de la
dernière ligne :

Range(Cells(ActiveCell().Row, ActiveCell().Column + 1), _
Cells(ActiveCell().Row + UBound(Tabentree, 1) - 1,
ActiveCell().Column)) = Tabentree

Qui peut se traduire par :
Range(cells(row1, col1), cells(row2, col2)) = tabentree
avec row1 = Cells(ActiveCell().Row
col1 = ActiveCell().Column + 1
row2 = ActiveCell().Row + UBound(Tabentree, 1) - 1
col2 = ActiveCell().Column


Perso j'utilise une fonction de ce type parcequ'à partir de données
en vrac, je fait un tableau croisée dynamique, et à partir de ce
tableau croisé dynamique, aprèsqu'il ait été modifié par des
utilisateurs, je refais un autre tableau croisé dynamique qui me
permet d'avoir des données complètes et propre.

Pour ca, je n'utilise pas une matrice, mais je remplis automatiquement
les champs vide par la dernière valeur (et je le cache avec le format
";;;") :

Dim I, RowMax As Double
RowMax = Cells(65536, 1).End(xlUp).Row
Col = Selection.Column
With ActiveSheet
For I = 2 To RowMax
If .Cells(I, Col).Value <> "" Then valeur = .Cells(I, Col).Value
If .Cells(I, Col).Value = "" Then .Cells(I, Col).Value = valeur:
.Cells(I, Col).NumberFormat = ";;;"
Next
End With




Bonjour FdeCourt,
excuse de ne pas avoir répondu avant.

Pourrais tu simplement m'expliquer la dernière ligne ?
et en particulier le Range ?


Range( Cells(3598, 5) , Cells( 3598 + UBound(Tabentree, 1) - 1 ,
5 ) )

normalement, la fonction cells à les parametre ligne et colonne (?)
cells(ligne, colonne)

si l'on écrivais : [A:A] = Tabentree est-ce ce ne serait pas par eil
?


Merci encore.

José








Salut,

Une solution :

Sub testde()
Tabentree = Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value
For II = LBound(Tabentree, 1) To UBound(Tabentree, 1)
If Tabentree(II, 1) <> "" Then valeur = Tabentree(II, 1)
If Tabentree(II, 1) = "" Then Tabentree(II, 1) = valeur
Next
Range(Cells(3598, 5), Cells(3598 + UBound(Tabentree, 1) - 1, 5)) =
Tabentree
End Sub





Bonjour (re)

voici ce que j'ai :

Sub donnees_de_champ_unique()
Dim Tabentree

' on se positionne quelque part
range("A20").select
ActiveCell.Offset(1, 0).Select ' (on descend d'une cellule pour p as
avoir le titre de la colonne)

'on remplit la "collection Tabentree par toutes les valeurs de cette
colonne
Tabentree = Range(ActiveCell(), Cells(65536,
ActiveCell.Column).End(xlUp)).Value


Ok, mon soucis est que, dans cette colonne, j'ai des trous...

Je n'arrive pas à formaliser une boucle qui, lorsqu'elle rencontr e un
"trou" (une valeur de tabentrée vide
pour un indice donné) le comble avec la valeur de l'indice préc edent.


J'imagine un truc comme çà :
For II = LBound(Tabentree, 1) To UBound(Tabentree, 1) ' on boucle du
premier element au dernier élément
On Error Resume Next

Si la valeur de tabentree pour l'indice II est vide
copier "la valeur de tabentree à l'indice II -1" dans
"tabentree de l'indice II"
finSI
Next


Voilà, je n'arrive pas à lécrire, pouvez vous m'aider svp ?

Merci

José