XL 2021 modifier lignes

  • Initiateur de la discussion Initiateur de la discussion AIGOIN
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

AIGOIN

XLDnaute Junior
Bonjour,
Dans le fichier joint, dans base, userform5 (DECAGEMENT) peux modifier une ligne dans la feuille éleveur que j'ai sélectionné combobox4 Souche en fonction de l'extraction vente que j'ai effectué avec cbo1 et cbo2.
Est-il possible de modifier avec une macro les lignes sélectionnées V (vente) issues de l'extraction feuille DE_V par exemple éleveur 1113 modifier toutes les lignes vendues dans la feuille de l'éleveur qui ont encore un P (oiseau présent).
J'effectue actuellement cela avec la macro modifier mais ligne par ligne je souhaiterai l'effectuer avec une macro mais je n'y arrive pas !!!!!
Merci pour votre aide
Alain
 

Pièces jointes

Bonsoir

Désolé je croyais avoir supprimé la feuille éleveur j'avais supprimé de nombreuses feuilles car fichier trop lourd
Les colonnes O et N sont utiles dans une feuille seulement DE_P quand nous avons reçu toutes les feuilles d'encagement je récupère le nombre d'oiseaux engagés par éleveur cellule C43 dans feuille éleveur ainsi nous savons combien d'oiseaux nous avons à vendre dans la feuille base.
Les feuilles DE_P et DE_V me servent pour le décagement je fais une extraction des oiseaux P et l'éleveur sais combien d'oiseaux il doit récupérer et le nombre d'oiseaux vendus extraction V
La feuille certificat doit rester telle qu'elle est dans mon premier fichier, la feuille est imprimée pour chaque acheteur (c'est la loi ) et archivé 5 ans (c'est encore la loi) et le numéro cellule K1 est incrémentée de 1 chaque fois
Quant à la combobox choix ligne je pensais que ça évitait de faire des erreurs
La macro extraire V dans décagement plante....
Merci beaucoup pour votre aide très précieuse je suis vraiment un artisan de VBA
 
Vu la complexité de ton code initial, je pense qu'il va falloir procéder etape par etape..
tu fais énormément de select, activate, de recherches qui sont
1) inutiles
2) peuvent considérablement ralentir le programme
3) source d'incompréhension, car, finalement à la simple lecture du code, on ne comprend pas trop ce que ca fait
en plus, tu utilises mal les instructions with, et telles qu'elles sont écrites.. j'ai envie de dire que ca "tombe en marche"
dans cet exemple que j'ai vu
VB:
with Listbox3
    listbox1.column=..
end with

1) tu crois travailler sur la listbox 3, et en fait. c'est la listbox1 que tu modifies
2) il faudrait ecrire
Code:
    with Listbox3
          .column=..   (le . devant column est un "raccourci" pour "listbox3"
    end with

autre exemple d'écriture
Code:
with sheets("NomFeuille")
       .range("A1")=.....
       .range("C22")=....
end with
ici on sait qu'on modifie les cellules A1 et C22 DE la feuille "NomFeuille"


Je te propose donc de voir ton document feuille par feuille puis Formulaire par Formulaire
Quelques questions auxquelles il faudrait que tu répondes ou que tu confirmes ma compréhension
1) Souche et Eleveur: c'est pareil?
si OUI==> pourquoi ne pas garder toujours le meme nom?
si NON==> c'est quoi la différence?
2) Dans les feuilles d'éleveur basées sur le Modele
comme tu peux le voir, j'ai transformé le tableau en Table Structurée
===> Beaucoup plus simple, pratique et dynamique pour ajouter / modifier / supprimer des lignes
==> ca implique que j'ai déplacé les Totaux de V A P sur la droite en colonne K
ce sera plus pratique pour récuperer les valeurs
Peux-tu expliquer à quoi ca correspond V A P? et quelle différence avec Oiseaux Inscrits, vendus et Decages ?

3) Feuille base==> c'est de la que tu lances tes formulaires ?

4) Feuille Certificat
==> idem, j'ai juste transformé le tableau en TS
dans le code, (bouton décagement justement), il y a des valeurs qui sont récupérées (j'ai pas encore saisi ou exactement) pour être collées à la ligne 43 (sous la TS)
ce serait beaucoup mieux de les coller à droite de la TS (comme pour le modèle)
==> la dernière colonne (L) n'avait pas de nom==> je l'ai appelée Destination.. si je ne me suis pas trompé..?

5) Feuille DE_P et DE_V
si j'ai bien compris, ce sont des extractions d'éleveurs
les tableaux de la colonne N-O==> tu dis qu'il n'est utile que pour la feuille DE_P ==> on peut donc le supprimer de la feuille DE_V ?
comment est il "alimenté" ?

6) Feuille VE
je n'ai pour l'instant vu aucun code qui travaille sur cette feuille (mais elle semble avoir la meme structure que DE_P et DE_V

7) Feuille Liste
c'est une nouvelle feuille dans laquelle j'ai mis des listes de choix qui servent à alimenter différentes listes de validation

8) Feuille Vente
de ce que j'ai vu, elle est alimentée lorsque tu fais une vente dans le formulaire "USF_Vente"

à quoi sert la partie de droite? Colonnes K à S ? on dirait juste l'entete du modèle..?


