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

VBA: Copier/Coller conditionnel

5 réponses
Avatar
YeTi
Hello à tous,

Je fais un classeur Excel pour mon équipe de foot. Nous sommes 30 licenciés
et bien entendu, les 30 ne viennent pas à tous les matchs.
J'ai donc fait un tableau dans une feuille "Présence" avec en titre de
colonne la date du match et en ligne, le nom du joueur. Le joueur inscrit un
"x" lorsqu'il est disponible à une certaine date.

A ce jour, ma macro me permet de faire qu'une partie de ce que j'aimerais.
En fait lorsque je lance la macro, un UserForm apparaît et invite
l'utilisateur à choisir une date dans un ComboBox. Les dates sont insérée en
fonction de celles inscrite dans les titres de colonne de la feuille
"Présence".

Lorsque la date a été choisie, l'utilisateur clique sur exécuter et la
feuille "Template" est dupliquée et renomée en fonction de la date choisie
(le nom de la feuille = la date du match) *et les joueurs ayant un "x" à
cette date là sont copiés et collés dans la feuille dupliquée ci-dessus*.

C'est la seconde partie (entourée de *) que je n'arrive pas à créer. Est-ce
que quelqu'un pourrait m'aider? Je vous laisse ci-dessous le code complet de
la macro/UserForm jusqu'à présent... Merci d'avance!


Private Sub UserForm_Initialize()
'On charge les dates de matches dans la liste
For i = 2 To 256
With Sheets("Présences").Cells(1, i)
If .Value <> "" Then
ComboBox1.AddItem .Text
End If
End With
Next i
End Sub

Private Sub CommandButton1_Click()
match_date = ComboBox1.Value

'On copie le template et on renomme la feuille
Sheets("Template").Copy After:=Sheets(4)
Sheets("Template (2)").Name = match_date


' Sélectionner tous les noms de la colonne A ayant un "x" dans la colonne
correspondant au match_date et les copier dans la feuille ayant pour nom le
match_date


'On ferme le programme
UserForm1.Hide
End Sub

5 réponses

Avatar
YeTi
En attendant une réponse, j'ai pu avancer légérement...
Donc, lorsque j'ai choisi ma date dans le ComboBox, Template est dupliqué et
renommé en avec le choix de ComboBox.

Ensuite, la liste intégrale des joueurs est copiée et collée dans la feuille
de formules dans la colonne A.

Ce qu'il me faudrait maintenant, c'est que la colonne correspondant à la
date choisie dans la ComboBox soit intégralement copiée et collée en colonne
B de la feuille "Formules"

On aurait donc qqch comme ceci:

Joueur | 25-Sep-08
Matt | x
José |
Julien |
Roland | x
Vivien | x
etc.

Ensuite le programme efface les lignes où la colonne B est vide. Comme ca
j'ai la liste de tous les joueurs présents pour ce jour là!

Merci de votre aide!

Le code:
Private Sub CommandButton1_Click()
match_date = ComboBox1.Value

'On copie le template et on renomme la feuille
Sheets("Template").Copy After:=Sheets(4)
Sheets("Template (2)").Name = match_date

'On copie les noms de tous les joueurs
Sheets("Présences").Columns("A:A").Copy
Sheets("Formules").Range("A1").PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:úlse, Transpose:úlse

'On copie la disponibilité du joueur en fonction de la date choisie
For i = 2 To 256
If Cells(1, i) = match_date Then
Columns.Copy
Sheets("Formules").Range("A2").PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:úlse, Transpose:úlse
End If
Next i

'On supprime la ligne de titre ainsi que tous les joueurs non-disponibles
Sheets("Formules").Select
Selection.Rows("1:1").Delete Shift:=xlUp

For i = 50 To 1 Step -1
If Application.WorksheetFunction.CountA(Cells(i, 2)) = 0 Then
Rows.Delete Shift:=xlUp
End If
Next i

'On ferme le programme
UserForm1.Hide
End Sub
Avatar
YeTi
Pour simplifier encore le tout, voici la partie du code qui ne fonctionne pas:

'On copie la disponibilité du joueur en fonction de la date choisie
For i = 2 To 256
If Cells(1, i) = match_date Then
Columns.Copy
Sheets("Formules").Range("A2").PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:úlse, Transpose:úlse
End If

A mon avis, le "Columns.Copy" est faux. J'ai essayé
"ActiveCell.Columns.Copy" mais ca ne marche pas non plus... Une idée?

Merci!
Next i
Avatar
JPMonnier
Bonjour, je ne sais pas si tes données sont distribuées Sous forme de base
de données, si c'est le cas, il serait judicieux de faire une extraction par
filtre élaboré (en VBA bien sur) dans lequel filtre tu pourrais mettre comme
critères une date de match et le x des joueurs concernés.
Puis extraire le résultat sur une feuille de ton choix ou les titres des
colonnes que tu souhaites extraire figurent sur cette feuille !
--
Cordialement

