Recopier infos en VB

incubus20851

XLDnaute Occasionnel
Macro Recopier valeurs non vide dans onglet

Bonjour,

Voilà j'ai un petit soucis.

J'ai un tableau avec des heures inscrite et j'ai un onglet qui s'appelle "ARCHIVE"

A chaque fois que j'appuie sur le bouton imprimer qui se trouve sur le tableau il me recopie les données dans l'onglet Archive.

Ca utilise du code visual basic.

Jusqu'ici tout va bien, par contre j'aimerais qu'il me recopie que les lignes qui sont renseignées et qu'il ne me mette pas de ligne blanche.

Voici un fichier exemple en pièce jointe, ca sera plus simple je pense.

Si quelqu'un a une idée ? ca serait chouette

Merci d'avance !

A bientôt
 

Pièces jointes

  • TEST.zip
    17.1 KB · Affichages: 33
  • TEST.zip
    17.1 KB · Affichages: 33
  • TEST.zip
    17.1 KB · Affichages: 31
Dernière édition:

Odesta

XLDnaute Impliqué
Re : Recopier infos en VB

Bonjour incubus20851

Voici une proposition de code

Code:
Public derniere_ligne As Integer
Public ligne As Integer

Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Row = 4 And Target.Column = 14 Then
        
        'création d'un variable indiquand le numéros de la dernière ligne plus 1
        derniere_ligne = Sheets("ARCHIVE").Range("A65000").End(xlUp).Row + 1
        
        'pour toutes les lignes de 8 à 22 (fait références aux caractéristiques du formulaire)
        For ligne = 8 To 22
        
        'si la cellule de l'identifiant n'est pas vide alors :
        If Cells(ligne, 1).Value <> "" Then
        
        'copie des données : ici, je préfère utiliser 'cells' que 'range' cela permet d'utiliser plus facilement mes deux variables, ligne et dernière ligne
        Sheets("ARCHIVE").Cells(derniere_ligne, 1).Value = Range("M25").Value
        Sheets("ARCHIVE").Cells(derniere_ligne, 2).Value = Cells(ligne, 1).Value
        Sheets("ARCHIVE").Cells(derniere_ligne, 7).Value = Cells(ligne, 11).Value
        Sheets("ARCHIVE").Cells(derniere_ligne, 8).Value = Cells(ligne, 12).Value
        Sheets("ARCHIVE").Cells(derniere_ligne, 9).Value = Cells(ligne, 13).Value
        
        'incrémentation de la dernière ligne
        derniere_ligne = derniere_ligne + 1
        
        'cette méthode permet de prévenir le cas ou une ligne est blanche dans la feuille H S, car on connait nos utilisateurs...ils font toujours ce qui n'est pas prévue !
        'ici, la seule contrainte : avoir l'identifiant de rempli
        End If
        Next ligne
        
        Range("A4").Select
    End If
End Sub
 

incubus20851

XLDnaute Occasionnel
Re : Recopier infos en VB

Nickel !!

Ca marche encore mieux que je ne l'esperait !!

Merci beaucoup !!

J'ai une petite question, quand un utilisateur clique deux fois sur le bouton imprimer sans faire expres, cela s'inscrit deux fois dans l'onglet ARCHIVES, ce qui est logique, mais est-ce qu'il y aurait un rempart pour pas qu'il le mette 2 fois quand ce sont des données totalement identique ?

Et encore mieux si il imprime le document et qu'il se rend compte qu'il a oublié une ligne, si il la rajoute et réimprime est-ce que ça peut rajouter juste la ligne oublié précédemment ?

Je sais j'en demande beaucoup... :-§

Merci !
A bientôt
 

Odesta

XLDnaute Impliqué
Re : Recopier infos en VB

Comme je dis souvent : tout est possible. Mais c'est plus long.

Pour réaliser votre demande, il faut vérifier que les données à mettre en archives n'y sont pas déjà. Cela demande de réaliser un test avant la copie de chaque données, ce qui n'est pas évident.

Il faut pour cela concatener toutes les données de manière à obtenir une donneés unique par ligne, et comparer ce résultat à toutes les lignes déjà présentes.
 
Dernière édition:

incubus20851

XLDnaute Occasionnel
Re : Recopier infos en VB

Aïe,

Effectivement, ça a l'air compliqué.