8) Feuille Codes
ton VBA utilisait une feuille Codes qui n'existait pas.. j'en ai construit une==> le mieux serait que tu remettes la tienne

9) Feuille Eleveurs
==> liste et données des éleveurs

10) y a t il d'autres feuilles manquantes dans ton fichier?

pour les formulaires==> ils sont tous utilisés? j'ai l'impression que certains USF reprennent la meme chose qu'un autre USF

pour chacun d'eux, peut tu donner une description de à quoi ils servent, et comment tu les utilises?


ca fait pas mal de boulot, mais je pense qu'au final, ton fichier sera plus compréhensible et surtout plus performant avec moins d'erreurs
 

Pièces jointes

Vu la complexité de ton code initial, je pense qu'il va falloir procéder etape par etape..
tu fais énormément de select, activate, de recherches qui sont
1) inutiles
2) peuvent considérablement ralentir le programme
3) source d'incompréhension, car, finalement à la simple lecture du code, on ne comprend pas trop ce que ca fait
en plus, tu utilises mal les instructions with, et telles qu'elles sont écrites.. j'ai envie de dire que ca "tombe en marche"
dans cet exemple que j'ai vu
VB:
with Listbox3
    listbox1.column=..
end with

1) tu crois travailler sur la listbox 3, et en fait. c'est la listbox1 que tu modifies
2) il faudrait ecrire
Code:
    with Listbox3
          .column=..   (le . devant column est un "raccourci" pour "listbox3"
    end with

autre exemple d'écriture
Code:
with sheets("NomFeuille")
       .range("A1")=.....
       .range("C22")=....
end with
ici on sait qu'on modifie les cellules A1 et C22 DE la feuille "NomFeuille"


Je te propose donc de voir ton document feuille par feuille puis Formulaire par Formulaire
Quelques questions auxquelles il faudrait que tu répondes ou que tu confirmes ma compréhension
1) Souche et Eleveur: c'est pareil?
si OUI==> pourquoi ne pas garder toujours le meme nom?
si NON==> c'est quoi la différence?
2) Dans les feuilles d'éleveur basées sur le Modele
comme tu peux le voir, j'ai transformé le tableau en Table Structurée
===> Beaucoup plus simple, pratique et dynamique pour ajouter / modifier / supprimer des lignes
==> ca implique que j'ai déplacé les Totaux de V A P sur la droite en colonne K
ce sera plus pratique pour récuperer les valeurs
Peux-tu expliquer à quoi ca correspond V A P? et quelle différence avec Oiseaux Inscrits, vendus et Decages ?

3) Feuille base==> c'est de la que tu lances tes formulaires ?

4) Feuille Certificat
==> idem, j'ai juste transformé le tableau en TS
dans le code, (bouton décagement justement), il y a des valeurs qui sont récupérées (j'ai pas encore saisi ou exactement) pour être collées à la ligne 43 (sous la TS)
ce serait beaucoup mieux de les coller à droite de la TS (comme pour le modèle)
==> la dernière colonne (L) n'avait pas de nom==> je l'ai appelée Destination.. si je ne me suis pas trompé..?

5) Feuille DE_P et DE_V
si j'ai bien compris, ce sont des extractions d'éleveurs
les tableaux de la colonne N-O==> tu dis qu'il n'est utile que pour la feuille DE_P ==> on peut donc le supprimer de la feuille DE_V ?
comment est il "alimenté" ?

6) Feuille VE
je n'ai pour l'instant vu aucun code qui travaille sur cette feuille (mais elle semble avoir la meme structure que DE_P et DE_V

7) Feuille Liste
c'est une nouvelle feuille dans laquelle j'ai mis des listes de choix qui servent à alimenter différentes listes de validation

8) Feuille Vente
de ce que j'ai vu, elle est alimentée lorsque tu fais une vente dans le formulaire "USF_Vente"

à quoi sert la partie de droite? Colonnes K à S ? on dirait juste l'entete du modèle..?


8) Feuille Codes
ton VBA utilisait une feuille Codes qui n'existait pas.. j'en ai construit une==> le mieux serait que tu remettes la tienne

9) Feuille Eleveurs
==> liste et données des éleveurs

10) y a t il d'autres feuilles manquantes dans ton fichier?

pour les formulaires==> ils sont tous utilisés? j'ai l'impression que certains USF reprennent la meme chose qu'un autre USF

pour chacun d'eux, peut tu donner une description de à quoi ils servent, et comment tu les utilises?


ca fait pas mal de boulot, mais je pense qu'au final, ton fichier sera plus compréhensible et surtout plus performant avec moins d'erreurs
Bonjour,

Je vais essayer de répondre à toutes les questions :

1) le numéro de souche est le numéro attribué par le club à l'éleveur ce numéro est inscrit sur les bagues commandées par l'éleveur dans les expositions tous les oiseaux doivent être bagués
l'éleveur est le nom de la personne

2) Je pense que la feuille modèle doit rester telle qu'elle est je ne vois pas l'intérêt d'en faire un tableau structuré, je l'utilise quand je reçois les feuilles des éleveurs par internet ou par courrier afin que toutes les feuilles aient la même structure. Userform2 bouton finaliser.