"YeTi" a écrit dans le message de
news:
Hello à tous,

Je fais un classeur Excel pour mon équipe de foot. Nous sommes 30
licenciés
et bien entendu, les 30 ne viennent pas à tous les matchs.
J'ai donc fait un tableau dans une feuille "Présence" avec en titre de
colonne la date du match et en ligne, le nom du joueur. Le joueur inscrit
un
"x" lorsqu'il est disponible à une certaine date.

A ce jour, ma macro me permet de faire qu'une partie de ce que j'aimerais.
En fait lorsque je lance la macro, un UserForm apparaît et invite
l'utilisateur à choisir une date dans un ComboBox. Les dates sont insérée
en
fonction de celles inscrite dans les titres de colonne de la feuille
"Présence".

Lorsque la date a été choisie, l'utilisateur clique sur exécuter et la
feuille "Template" est dupliquée et renomée en fonction de la date choisie
(le nom de la feuille = la date du match) *et les joueurs ayant un "x" à
cette date là sont copiés et collés dans la feuille dupliquée ci-dessus*.

C'est la seconde partie (entourée de *) que je n'arrive pas à créer.
Est-ce
que quelqu'un pourrait m'aider? Je vous laisse ci-dessous le code complet
de
la macro/UserForm jusqu'à présent... Merci d'avance!


Private Sub UserForm_Initialize()
'On charge les dates de matches dans la liste
For i = 2 To 256
With Sheets("Présences").Cells(1, i)
If .Value <> "" Then
ComboBox1.AddItem .Text
End If
End With
Next i
End Sub

Private Sub CommandButton1_Click()
match_date = ComboBox1.Value

'On copie le template et on renomme la feuille
Sheets("Template").Copy After:=Sheets(4)
Sheets("Template (2)").Name = match_date


' Sélectionner tous les noms de la colonne A ayant un "x" dans la colonne
correspondant au match_date et les copier dans la feuille ayant pour nom
le
match_date


'On ferme le programme
UserForm1.Hide
End Sub


Avatar
YeTi
Merci JPMonnier pour cette réponse,

Je ne suis pas une star en VBA, je pêche un peu des infos à droite à gauche
et essaie de les adapter à mes besoins et je dois avouer n'avoir jamais
utilisés les filtres élaborés en VBA.

Etant donné que j'ai presque trouvé la solution pourrais-tu m'aider à
finaliser la chose? A mon avis, l'erreur provient de "Columns.Copy "
ci-dessous. Comment copier la colonne d'une cellule répondant à une condition?

Merci d'avance!

'On copie la disponibilité du joueur en fonction de la date choisie
For i = 2 To 256
If Cells(1, i) = match_date Then
Columns.Copy
Sheets("Formules").Range("A2").PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:úlse, Transpose:úlse
End If
Next i

"JPMonnier" wrote:

Bonjour, je ne sais pas si tes données sont distribuées Sous forme de base
de données, si c'est le cas, il serait judicieux de faire une extraction par
filtre élaboré (en VBA bien sur) dans lequel filtre tu pourrais mettre comme
critères une date de match et le x des joueurs concernés.
Puis extraire le résultat sur une feuille de ton choix ou les titres des
colonnes que tu souhaites extraire figurent sur cette feuille !
--
Cordialement

"YeTi" a écrit dans le message de
news:
> Hello à tous,
>
> Je fais un classeur Excel pour mon équipe de foot. Nous sommes 30
> licenciés
> et bien entendu, les 30 ne viennent pas à tous les matchs.
> J'ai donc fait un tableau dans une feuille "Présence" avec en titre de
> colonne la date du match et en ligne, le nom du joueur. Le joueur inscrit
> un
> "x" lorsqu'il est disponible à une certaine date.
>
> A ce jour, ma macro me permet de faire qu'une partie de ce que j'aimerais.
> En fait lorsque je lance la macro, un UserForm apparaît et invite
> l'utilisateur à choisir une date dans un ComboBox. Les dates sont insérée
> en
> fonction de celles inscrite dans les titres de colonne de la feuille
> "Présence".
>
> Lorsque la date a été choisie, l'utilisateur clique sur exécuter et la
> feuille "Template" est dupliquée et renomée en fonction de la date choisie
> (le nom de la feuille = la date du match) *et les joueurs ayant un "x" à
> cette date là sont copiés et collés dans la feuille dupliquée ci-dessus*.
>
> C'est la seconde partie (entourée de *) que je n'arrive pas à créer.
> Est-ce
> que quelqu'un pourrait m'aider? Je vous laisse ci-dessous le code complet
> de
> la macro/UserForm jusqu'à présent... Merci d'avance!
>
>
> Private Sub UserForm_Initialize()
> 'On charge les dates de matches dans la liste
> For i = 2 To 256
> With Sheets("Présences").Cells(1, i)
> If .Value <> "" Then
> ComboBox1.AddItem .Text
> End If
> End With
> Next i
> End Sub
>
> Private Sub CommandButton1_Click()
> match_date = ComboBox1.Value
>
> 'On copie le template et on renomme la feuille
> Sheets("Template").Copy After:=Sheets(4)
> Sheets("Template (2)").Name = match_date
>
>
> ' Sélectionner tous les noms de la colonne A ayant un "x" dans la colonne
> correspondant au match_date et les copier dans la feuille ayant pour nom
> le
> match_date
>
>
> 'On ferme le programme
> UserForm1.Hide
> End Sub