J'pense qu'il existe pas d'autres solutions plus simple alors.

Ben esperons qu'il ne cliqueront pas deux fois ! :)

Merci en tout cas pour cette aide précieuse !

Si jamais y'aurai des idées pour améliorer le fichier, je suis preneur

A bientôt
 

Odesta

XLDnaute Impliqué
Re : Recopier infos en VB

Ce qui donnerait :
Code:
Public derniere_ligne As Integer
Public ligne As Integer
Public valeur_conca As String
Public valeur_test As String
Public presence_ligne_equivalente As Boolean
Public ligne_archive As Integer

Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Row = 4 And Target.Column = 14 Then
        
        'création d'une variable indiquant le numéro de la dernière ligne plus 1
        derniere_ligne = Sheets("ARCHIVE").Range("A65000").End(xlUp).Row + 1
        
        'pour toutes les lignes de 8 à 22 (fait référence aux caractéristiques du formulaire)
        For ligne = 8 To 22
        
        'si la cellule de l'identifiant n'est pas vide alors :
        If Cells(ligne, 1).Value <> "" Then
        

        
        'réalisation de la valeur de test : 1) une variable booléenne 2) la valeur concaténée
        presence_ligne_equivalente = False
        valeur_conca = Range("M25").Value & Cells(ligne, 1).Value & Cells(ligne, 11).Value & Cells(ligne, 12).Value & Cells(ligne, 13).Value
            'vérfication que la valeur n'existe pas
            For ligne_archive = 4 To derniere_ligne - 1 '(pour chaque fichier de ARCHIVE)
                'réaliser la valeur concaténée
                valeur_test = Sheets("ARCHIVE").Cells(ligne_archive, 1).Value & Sheets("ARCHIVE").Cells(ligne_archive, 2).Value & Sheets("ARCHIVE").Cells(ligne_archive, 7).Value & Sheets("ARCHIVE").Cells(ligne_archive, 8).Value & Sheets("ARCHIVE").Cells(ligne_archive, 9).Value
                'tester cette valeur à celle de la ligne en cours
                If valeur_test = valeur_conca Then
                    presence_ligne_equivalente = True
                End If
            Next
        
        'si le test n'a pas donné de résultat, copier les nouvelles lignes
        If Not (presence_ligne_equivalente) Then
        'copie des données : ici, je préfère utiliser 'cells' que 'range' cela permet d'utiliser plus facilement mes deux variables, ligne et dernière ligne
        
        Sheets("ARCHIVE").Cells(derniere_ligne, 1).Value = Range("M25").Value
        Sheets("ARCHIVE").Cells(derniere_ligne, 2).Value = Cells(ligne, 1).Value
        Sheets("ARCHIVE").Cells(derniere_ligne, 7).Value = Cells(ligne, 11).Value
        Sheets("ARCHIVE").Cells(derniere_ligne, 8).Value = Cells(ligne, 12).Value
        Sheets("ARCHIVE").Cells(derniere_ligne, 9).Value = Cells(ligne, 13).Value
        
        'incrémentation de la dernière ligne
        derniere_ligne = derniere_ligne + 1
        
        End If
        'cette méthode permet de prévenir le cas ou une ligne est blanche dans la feuille H S, car on connait nos utilisateurs...ils font toujours ce qui n'est pas prévu !
        'ici, la seule contrainte : avoir l'identifiant de rempli
        End If
        Next ligne
        
        Range("A4").Select
    End If
End Sub


Cordialement

Olivier
 
Dernière édition:

incubus20851

XLDnaute Occasionnel
Re : Recopier infos en VB

Eh beh, honnêtement je suis bluffé. C'est super

je vais déchiffrer le code tranquillement histoire de progresser en vb.

Dernière petite question,

quel code il faut rajouter et ou? pour avoir un bouton comme celui imprimer

mais qui s appèlerai "maj" et qui servirai a faire la même chose mais sans l'impression histoire de sauvegarder du papier pour notre planète ?

Merci encore

a bientôt
 

Odesta

XLDnaute Impliqué
Re : Recopier infos en VB

Rajouter simplement un bouton, assigner-lui l'appel d'une macro.

Il faut donc renommer cette Privat Sub en macro (exemple Sub Sauvegarde) et virer tous les trucs inutiles !