3) oui sur la feuille base je lance tous les formulaires

4) la feuille certificat ne doit pas être modifiée, est doit contenir tous les éléments y figurants lors du paiement j'annonce à l'acheteur le nombre d'oiseaux achetés, et la somme à payer, j'inscris son nom et son code postal, j'imprime le certificat et je l'archive. Lorsque l'éleveur sort de la salle d'exposition il présente le certificat et les oiseaux qui y sont inscrits. Ce document peut servir aussi à la douane. Ce document doit être conservé 5 ans d'où l'archivage.
V : oiseaux vendus
A : oiseaux absents (non encagés)
P : oiseaux présents (non vendus)

5) Feuilles DE_P (décagement oiseaux présents) DE_V (décagement oiseaux vendus) c'est là que j'ai un problème quand je fais l'extraction P oiseaux présents sur la feuille éleveur et l'extraction V oiseaux vendus qu'il existe une différence entre les oiseaux présents et les oiseaux vendus car pour éviter une attente trop longue quand il y a beaucoup de monde!!! nous pouvons vendre à deux ordinateurs ou plus.
Dans l'userform5 lorsque je fais l'extraction vente et l'extraction présents je souhaiterais à l'aide d'une macro modifier la feuille de l'éleveur rapidement et non ligne par ligne comme je le fais actuellement.

6) VE je m'en sers pour faire les comptes de chaque éleveur lorsque je dois régler les oiseaux vendus à chaque éleveur et j'archive chaque feuille dans un classeur "compte" que je crée lors de cette opération.

7) Feuille liste : OK

8) Feuille vente sert pour la vente des oiseaux ok pour tableau structuré la partie à droite ne sert à rien à supprimer

9) Feuille code contient tous les codes postaux de France.

Quant aux userforms :

Userform2 encagement je l'utilise le jour de l'encagement pour modifier une ligne (numéro de bague, année.... ) lorsque l'éleveur arrive avec ses oiseaux à encager.
Je l'utilise également pour copier les noms des onglets souche et le nombre d'oiseaux engagés pour chaque souche colonne N et O feuille DE_P et DE_V.
Et pour finaliser afin que toutes les feuilles soient identiques.

Userform1 et Userform4 vente et finaliser certificat ?
 
Bonjour,

Je vais essayer de répondre à toutes les questions :

1) le numéro de souche est le numéro attribué par le club à l'éleveur ce numéro est inscrit sur les bagues commandées par l'éleveur dans les expositions tous les oiseaux doivent être bagués
l'éleveur est le nom de la personne

2) Je pense que la feuille modèle doit rester telle qu'elle est je ne vois pas l'intérêt d'en faire un tableau structuré, je l'utilise quand je reçois les feuilles des éleveurs par internet ou par courrier afin que toutes les feuilles aient la même structure. Userform2 bouton finaliser.

3) oui sur la feuille base je lance tous les formulaires

4) la feuille certificat ne doit pas être modifiée, est doit contenir tous les éléments y figurants lors du paiement j'annonce à l'acheteur le nombre d'oiseaux achetés, et la somme à payer, j'inscris son nom et son code postal, j'imprime le certificat et je l'archive. Lorsque l'éleveur sort de la salle d'exposition il présente le certificat et les oiseaux qui y sont inscrits. Ce document peut servir aussi à la douane. Ce document doit être conservé 5 ans d'où l'archivage.
V : oiseaux vendus
A : oiseaux absents (non encagés)
P : oiseaux présents (non vendus)

5) Feuilles DE_P (décagement oiseaux présents) DE_V (décagement oiseaux vendus) c'est là que j'ai un problème quand je fais l'extraction P oiseaux présents sur la feuille éleveur et l'extraction V oiseaux vendus qu'il existe une différence entre les oiseaux présents et les oiseaux vendus car pour éviter une attente trop longue quand il y a beaucoup de monde!!! nous pouvons vendre à deux ordinateurs ou plus.
Dans l'userform5 lorsque je fais l'extraction vente et l'extraction présents je souhaiterais à l'aide d'une macro modifier la feuille de l'éleveur rapidement et non ligne par ligne comme je le fais actuellement.

6) VE je m'en sers pour faire les comptes de chaque éleveur lorsque je dois régler les oiseaux vendus à chaque éleveur et j'archive chaque feuille dans un classeur "compte" que je crée lors de cette opération.

7) Feuille liste : OK

8) Feuille vente sert pour la vente des oiseaux ok pour tableau structuré la partie à droite ne sert à rien à supprimer

9) Feuille code contient tous les codes postaux de France.

Quant aux userforms :

Userform2 encagement je l'utilise le jour de l'encagement pour modifier une ligne (numéro de bague, année.... ) lorsque l'éleveur arrive avec ses oiseaux à encager.
Je l'utilise également pour copier les noms des onglets souche et le nombre d'oiseaux engagés pour chaque souche colonne N et O feuille DE_P et DE_V.
Et pour finaliser afin que toutes les feuilles soient identiques.

Userform1 et Userform4 vente et finaliser certificat ?
 