Avatar
JPMonnier
Tu modifies :
Columns.Copy
par
Columns(i).Copy
je pense que c'est ce que j'ai compris
--
Cordialement

"YeTi" a écrit dans le message de
news:
Merci JPMonnier pour cette réponse,

Je ne suis pas une star en VBA, je pêche un peu des infos à droite à
gauche
et essaie de les adapter à mes besoins et je dois avouer n'avoir jamais
utilisés les filtres élaborés en VBA.

Etant donné que j'ai presque trouvé la solution pourrais-tu m'aider à
finaliser la chose? A mon avis, l'erreur provient de "Columns.Copy "
ci-dessous. Comment copier la colonne d'une cellule répondant à une
condition?

Merci d'avance!

'On copie la disponibilité du joueur en fonction de la date choisie
For i = 2 To 256
If Cells(1, i) = match_date Then
Columns.Copy
Sheets("Formules").Range("A2").PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:úlse, Transpose:úlse
End If
Next i

"JPMonnier" wrote:

Bonjour, je ne sais pas si tes données sont distribuées Sous forme de
base
de données, si c'est le cas, il serait judicieux de faire une extraction
par
filtre élaboré (en VBA bien sur) dans lequel filtre tu pourrais mettre
comme
critères une date de match et le x des joueurs concernés.
Puis extraire le résultat sur une feuille de ton choix ou les titres des
colonnes que tu souhaites extraire figurent sur cette feuille !
--
Cordialement

"YeTi" a écrit dans le message de
news:
> Hello à tous,
>
> Je fais un classeur Excel pour mon équipe de foot. Nous sommes 30
> licenciés
> et bien entendu, les 30 ne viennent pas à tous les matchs.
> J'ai donc fait un tableau dans une feuille "Présence" avec en titre de
> colonne la date du match et en ligne, le nom du joueur. Le joueur
> inscrit
> un
> "x" lorsqu'il est disponible à une certaine date.
>
> A ce jour, ma macro me permet de faire qu'une partie de ce que
> j'aimerais.
> En fait lorsque je lance la macro, un UserForm apparaît et invite
> l'utilisateur à choisir une date dans un ComboBox. Les dates sont
> insérée
> en
> fonction de celles inscrite dans les titres de colonne de la feuille
> "Présence".
>
> Lorsque la date a été choisie, l'utilisateur clique sur exécuter et la
> feuille "Template" est dupliquée et renomée en fonction de la date
> choisie
> (le nom de la feuille = la date du match) *et les joueurs ayant un "x"
> à
> cette date là sont copiés et collés dans la feuille dupliquée
> ci-dessus*.
>
> C'est la seconde partie (entourée de *) que je n'arrive pas à créer.
> Est-ce
> que quelqu'un pourrait m'aider? Je vous laisse ci-dessous le code
> complet
> de
> la macro/UserForm jusqu'à présent... Merci d'avance!
>
>
> Private Sub UserForm_Initialize()
> 'On charge les dates de matches dans la liste
> For i = 2 To 256
> With Sheets("Présences").Cells(1, i)
> If .Value <> "" Then
> ComboBox1.AddItem .Text
> End If
> End With
> Next i
> End Sub
>
> Private Sub CommandButton1_Click()
> match_date = ComboBox1.Value
>
> 'On copie le template et on renomme la feuille
> Sheets("Template").Copy After:=Sheets(4)
> Sheets("Template (2)").Name = match_date
>
>
> ' Sélectionner tous les noms de la colonne A ayant un "x" dans la
> colonne
> correspondant au match_date et les copier dans la feuille ayant pour
> nom
> le
> match_date
>
>
> 'On ferme le programme
> UserForm1.Hide
> End Sub