Copie automatique ligne vers une feuille

Résolu/Fermé
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 - 26 oct. 2010 à 15:06
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 - 31 oct. 2010 à 19:51
Bonjour à tous,

J'ai créé un classeur dans lequel il y a une feuille qui me sert de base de donnée. Cette feuille se compose d'environ 6000 lignes et 10 colonnes. La première ligne est réservée au titre. Sur une autre feuille j'ai un bordereau que je dois remplir en rentrant un N° carte en colonne « D ». Quand ce N° est rentré et que la correspondance est trouvée dans la base de donnée, d'autres informations sont affichées dans les colonnes B, C, D et G. Quand la correspondance n'est pas trouvée une succession InputBox apparaissent pour demander un N°, un Nom et un Prénom ces informations sont ensuite insérées en colonne D et G. Ce que je souhaiterais c'est que la ligne ainsi crée soit copiée automa-tiquement sur la première ligne vide de la bas de données.
J'ai regardé sur le forum et je pense avoir trouvé la solution dans une réponse de Mike31 (copie automatique ligne vers onglet) mais les liens vers les fichiers ne sont plus actifs. Alors si lui ou quelqu'un d'autre avait une solution macro à mon problème j'en serais le plus heureux.
Merci d'avance pour l'aide que vous pourriez m'apporter.
Cordialement.
Mistral
A voir également:

9 réponses

Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
26 oct. 2010 à 15:20
Petite précision je suis avec Excel 2003
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 28/10/2010 à 11:57
Bonjour,
Tes InputBox font quoi? Je suppose que lorsque tu remplit une InputBox et que tu cliques sur OK, la valeur que tu as saisi va quelque part? Si oui, il suffit d'envoyer cette valeur dans deux endroits...
Supposons, le code de ton InputBox :

Dim result As String 
result = InputBox("Indiquer ici le numéro de dossier", "Saisie 1") 
If result <> "" Then 
    Sheets("Feuil2").Range("D1").Value = result 
End If

Il suffit d'y ajouter : "inscrire result en dessous de ma base de données", un peu comme ceci :

Dim result As String 
Dim derlig As Integer 
result = InputBox("Indiquer ici le numéro de dossier", "Saisie 1") 
If result <> "" Then 
    Sheets("Feuil2").Range("D1").Value = result 
With Sheets("base de donnees") 
   .Range("A65536").End(xlUp).Offset(1, 0).Value = result 
End With
End If


Cordialement,
-- Il n'y a rien de tel qu'une question idiote, seulement une réponse idiote. A.Einstein --
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
28 oct. 2010 à 15:05
Bonjour Pijaku,

Tout d'abord merci de prendre sur ton temps pour m'aider.
C'est exactement ça, quand je rentre un N° de carte pour lequel je ne trouve pas la concordance dans la base de données j'ai 3 InputBox qui s'ouvre les unes après les autres. La première demande un N°, la seconde le Nom et la dernière le Prénom. C'est mis au format nom propre est s'est ensuite écrit sur la ligne courante en colonne « I ».
Ci-dessous un lien vers un fichier exemple ou tout se trouve sur la même feuille :

http://www.cijoint.fr/cjlink.php?file=cj201010/cijN5vrb1q.xls

La cellule A de ce classeur contient dans son commentaire le principe de fonctionnement.
Quand je saisi un N° de carte appartenant à un adhérent connu et à jour de sa cotisation son nom s'affiche en noir sur fond blanc. Si je saisi un N° de carte appartenant à un adhérent connu mais non à jour de sa cotisation son nom s'affiche en noir sur fon jaune. Si je saisi un N° de carte pour lequel la concordance dans la bas de donnée n'est pas trouvée, c'est là que les InputBox apparaissent.
A partir du moment où le nom saisi apparaît dans la colonne G, je souhaiterais inscrire ce nouveau nom dans la base de donnée mais il me faut aussi renseigner les autres colonnes de cette base à savoir et dans l'exemple joint:
Colonne Y le N° d'UR ce numéro est contenu dans une cellule nommée Num_UR
Colonne Z le N° de club ce numéro est contenu dans une cellule nommée Num_Club
Colonne AA le N° de carte qui est le N° saisi
Colonne AC le nom de l'auteur c'est celui saisi
Colonne AD le nom du club ce nom est contenu dans une cellule nommée Nom_Club
Colonne AF l'année ce millésime est contenu dans une cellule nommée Annee
Colonne AG le nom de l'UR ce nom est contenu dans une cellule nommée Nom_UR
Les cellules nommées ne figurent pas sur cet exemple.

J'espère avoir été clair et si tu souhaite d'autres précisions n'hésite pas à me solliciter.
Merci d'avance
Mistral
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 oct. 2010 à 15:41
1- le plus simple serait peut être de demander au créateur de ce classeur Excel de te faire ça.
2- Si tu y tiens on va se pencher la dessus...
3- tes codes InputBox sont :
            If Cells(sel.Row, 17).Value = 1 Then
                   