J'ai envoyé avant d'avoir terminé
Donc Userform1 et Userform4 on pourrait peut-être n'en faire qu'un. Je reviens sur la vente ce que vous avez fait et très bien mais le numéro de ligne est important car sur chaque étiquette que nous mettons sur les cages figure le numéro de ligne correspondant à la ligne sur la feuille de l'éleveur ce qui facilite la vente et les recherches.

Userform5 décagement à améliorer avec les demandes citées en amont.

Userform3 fonctionne bien mais peut être amélioré sans problème!!!

Userform6 DSV permet d'envoyer la feuille des éleveurs participants à chaque direction des services vétérinaires des départements auxquels appartiennent les éleveurs. A améliorer?
 
ok
je regarde pour remettre la possibilité de selectionner une ligne à partir d'un combo

et donc.. le point de départ de l'application, c'est dans le Userform2 que ca se passe..
si j'ai bien compris, la partie du haut, c'est "juste" pour visualiser les différentes souches présentes dans le fichier et modifier des lignes==> mais tout ca.. tu peux déjà le faire avec le formulaire "USF_Décagement" (ancien userform5)
à mon avis, cette partie devrait etre supprimée
1) on garderait de la logique ==> 1 Userform = 1 utilité
2) ca limite la quantité de code

le Bouton "Copier noms des onglets + nombre oiseaux"
==> il sert à créer les colonnes N et O des feuilles DE_V et DE_P
dans ton code, tu créées un lien hypertexte vers chaque feuille pour juste après;. les supprimer;.
autant ne pas les mettre..
regarde la simplification que j'y ai apportée
VB:
Private Sub CommandButton8_Click()
Dim Target As Range
Dim TabEleveur() As Variant

    With Sheets("Eleveurs").ListObjects("t_Eleveurs")
        TabEleveur = .DataBodyRange.Value
    End With

    With Sheets("DE_V")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        For i = LBound(TabEleveur, 1) To UBound(TabEleveur, 1)
            If FeuilleExiste(CStr(TabEleveur(i, 2))) Then
                Set Target = .Range("N" & .Rows.Count).End(xlUp).Offset(1, 0)
                'Target.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:=CStr(TabEleveur(i, 2))  'soit on créé un lien hypertexte vers le nom de la souche
                Target = TabEleveur(i, 2) 'on met juste le numéro de souche
                .Range("O" & .Rows.Count).End(xlUp).Offset(1, 0).Value = Sheets(CStr(TabEleveur(i, 2))).Range("M5").Value 'on récupère le nombre d'oiseaux inscrits (V+P)
            End If
        Next i
        Set Zone = .Range("N2").CurrentRegion.Resize(, 2).Offset(1)
        'Zone.Select
         With Zone.Font
            .Name = "Times New Roman"
            .Size = 22
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .TintAndShade = 0
            .ThemeFont = xlThemeFontNone
        End With
    End With
    
    'on fait la meme chose avec la feuille DE_P ==> un simple copier coller suffit
    With Sheets("DE_P")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        .Range("N2").Resize(Zone.Rows.Count, 2) = Zone.Value
    End With
End Sub

et le bouton "FINALISER" (le seul qui ait un intéret sur ce userform) sert à importer les données provenant des éleveurs
de ce que je vois.. tu remplis d'abord la feuille Modèle
et si la fiche éleveur n'existe pas, alors, tu copies le modèle et renomme la feuille puis vide le modèle
et si la fiche eleveur existe..?? tu ne fais rien??

la logique me parait pas la meilleure, il vaudrait mieux ceci:
1) tu ouvres le fichier à importer (TF.xls) ==> aurais tu un exemple à fournir (sans donnée confidentielle bien sur)
2) on vérifie que la fiche n'existe pas déjà
si n'existe pas ==> on copie le modèle vide, on renomme la fiche et on rempli directement la fiche
si existe déjà ==> à toi de dire ce que tu veux==> soit on supprime la fiche existante pour la recréér, soit on ajoutte les données à la fiche existante..??
 
ok
je regarde pour remettre la possibilité de selectionner une ligne à partir d'un combo

et donc.. le point de départ de l'application, c'est dans le Userform2 que ca se passe..
si j'ai bien compris, la partie du haut, c'est "juste" pour visualiser les différentes souches présentes dans le fichier et modifier des lignes==> mais tout ca.. tu peux déjà le faire avec le formulaire "USF_Décagement" (ancien userform5)
à mon avis, cette partie devrait etre supprimée
1) on garderait de la logique ==> 1 Userform = 1 utilité
2) ca limite la quantité de code