Et voila !
(ca parrait simple comme ca hein.... niarkniark)
(je pense que vous pouvez chercher sur ce site comment faire un bouton et y assigner une macro, et pour la simplification de la macro, ca vous paraittra limpide après avoir épluché chaque ligne)

bonne journée

Olivier
 

incubus20851

XLDnaute Occasionnel
Re : Recopier infos en VB

Ok super Merci,

J'ai reussi à rajouter le bouton.

Par contre je me suis rendu compte d'un truc.

J'ai protégé l'onglet ARCHIVE pour éviter que les gens mettent les mains dans le camboui !
Quand je protege et que j'utilise le fichier sur ma machine tout marche bien, mais quand je le teste sur un autre poste, il me met qu'il faut enlever la protection de l'onglet ARCHIVE.

Du coup, impossible de proteger cette feuille sans faire bugger le recopiage.

Une solution à ça ?

J'ai également remarqué que si une ligne est renseignée, que la personne imprime et qu'ensuite elle se rend compte que les horaires était pas bon, et qu'elle rectifie cette ligne et reimprime, la ligne se met deux fois dans l'onglet ARCHIVE.
Il y aurai un moyen pour que dans ce cas-ci il modifie juste la ligne en question ?

EXEMPLE :
Première fois 08H00 | 09H00 | 1,00 et qu'il modifie 08H00| 10H00 | 2,00

Qu'il mette dans l'onglet ARCHIVE 2,00 et pas une ligne avec 1,00 et une autre avec 2,00. Car du coup dans ma récap ca ferait 3,00 au lieu de 2,00.

Histoire de corcer encore l'histoire :)

Merci,
A bientôt
 

Odesta

XLDnaute Impliqué
Re : Recopier infos en VB

Bonjour

Pour le premier problème :
Il faut simplement Oter la protection en début de programme, puis la remettre en fin de programme. je n'ai pas le code exacte en tête, mais une petite macro auto vous le donnera rapidement.

Pour le deuxieme probleme :
il faut limiter la vérification au champs uniques (et donc pas à l'heure) et il faut remplacer l'heure (sur la bonne ligne) dans le cas où elle est différente.
Pouvez-vous me joindre le dernier fichier, c'est plus simple pour proposer un nouveau code ?

Cordialement
Olivier
 

Odesta

XLDnaute Impliqué
Re : Recopier infos en VB

Ok, je remarque de le code que j'ai proposer marche mais n'est pas adapté, car en cas de temps équivalent, il peut y avoir des erreurs.

Dans l'archive, tu va devoir indiquer la date et l'heure, c'est très important pour que les données archivées soient fiables.

Une fois ceci fait, il va falloir se poser la question sur ce besoin de mise à jour.

Je ne pense pas qu'il faille utiliser le même utilitaire. Peut-être qu'un bouton différent, avec une remontée des données pour mise à jour manuelle serait plus pertinente.

En effet, une modification de date comporte un impact important sur la fiabilité des données. Car tout est dans la 'clef unique' qui permet de lire la ligne. Si cette ligne existe déja, elle n'est pas remplacer, conclusion, si, lors de l'ajout de nouvelle fiche, la clef n'est pas unique, il n'y aura jamais de nouvelle ligne....



O
 

incubus20851

XLDnaute Occasionnel
Re : Recopier infos en VB

Je t'avoue ne pas avoir tout compris,

Mais je pense que tu as raison. Disons qu'à la place du bouton MAJ ce bouton pourrait être remplacé par un bouton Correction.

Qui permettrai de modifier les données et mettre à jour la base si besoin.

Mais après au niveau du code etc... j'vois pas trop comment contourner le problème.

J'avoue que c'est pas évident, et qu'à mon avis il n'y a que 2 cas de figure où il y a une limite à la validité des données archives

- Quand la personne imprime et se trompe de date et reimprime la meme chose avec une nouvelle date. Aucun rempart contre ça je suis d'accord. Car il peut tres bien arrivé que les mêmes gens face les memes horaires deux jours de suite.

- Quand la personne imprime et se rend compte qu'il s'est trompé sur un horaire et modifie la ligne. Une nouvelle ligne est à ce moment là ajouté dans la base Archives ce qui fait un doublon. La seule solution serait une retouche manuelle ?

Mais je pense qu'avec ces deux seules failles, c'est déjà pas mal.
 

Discussions similaires

Réponses
8
Affichages
452

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16