' Surveille la validité du N° d'un non adhérent : > 9000 et numérique
                If sel.Value < 9000 Or Not IsNumeric(sel.Value) Then
                    MsgBox ("Pour un auteur sans carte fédérale vous devez" & vbCr & "obligatoirement saisir un N° > à 9000."), vbInformation, "Fédération Photographique de Française"
                    NumCarte = Application.InputBox("Saisissez un N° de carte > à 9000." & vbCr & vbCr & "Validation par OK.", "Numéro de participation.", , 300, 140)
                    Cells(sel.Row, 4).Value = NumCarte                End If
' Ouverture de la boite pour saisir le nom et contrôle.
                Nom = Application.InputBox("Saisissez le Nom." & vbCr & vbCr & "Validation par OK.", "Nom d'un non adhérent.", , 300, 140)
                If Nom = False Then
                    sel.Value = ""
                    sel.Select
                    Exit Sub                'Verife si la toucher Annuler est active.
                End If
' Ouverture de la boite pour saisir le prénom et contrôle.
                Pnom = Application.InputBox("Saisissez le prénom." & vbCr & vbCr & "Validation par OK.", "Prénom d'un non adhérent.", , 300, 140)
                If Pnom = False Then
                    sel.Value = ""
                    sel.Select
                                 Exit Sub                'Vérifie si la toucher Annuler est active.
                End If
' Mise au format nom propre (1er lettre en majuscule).
                Nom = UCase(Left(Nom, 1)) & LCase(Mid(Nom, 2))
                Pnom = UCase(Left(Pnom, 1)) & LCase(Mid(Pnom, 2))

' Remplacement du contenu de la cellule en erreur.
                ' ActiveSheet.Unprotect ("ccm")
                Cells(sel.Row, 9).Value = Nom & " " & Pnom                ' ActiveSheet.Protect ("ccm")
            End If

En gras les lignes concernant les renvois vers des cellules de ta feuille des valeurs saisies. Il suffit donc d'ajouter sous ces 2 lignes un même renvoi vers ta base de données. En parlant d'elle, elle se trouve ou ta base de données? Autre feuille? Autre Classeur? Si oui classeur déjà ouvert? fermé?
En bref, tu vois, beaucoup de questions alors que cela ne prendra que 5 minutes au "créateur"...
Tu dis...
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
28 oct. 2010 à 15:55
Le créateur c'est moi...
Mais je fais beaucoup de chose en cherchant sur le net et avec l'enregistreur de macro. Ce qui explique cette programation pour le moins decousue.
Mais je suis à la limite de mes possibilités.
Dans l'exemple que je t'ai envoyé tout est sur la meme feuille.
Sur le classeur original tout est dans le meme classeur et la base de donnée est sur une feuille appelée"Liste".
Tout se passe sur le meme classeur et c'est surement plus simple ainsi.
A toi de voir le temps que tu peux consacrer à mon problème.
Cordialement
Mistral

PS : je ne pourrais plus te répondre aujourd'hui car je dois sortir.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
28 oct. 2010 à 15:58
Bon on va faire simple alors. Tu veux que lorsque les 2 Inpubox sont lancées, soit lorsque le "gars" il est inconnu au bataillon, apparaisse magicalement un petit formulaire à compléter qui irait renseigner ta base de données? Cela t'irais comme cela?
Tu dis...
A demain
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
29 oct. 2010 à 07:57
Bonjour Pijaku,
Le but de cette modif est :
- Maintenir la base de donnée à jour.
- Eviter de ressaisir plusieurs fois le nom et prénom d'un inconnu.
Pour cela, je ne pense pas qu'il soit nécessaire de créer un « formulaire supplémentaire car une fois que le nom d'un inconnu est affiché dans la colonne « G » on a notre disposition toute les informations nécessaires pour remplir une ligne.
NumCarte, Nom et Pnom sont les trois variables qui ont été renseignées par les InputBox. Toutes les autres informations sont disponibles dans des cellules « nommées » du classeur. Ma base de données est organisée 9 colonnes, de A à I, et 6400 lignes. La première ligne est une ligne de titres.
La colonne A c'est le N° d'UR qui prend la valeur de [Num_UR]
La colonne B c'est le N° de club qui prend la valeur de [Num_Club]
La colonne D est un calcule réalisé avec la fonction : =TEXTE(A2;"00")&TEXTE(B2;"0000")&TEXTE (C2;"0000")
La colonne C c'est le N° de carte qui prend la valeur de la variable NumCarte (1ere InputBox)
La colonne E c'est le nom et prénom qui prend la valeur des variables Nom+Pnom (2iem et 3iem InputBox)
La colonne F c'est le nom du club qui prend la valeur de [Nom_Club]
La colonne G sera forcée à « 9 » pour toute nouvelles lignes insérées
La colonne H c'est le millésime de l'année qui prend la valeur de [Annee]
La colonne I c'est le nom de l'UR qui prend la valeur de [Nom_UR]
L'insertion d'une ligne dans la base de donnée ne se produit que quant on passe dans le
« Case 41 to 49 »
et uniquement si un auteur est inconnu.
http://www.cijoint.fr/cjlink.php?file=cj201010/cijLtAeNQa.xls
Ci-dessus un lien vers mon fichier exemple ou j'ai rentré un inconnu (Dubois Paul) j'ai ajouté un ligne supplémentaire manuellement dans la base pour m'assurer que si je rentrais un nouvelle fois le N° de carte 9003 (Dubois Paul) celui-ci était reconnu.
Cordialement
Mistral
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
29 oct. 2010 à 09:01
Salut,
Après une petite réflexion avec mon groupe de travail (mon café et moi), une solution serait d'ajouter un petit bout de code après ton InputBox prénom. Cela donnerait quelque chose comme :
1- InputBox NumCarte
2- InputBox Nom
3- InputBox Pnom
4- Msgbox "Vous confirmez l'inscription n°NumCarte, de NOM & PRENOM"
5- OUI NON Si choix non, on sort de la procédure (Exit Sub)
6- Si oui alors on enregistre les données dans la base de données et on continue la procédure.