le Bouton "Copier noms des onglets + nombre oiseaux"
==> il sert à créer les colonnes N et O des feuilles DE_V et DE_P
dans ton code, tu créées un lien hypertexte vers chaque feuille pour juste après;. les supprimer;.
autant ne pas les mettre..
regarde la simplification que j'y ai apportée
VB:
Private Sub CommandButton8_Click()
Dim Target As Range
Dim TabEleveur() As Variant

    With Sheets("Eleveurs").ListObjects("t_Eleveurs")
        TabEleveur = .DataBodyRange.Value
    End With

    With Sheets("DE_V")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        For i = LBound(TabEleveur, 1) To UBound(TabEleveur, 1)
            If FeuilleExiste(CStr(TabEleveur(i, 2))) Then
                Set Target = .Range("N" & .Rows.Count).End(xlUp).Offset(1, 0)
                'Target.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:=CStr(TabEleveur(i, 2))  'soit on créé un lien hypertexte vers le nom de la souche
                Target = TabEleveur(i, 2) 'on met juste le numéro de souche
                .Range("O" & .Rows.Count).End(xlUp).Offset(1, 0).Value = Sheets(CStr(TabEleveur(i, 2))).Range("M5").Value 'on récupère le nombre d'oiseaux inscrits (V+P)
            End If
        Next i
        Set Zone = .Range("N2").CurrentRegion.Resize(, 2).Offset(1)
        'Zone.Select
         With Zone.Font
            .Name = "Times New Roman"
            .Size = 22
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .TintAndShade = 0
            .ThemeFont = xlThemeFontNone
        End With
    End With
 
    'on fait la meme chose avec la feuille DE_P ==> un simple copier coller suffit
    With Sheets("DE_P")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        .Range("N2").Resize(Zone.Rows.Count, 2) = Zone.Value
    End With
End Sub

et le bouton "FINALISER" (le seul qui ait un intéret sur ce userform) sert à importer les données provenant des éleveurs
de ce que je vois.. tu remplis d'abord la feuille Modèle
et si la fiche éleveur n'existe pas, alors, tu copies le modèle et renomme la feuille puis vide le modèle
et si la fiche eleveur existe..?? tu ne fais rien??

la logique me parait pas la meilleure, il vaudrait mieux ceci:
1) tu ouvres le fichier à importer (TF.xls) ==> aurais tu un exemple à fournir (sans donnée confidentielle bien sur)
2) on vérifie que la fiche n'existe pas déjà
si n'existe pas ==> on copie le modèle vide, on renomme la fiche et on rempli directement la fiche
si existe déjà ==> à toi de dire ce que tu veux==> soit on supprime la fiche existante pour la recréér, soit on ajoutte les données à la fiche existante..??

ok
je regarde pour remettre la possibilité de selectionner une ligne à partir d'un combo

et donc.. le point de départ de l'application, c'est dans le Userform2 que ca se passe..
si j'ai bien compris, la partie du haut, c'est "juste" pour visualiser les différentes souches présentes dans le fichier et modifier des lignes==> mais tout ca.. tu peux déjà le faire avec le formulaire "USF_Décagement" (ancien userform5)
à mon avis, cette partie devrait etre supprimée
1) on garderait de la logique ==> 1 Userform = 1 utilité
2) ca limite la quantité de code

le Bouton "Copier noms des onglets + nombre oiseaux"
==> il sert à créer les colonnes N et O des feuilles DE_V et DE_P
dans ton code, tu créées un lien hypertexte vers chaque feuille pour juste après;. les supprimer;.
autant ne pas les mettre..
regarde la simplification que j'y ai apportée
VB:
Private Sub CommandButton8_Click()
Dim Target As Range
Dim TabEleveur() As Variant

    With Sheets("Eleveurs").ListObjects("t_Eleveurs")
        TabEleveur = .DataBodyRange.Value
    End With

    With Sheets("DE_V")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        For i = LBound(TabEleveur, 1) To UBound(TabEleveur, 1)
            If FeuilleExiste(CStr(TabEleveur(i, 2))) Then
                Set Target = .Range("N" & .Rows.Count).End(xlUp).Offset(1, 0)
                'Target.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:=CStr(TabEleveur(i, 2))  'soit on créé un lien hypertexte vers le nom de la souche
                Target = TabEleveur(i, 2) 'on met juste le numéro de souche
                .Range("O" & .Rows.Count).End(xlUp).Offset(1, 0).Value = Sheets(CStr(TabEleveur(i, 2))).Range("M5").Value 'on récupère le nombre d'oiseaux inscrits (V+P)
            End If
        Next i
        Set Zone = .Range("N2").CurrentRegion.Resize(, 2).Offset(1)
        'Zone.Select
         With Zone.Font
            .Name = "Times New Roman"
            .Size = 22
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .TintAndShade = 0
            .ThemeFont = xlThemeFontNone
        End With
    End With
  
    'on fait la meme chose avec la feuille DE_P ==> un simple copier coller suffit
    With Sheets("DE_P")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        .Range("N2").Resize(Zone.Rows.Count, 2) = Zone.Value
    End With
End Sub

et le bouton "FINALISER" (le seul qui ait un intéret sur ce userform) sert à importer les données provenant des éleveurs
de ce que je vois.. tu remplis d'abord la feuille Modèle
et si la fiche éleveur n'existe pas, alors, tu copies le modèle et renomme la feuille puis vide le modèle
et si la fiche eleveur existe..?? tu ne fais rien??

la logique me parait pas la meilleure, il vaudrait mieux ceci:
1) tu ouvres le fichier à importer (TF.xls) ==> aurais tu un exemple à fournir (sans donnée confidentielle bien sur)
2) on vérifie que la fiche n'existe pas déjà
si n'existe pas ==> on copie le modèle vide, on renomme la fiche et on rempli directement la fiche
si existe déjà ==> à toi de dire ce que tu veux==> soit on supprime la fiche existante pour la recréér, soit on ajoutte les données à la fiche existante..??
ok pour la modification
si la fiche existe déjà on la supprime
ok
je regarde pour remettre la possibilité de selectionner une ligne à partir d'un combo

et donc.. le point de départ de l'application, c'est dans le Userform2 que ca se passe..
si j'ai bien compris, la partie du haut, c'est "juste" pour visualiser les différentes souches présentes dans le fichier et modifier des lignes==> mais tout ca.. tu peux déjà le faire avec le formulaire "USF_Décagement" (ancien userform5)
à mon avis, cette partie devrait etre supprimée
1) on garderait de la logique ==> 1 Userform = 1 utilité
2) ca limite la quantité de code

le Bouton "Copier noms des onglets + nombre oiseaux"
==> il sert à créer les colonnes N et O des feuilles DE_V et DE_P
dans ton code, tu créées un lien hypertexte vers chaque feuille pour juste après;. les supprimer;.
autant ne pas les mettre..
regarde la simplification que j'y ai apportée
VB:
Private Sub CommandButton8_Click()
Dim Target As Range
Dim TabEleveur() As Variant

    With Sheets("Eleveurs").ListObjects("t_Eleveurs")
        TabEleveur = .DataBodyRange.Value
    End With

    With Sheets("DE_V")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        For i = LBound(TabEleveur, 1) To UBound(TabEleveur, 1)
            If FeuilleExiste(CStr(TabEleveur(i, 2))) Then
                Set Target = .Range("N" & .Rows.Count).End(xlUp).Offset(1, 0)
                'Target.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:=CStr(TabEleveur(i, 2))  'soit on créé un lien hypertexte vers le nom de la souche
                Target = TabEleveur(i, 2) 'on met juste le numéro de souche
                .Range("O" & .Rows.Count).End(xlUp).Offset(1, 0).Value = Sheets(CStr(TabEleveur(i, 2))).Range("M5").Value 'on récupère le nombre d'oiseaux inscrits (V+P)
            End If
        Next i
        Set Zone = .Range("N2").CurrentRegion.Resize(, 2).Offset(1)
        'Zone.Select
         With Zone.Font
            .Name = "Times New Roman"
            .Size = 22
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .TintAndShade = 0
            .ThemeFont = xlThemeFontNone
        End With
    End With
   
    'on fait la meme chose avec la feuille DE_P ==> un simple copier coller suffit
    With Sheets("DE_P")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        .Range("N2").Resize(Zone.Rows.Count, 2) = Zone.Value
    End With
End Sub

et le bouton "FINALISER" (le seul qui ait un intéret sur ce userform) sert à importer les données provenant des éleveurs
de ce que je vois.. tu remplis d'abord la feuille Modèle
et si la fiche éleveur n'existe pas, alors, tu copies le modèle et renomme la feuille puis vide le modèle
et si la fiche eleveur existe..?? tu ne fais rien??

la logique me parait pas la meilleure, il vaudrait mieux ceci:
1) tu ouvres le fichier à importer (TF.xls) ==> aurais tu un exemple à fournir (sans donnée confidentielle bien sur)
2) on vérifie que la fiche n'existe pas déjà
si n'existe pas ==> on copie le modèle vide, on renomme la fiche et on rempli directement la fiche
si existe déjà ==> à toi de dire ce que tu veux==> soit on supprime la fiche existante pour la recréér, soit on ajoutte les données à la fiche existante..??
 
Regarde le fichier joint

avec le TF que tu as posté, il n'y a pas de numéro d'éleveur==> le code proposé en tient compte
j'ai revu aussi la logique
1) SANS saisir le moindre numéro d'éleveur, tu cliques sur "Finaliser"
2) une boite de dialogue te demande de selectionner le fichier à ouvrir ==> tu sélectionnes le TF.xls
3) le code ouvre le fichier, et lit directement le numéro de l'éleveur
s'il n'y en a pas, le code te demande d'en saisir un (pas de controle pour vérifier que tu tapes un numéro et pas du texte
si il y en a un, il est noté dans le textbox
le code vérifie qu'il y a bien des données à importer
les données sont enregistrées dans des tablo vba
le fichier est fermé (plus besoin)
4) vérification que l'éleveur est référencé
5) la feuille de l'éleveur est créée (ou recréée)
6) les données sont collées

et voila... qu'en penses tu?
 

Pièces jointes

ok
je regarde pour remettre la possibilité de selectionner une ligne à partir d'un combo

et donc.. le point de départ de l'application, c'est dans le Userform2 que ca se passe..
si j'ai bien compris, la partie du haut, c'est "juste" pour visualiser les différentes souches présentes dans le fichier et modifier des lignes==> mais tout ca.. tu peux déjà le faire avec le formulaire "USF_Décagement" (ancien userform5)
à mon avis, cette partie devrait etre supprimée
1) on garderait de la logique ==> 1 Userform = 1 utilité
2) ca limite la quantité de code