Ca se passerait donc ici dans ton code :
' Ouverture de la boite pour saisir le prénom et contrôle.
                Pnom = Application.InputBox("Saisissez le prénom." & vbCr & vbCr & "Validation par OK.", "Prénom d'un non adhérent.", , 300, 140)
                If Pnom = False Then
                    sel.Value = ""
                    sel.Select
                                 Exit Sub                'Vérifie si la toucher Annuler est active.
                End If
' Mise au format nom propre (1er lettre en majuscule).
                Nom = UCase(Left(Nom, 1)) & LCase(Mid(Nom, 2))
                Pnom = UCase(Left(Pnom, 1)) & LCase(Mid(Pnom, 2))
' Remplacement du contenu de la cellule en erreur.
                ' ActiveSheet.Unprotect ("ccm")
                Cells(sel.Row, 9).Value = Nom & " " & Pnom
                ' ActiveSheet.Protect ("ccm")
            End If
------------------------ICI------------------------

            sel.Offset(1, 0).Select


Il faudrait ajouter, la ou est écrit ICI :

Dim reponse As String
Dim Derlig As Integer
reponse = MsgBox("Vous confirmez l'inscription N° " & NumCarte & "de : " Nom & " " & Pnom, vbYesNo)
Select Case reponse
Case vbYes
With Sheets("Liste")
    Derlig = .Range("A65536").End(xlUp).Offset(1, 0).Row
    .Cells(Derlig, 1).Value = Sheets("Bordereau").Cells(sel.Row, 2).Value ' à vérifier je ne sais pas ou tu le trouve...
    .Cells(Derlig, 2).Value = Sheets("Bordereau").Cells(sel.Row, 3).Value 'je ne sais pas ou tu le trouve...
    .Cells(Derlig, 3).Value = NumCarte 
etc etc...
End With
Case vbNo
Exit Sub
End Select


A adapter, bien sur car : Num_UR 'je ne sais pas ou tu le trouve... Il faut donc indiquer là le Num_UR correspondant...
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
29 oct. 2010 à 09:32
Je regarde ça et je teste et je te dis ça dans la journée
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
29 oct. 2010 à 17:04
Re,

Ta solution est plutôt pas mal et je suis arrivé à faire à peut pret ce que je voulais.
Avec quelques adaptations je parviens bien à ajouter à ma base de données les auteurs inconnus. Si, après avoir transferer dans ma base un N° inconnu et que je rentre de nouveau ce N° dans mon bordereau il est bien trouvé et c'est bien là le but de la manip.
Il me reste juste un petit problème à régler. En effet il faudrait que je puisse réaliser un test pour ne pas transferer dans ma base deux fois le même N° de carte. Je pense que ce test est à faire juste après la MsBox de confirmation d'inscription. Autrement dit il faudrait tester si la colonne D de ma base contient ou pas le N° de carte saisi.
Actuellement si je reponds oui je transfert vers la base, si je réponds non j'efface ma ligne sur le bordereau et il n'y a pas de transfert.
Aurais-tu une piste pour celà?
Cordialement
Mistral
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 29/10/2010 à 20:56
Il faut que tu cherches du côté de la méthode .find de VBA.
Quelque chose comme cela : (étant à la maison, je ne peux plus rien tester...) :
Dim rngTrouve As Range 
With Sheets("Liste").Columns(4) 'dans la feuille liste colonne D 
   Set rngTrouve = .Cells.Find(what:=NumCarte) 
    If rngTrouve Is Nothing Then 
        'ici place le code si le numéro n'existe pas 
    Else 
        'ici place le code si le numéro existe 
    End If 
End With
    Set rngTrouve = Nothing

Et comme je cite mes sources...
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
31 oct. 2010 à 19:51
Bonsoir Pijaku,

Ca y est je suis arrivé à mes fins.
Non sans mal car j'ai été obligé de rajouter des contrôles pour rester cohérent entre les N° de cartes et les noms.
Mais ce soir soir ça marche impécable.
Je te remercie sincerement pour tes conseils et ton aide.
Cordialement
Mistral

PS : J'ouvre un nouveaux sujet sur l'envoi d'une feuille par mail depuis Excel.
Si tu as une idée sur le sujet...
0