le Bouton "Copier noms des onglets + nombre oiseaux"
==> il sert à créer les colonnes N et O des feuilles DE_V et DE_P
dans ton code, tu créées un lien hypertexte vers chaque feuille pour juste après;. les supprimer;.
autant ne pas les mettre..
regarde la simplification que j'y ai apportée
VB:
Private Sub CommandButton8_Click()
Dim Target As Range
Dim TabEleveur() As Variant

    With Sheets("Eleveurs").ListObjects("t_Eleveurs")
        TabEleveur = .DataBodyRange.Value
    End With

    With Sheets("DE_V")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        For i = LBound(TabEleveur, 1) To UBound(TabEleveur, 1)
            If FeuilleExiste(CStr(TabEleveur(i, 2))) Then
                Set Target = .Range("N" & .Rows.Count).End(xlUp).Offset(1, 0)
                'Target.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:=CStr(TabEleveur(i, 2))  'soit on créé un lien hypertexte vers le nom de la souche
                Target = TabEleveur(i, 2) 'on met juste le numéro de souche
                .Range("O" & .Rows.Count).End(xlUp).Offset(1, 0).Value = Sheets(CStr(TabEleveur(i, 2))).Range("M5").Value 'on récupère le nombre d'oiseaux inscrits (V+P)
            End If
        Next i
        Set Zone = .Range("N2").CurrentRegion.Resize(, 2).Offset(1)
        'Zone.Select
         With Zone.Font
            .Name = "Times New Roman"
            .Size = 22
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .TintAndShade = 0
            .ThemeFont = xlThemeFontNone
        End With
    End With
 
    'on fait la meme chose avec la feuille DE_P ==> un simple copier coller suffit
    With Sheets("DE_P")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        .Range("N2").Resize(Zone.Rows.Count, 2) = Zone.Value
    End With
End Sub

et le bouton "FINALISER" (le seul qui ait un intéret sur ce userform) sert à importer les données provenant des éleveurs
de ce que je vois.. tu remplis d'abord la feuille Modèle
et si la fiche éleveur n'existe pas, alors, tu copies le modèle et renomme la feuille puis vide le modèle
et si la fiche eleveur existe..?? tu ne fais rien??

la logique me parait pas la meilleure, il vaudrait mieux ceci:
1) tu ouvres le fichier à importer (TF.xls) ==> aurais tu un exemple à fournir (sans donnée confidentielle bien sur)
2) on vérifie que la fiche n'existe pas déjà
si n'existe pas ==> on copie le modèle vide, on renomme la fiche et on rempli directement la fiche
si existe déjà ==> à toi de dire ce que tu veux==> soit on supprime la fiche existante pour la recréér, soit on ajoutte les données à la fiche existante..??

ok
je regarde pour remettre la possibilité de selectionner une ligne à partir d'un combo

et donc.. le point de départ de l'application, c'est dans le Userform2 que ca se passe..
si j'ai bien compris, la partie du haut, c'est "juste" pour visualiser les différentes souches présentes dans le fichier et modifier des lignes==> mais tout ca.. tu peux déjà le faire avec le formulaire "USF_Décagement" (ancien userform5)
à mon avis, cette partie devrait etre supprimée
1) on garderait de la logique ==> 1 Userform = 1 utilité
2) ca limite la quantité de code

le Bouton "Copier noms des onglets + nombre oiseaux"
==> il sert à créer les colonnes N et O des feuilles DE_V et DE_P
dans ton code, tu créées un lien hypertexte vers chaque feuille pour juste après;. les supprimer;.
autant ne pas les mettre..
regarde la simplification que j'y ai apportée
VB:
Private Sub CommandButton8_Click()
Dim Target As Range
Dim TabEleveur() As Variant

    With Sheets("Eleveurs").ListObjects("t_Eleveurs")
        TabEleveur = .DataBodyRange.Value
    End With

    With Sheets("DE_V")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        For i = LBound(TabEleveur, 1) To UBound(TabEleveur, 1)
            If FeuilleExiste(CStr(TabEleveur(i, 2))) Then
                Set Target = .Range("N" & .Rows.Count).End(xlUp).Offset(1, 0)
                'Target.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:=CStr(TabEleveur(i, 2))  'soit on créé un lien hypertexte vers le nom de la souche
                Target = TabEleveur(i, 2) 'on met juste le numéro de souche
                .Range("O" & .Rows.Count).End(xlUp).Offset(1, 0).Value = Sheets(CStr(TabEleveur(i, 2))).Range("M5").Value 'on récupère le nombre d'oiseaux inscrits (V+P)
            End If
        Next i
        Set Zone = .Range("N2").CurrentRegion.Resize(, 2).Offset(1)
        'Zone.Select
         With Zone.Font
            .Name = "Times New Roman"
            .Size = 22
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .TintAndShade = 0
            .ThemeFont = xlThemeFontNone
        End With
    End With
  
    'on fait la meme chose avec la feuille DE_P ==> un simple copier coller suffit
    With Sheets("DE_P")
        .Activate
        .Range("N2").CurrentRegion.Resize(, 2).Offset(1).ClearContents
        .Range("N2").Resize(Zone.Rows.Count, 2) = Zone.Value
    End With
End Sub

et le bouton "FINALISER" (le seul qui ait un intéret sur ce userform) sert à importer les données provenant des éleveurs
de ce que je vois.. tu remplis d'abord la feuille Modèle
et si la fiche éleveur n'existe pas, alors, tu copies le modèle et renomme la feuille puis vide le modèle
et si la fiche eleveur existe..?? tu ne fais rien??

la logique me parait pas la meilleure, il vaudrait mieux ceci:
1) tu ouvres le fichier à importer (TF.xls) ==> aurais tu un exemple à fournir (sans donnée confidentielle bien sur)
2) on vérifie que la fiche n'existe pas déjà
si n'existe pas ==> on copie le modèle vide, on renomme la fiche et on rempli directement la fiche
si existe déjà ==> à toi de dire ce que tu veux==> soit on supprime la fiche existante pour la recréér, soit on ajoutte les données à la fiche existante..??

Regarde le fichier joint

avec le TF que tu as posté, il n'y a pas de numéro d'éleveur==> le code proposé en tient compte
j'ai revu aussi la logique
1) SANS saisir le moindre numéro d'éleveur, tu cliques sur "Finaliser"
2) une boite de dialogue te demande de selectionner le fichier à ouvrir ==> tu sélectionnes le TF.xls
3) le code ouvre le fichier, et lit directement le numéro de l'éleveur
s'il n'y en a pas, le code te demande d'en saisir un (pas de controle pour vérifier que tu tapes un numéro et pas du texte
si il y en a un, il est noté dans le textbox
le code vérifie qu'il y a bien des données à importer
les données sont enregistrées dans des tablo vba
le fichier est fermé (plus besoin)
4) vérification que l'éleveur est référencé
5) la feuille de l'éleveur est créée (ou recréée)
6) les données sont collées

et voila... qu'en penses tu?
j'ai testé s'est super bravo
 
Pour finir avec ce formulaire 2 (que j'ai renommé "USF_Encagement")

la partie haute (Frame Feuille Eleveur avec listbox, Textbox, combo, bouton modifier)
elle te sert à quoi? à modifier le contenu de la feuille que tu vas (ou viens) importer pour corriger d'éventuelles erreurs dans la fiche d'inscription?
si oui
les modifs, tu les appliques directement sur le fichier "TF.xls" ou juste dans la feuille créée?
et dans ce cas.. le combobox pour choisir la souche.. n'est pas utile..
si non
il me semble redondant avec le formulaire "Decagement"
 
Pour finir avec ce formulaire 2 (que j'ai renommé "USF_Encagement")

la partie haute (Frame Feuille Eleveur avec listbox, Textbox, combo, bouton modifier)
elle te sert à quoi? à modifier le contenu de la feuille que tu vas (ou viens) importer pour corriger d'éventuelles erreurs dans la fiche d'inscription?
si oui
les modifs, tu les appliques directement sur le fichier "TF.xls" ou juste dans la feuille créée?
et dans ce cas.. le combobox pour choisir la souche.. n'est pas utile..
si non
il me semble redondant avec le formulaire "Decagement"
Lors de l'encagement, qui se situe deux ou trois semaines après avoir reçu les feuilles d'inscription nous sommes souvent obligés de modifier la feuille issue de TF et donc modifier la feuille éleveur car celui-ci a changé plusieurs oiseaux, donc oui il faut modifier au moment de l'encagement.
Décagement nous verrons qu'il s'agit de modifications consécutives à la vente par deux ou plusieurs personnes.
Bonne nuit
 
OK, c'est bien ce que j'imaginais..
ce formulaire sert à corrigner ce que tu viens d'importer.. donc finalement, pas besoin du combo pour choisir un éleveur, surtout que dans certaines TF, il se peut que la colonne "Souche" ne soit pas complètement remplie de ce que j'ai vu..

je reviens avec une proposition: tu me diras ce que tu en penses
 
OK, c'est bien ce que j'imaginais..
ce formulaire sert à corrigner ce que tu viens d'importer.. donc finalement, pas besoin du combo pour choisir un éleveur, surtout que dans certaines TF, il se peut que la colonne "Souche" ne soit pas complètement remplie de ce que j'ai vu..

je reviens avec une proposition: tu me diras ce que tu en penses
bonjour,
La colonne souche n'est pas remplie je la remplis lors de la vente.
Comme je vous l'ai dis hier je ne corrige que plusieurs semaines après, j'utilise la combobox pour sélectionner un éleveur dans la listbox

J'ai pensé cette nuit, que certains éleveurs avaient 2 feuilles d'inscription donc 2 TF donc quand j'avais importé la première feuille je transformais la feuille ex: 6100 (1) pour pouvoir importer la seconde à voir?
Merci
 
Hello
regarde la PJ

1) j'ai créé une copie de la feuille TF que tu as fournie
dans cette copie, j'ai noté le numéro de feuille 2 ==> les numéros de ligne commencent donc à 21
2) dans le formulaire d'encagement
clic sur "finaliser" pour importer la feuille TF
je tape un numéro d'éleveur (1102 par exemple)
==> la feuille est importée et l'onglet est créé
==> le formulaire RESTE ouvert
nouveau clic sur "finaliser" pour importer la feuille TF2
je tape le meme numéro (1102)
==> un message m'indique que la feuille existe déja et te laisse 3 choix
1) remplacer la feuille existante
2) ajouter à la feuille existante==> les lignes à partir de 21 sont ajoutées dans la meme feuille
3) annuler
note: La colonne "Souche" est remplie automatiquement avec le numéro que tu as saisi (1102)
il y a peut être une condition à ajouter pour ne mettre le numéro que sur certaines lignes..?
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
1 K
Retour