Problème sous Excel

BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008 - 10 janv. 2008 à 15:31
BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008 - 12 janv. 2008 à 11:31
Bonjour à tous,

J'espère qu'un maître dans l'art (obscure pour moi ) du Visual Basic pourra m'aider.
Donc voilà :

Je crée un fichier Excel avec 2 feuilles.

La feuille n°1 contient environ 600 lignes.

Sur chaque ligne : 1ere colonne => Nom ; 2eme colonne => Prénom ; 3eme colonne => Adresse... etc etc

J'ai créé une macro qui permet, lorsque l'on clique sur un bouton, de copier nom, prénom, adresse... et de les coller dans des cellules de la feuille n°2. En fait cela me sert à imprimer ces informations au bon endroit sur des documents pré-remplis.

Bref, jusque là, rien de compliqué...

MAIS (il y a toujours un "mais" ) comment faire pour ne pas avoir à effectuer 600 macros ? 

Ca fait 2 jours que je tourne le problème dans tous les sens et franchement je ne trouve pas de solution à part de créer une macro et un boutton pour la ligne 1, une macro et un boutton pour la ligne 2, une macro et un boutton pour la ligne 3 etc etc x 600 !!!

Donc s'il vous plait... dites-moi qu'il existe une solution *croise les doigts*

D'avance merci...

15 réponses

PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
10 janv. 2008 à 15:42
salut,
montre nous un bout de code pour qu'on sache de quoi il en retourne?
(et qu'on puisse savoir aussi si c'est du VBA (excel) ou du VB6 (puisque c'est là où tu a classé ton topic....))
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008
10 janv. 2008 à 15:45
Voilà, voilà (merci pour la rapidité de la réponse ;))

'
    Range("A2").Select
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("E3").Select
    ActiveSheet.Paste
    Sheets("Fichier clients").Select
    Range("E2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C7").Select
    ActiveSheet.Paste
    Sheets("Fichier clients").Select
    Range("F2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C8").Select
    ActiveSheet.Paste
    Sheets("Fichier clients").Select
    Range("D2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C9").Select
    ActiveSheet.Paste
    Sheets("Fichier clients").Select
    Range("B2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C10").Select
    ActiveSheet.Paste
    Sheets("Fichier clients").Select
    Range("C2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C12").Select
    ActiveSheet.Paste
    Sheets("Fichier clients").Select
    Range("G2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C13").Select
    ActiveSheet.Paste
End Sub

C'est tout bête, mais j'ai franchement pas le courage de me la retaper 600 fois
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
10 janv. 2008 à 16:04
umm...

pour commencer tu gagnerais un sacré nombre de lignes en te faisant une petite procédure non?

genre :
Sub CopyPaste(ByVal sSheetSrc As String, sCellSrc As String, ByVal sSheetDest As String, sCellDest As String)
    Sheets(sSheetSrc).Select
    Range(sCellSrc).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets(sSheetDest).Select
    Range(sCellDest).Select
    ActiveSheet.Paste
End Sub

celà dit passer par du copier coller.... en plus de l'affichage, c'est un peu gourmant
ce genre de code ne fonctionnerait pas? :
Sub CopyPast(ByVal sSheetSrc As String, sCellSrc As String, ByVal sSheetDest As String, sCellDest As String)
    Sheets(sSheetDest).Range(sCellDest).Value =
Sheets(sSheetSrc).Range(sCellSrc).Value
End Sub

d'après le morceau que tu as copié, les zones n'ont pas l'air de se suivre...
si tu peux les organiser, tu dois sans doute pouvoir boucler facilement

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
0
antoine_ferard Messages postés 222 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 18 février 2011 3
10 janv. 2008 à 16:28
Pour éviter de mettre 600 boutons (!!!!) tu pourrais cliquer sur la ligne à "récupérer", et en cliquant sur le bouton (unique), tu lance la procédure de "Monsieur PCPT" avec en paramètre les valeurs de la ligne que tu viens de sélectionner.
C'est juste un petit avis..... voilà, bon courage (t'en auras pas forcément besoin j'te rassure, rien de compliquer dans ce que tu demandes, i think) 

''***************************************************************************
...à votre service
Thanks & Peace
Tonio
0

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

Posez votre question
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
10 janv. 2008 à 16:43
Salut,
OU alors si tu ne vaux pas avoir à selectionner une ligne tu fais une boucle (valable si il y a une "logique" dans la boucle)

@+: Ju£i?n
Pensez: Réponse acceptée
0
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
10 janv. 2008 à 17:00
Bonjour,

Manifestement, c'est du VBA...

Tu as fait la premiere etape de la creation d'une macro sur Excel.
Maintenant, il faut reflechir pour automatiser le processus sur les 600 lignes de ton fichier.

Voila une solution :

Sub classement()


    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim l As Integer
    Dim nblignes As Integer
    ' J'ai defini mes variables
   
    Sheets("Fichier clients").Select
    nblignes = Cells.SpecialCells(xlCellTypeLastCell).Row
    ' Le nombre de ligne de ma feuille de calcul
   
   
    For i = 2 To nblignes
        ' Pour toutes les lignes de ton fichiers, du debut a la fin...
       
        j = i - 2
       
        Sheets("Carton à imprimer").Select
        ' Je me mets dans la feuille de calcul qui va etre remplie
   
        ' Je suppose que pour chaque ligne dans "Fichier clients",
        '   je remplis une fiche dans "Carton à imprimer" toutes les 20 lignes
   
       
        ' 1er cas, A2 va en E3, puis A3 en E23, etc...
        ' k est le numero de la ligne dans "Carton à imprimer",
        '     l est le nombre qu'il faut soustraire a k pour tomber sur la cellule a copier dans "Fichier clients"
        k = 20 * j + 3
        l = -19 * j - 1
        Range("E" & k).Select
        ActiveCell.FormulaR1C1 = "='Fichier clients'!R[" & l & "]C[-4]"
       
        ' Meme principe
        k = 20 * j + 7
        l = -19 * j - 5
        Range("C" & k).Select
        ActiveCell.FormulaR1C1 = "='Fichier clients'!R[" & l & "]C[2]"
       
        ' Meme principe
        k = 20 * j + 9
        l = -19 * j - 7
        Range("C" & k).Select
        ActiveCell.FormulaR1C1 = "='Fichier clients'!R[" & l & "]C[1]"
       
        ' Meme principe
        k = 20 * j + 10
        l = -19 * j - 8
        Range("C" & k).Select
        ActiveCell.FormulaR1C1 = "='Fichier clients'!R[" & l & "]C[-1]"
       
        ' Meme principe
        k = 20 * j + 12
        l = -19 * j - 10
        Range("C" & k).Select
        ActiveCell.FormulaR1C1 = "='Fichier clients'!R[" & l & "]C[0]"
       
        ' Meme principe
        k = 20 * j + 13
        l = -19 * j - 11
        Range("C" & k).Select
        ActiveCell.FormulaR1C1 = "='Fichier clients'!R[" & l & "]C[4]"
   
    Next i
   
End Sub

NB : je n'ai pas fait de copier/coller. Ainsi, si tu changes une donnee dans 'Fichier clients', la cellule correspondante dans "Carton à imprimer" sera automatiquement mise a jour.




Marin Marais
0
BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008
10 janv. 2008 à 17:01
Merci de vos réponses, je suis rentré du boulot donc je testerais ça demain.

PCPT : "d'après le morceau que tu as copié, les zones n'ont pas l'air de se suivre...
si tu peux les organiser, tu dois sans doute pouvoir boucler facilement"

Je peux faire suivre les zones copiés, mais le collage hélas non...

Antoine_Ferard :"Pour éviter de mettre 600 boutons (!!!!) tu pourrais cliquer sur la ligne à "récupérer", et en cliquant sur le bouton (unique), tu lance la procédure de "Monsieur PCPT" avec en paramètre les valeurs de la ligne que tu viens de sélectionner."

C'est aussi valable pour une séléction de plusieurs cellules ? Car sur la même ligne j'ai d'autres info dont je n'ai pas besoin...

jrivet : "OU alors si tu ne vaux pas avoir à selectionner une ligne tu fais une boucle (valable si il y a une "logique" dans la boucle)"

Je n'ai fichtrement aucune idée de ce qu'est une boucle  
Je suis pire qu'un débutant, je clique et je vois si ça marche. Le cas échéant, je supprime et je recommence
0
BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008
10 janv. 2008 à 17:06
Marinmarais, je testerais aussi ça demain, merci pour tout

*commence déjà à s'arracher les cheveux pour gagner du temps*
0
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
10 janv. 2008 à 17:07
Une boucle, tu en as une dans le code que je t'ai file.
j'ai calcule le nombre de lignes (nblignes)
je lui demande alors de faire la meme operation sur chaque ligne allant de 2 a nblignes (nblignes = 600 dans ton cas).
c'est ce qui est ecrit entre "For i = 2 to Nblignes" et "Next i" (c'est a dire fin de la boucle).

Une boucle, c'est une astuce en programmation faite pour ne pas avoir a se taper 600 fois la meme chose

Marin Marais
0
zen69 Messages postés 584 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 29 avril 2010 1
10 janv. 2008 à 17:16
J'aime bien ca : Cells.SpecialCells(xlCellTypeLastCell).Row
Moi jutilise ca : .Range("A65536").End(xlUp).Row

Je ferai des test bientot pour voir la quelle est la moin couteuse.

<hr size="2" width="100%" />  zen69 aka Ortho Le Profett
  [site web]
0
BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008
11 janv. 2008 à 09:35
Bon je pense tenir le bon bout avec les codes de Marinmarais

J'ai deux trois trucs à modifié mais c'est parfait.

Merci encore à tous pour votre temps
0
BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008
11 janv. 2008 à 13:05
Bon, j'ai dû quelque peu remanier le fichier.

Désormais il possède 4 feuilles : Saisie, base de données annuel, base de donnée associé, carton à imprimer.

Feuille "saisie" : déstinée à la saisie. Une colonne de saisie pour un client annuel, une autre pour son associé.

En dessous de ces colonnes j'ai collé 2 boutons. 1 bouton qui sert à envoyer les infos vers la feuille "carton à imprimer" ; 1 autre qui coupe et colle les infos dans la feuille "base de données annuel". De même pour l'associé : 1 bouton qui envoie les infos vers "carton à imprimer" ; 1 autre qui coupe/colle les infos dans "base de données associé".

Ce qui me manque, c'est un code qui permettrait d'incrémenter la base de donnée à chaque nouveau client.

Donc en gros, un code qui saute à la ligne vierge suivante sans effacer les données précédemment collées ; sachant qu'un simple saut de ligne ne suffit pas car des utilisateurs seraient amener à consulter cette BDD et laisseraient le curseur sur n'importe quelle cellule séléctionnée (je ne sais pas si ce détail à son importance mais je préfère le préciser)

Merci d'avance, promis je vous embête plus après

Voici mes codes :

Sub imprimannuel()
'
' imprimannuel Macro
' Imprime le carton annuel
'


'
    Range("B1").Select
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("F3").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C9").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C10").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B4").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C8").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B5").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C6").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B6").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C7").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C11").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B1").Select
    Sheets("Carton à imprimer").PrintOut
End Sub
Sub imprimassocie()
'
' imprimassocie Macro
' Imprimer Carton Associé
'


'
    Range("F1").Select
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("F3").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F2").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C9").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F3").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C10").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F4").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C8").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F5").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C6").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F6").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C7").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F7").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Carton à imprimer").Select
    Range("C11").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F1").Select
    Sheets("Carton à imprimer").PrintOut
End Sub
Sub evoibddannuel()
'
' evoibddannuel Macro
' Envoie les infos dans la BDD annuel
'


'
    Range("B1").Select
    Selection.Cut
    Sheets("Base de donnée ""Annuel""").Select
    Range("A2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B2").Select
    Selection.Cut
    Sheets("Base de donnée ""Annuel""").Select
    Range("B2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B3").Select
    Selection.Cut
    Sheets("Base de donnée ""Annuel""").Select
    Range("C2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B4").Select
    Selection.Cut
    Sheets("Base de donnée ""Annuel""").Select
    Range("D2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B5").Select
    Selection.Cut
    Sheets("Base de donnée ""Annuel""").Select
    Range("E2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B6").Select
    Selection.Cut
    Sheets("Base de donnée ""Annuel""").Select
    Range("F2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B7").Select
    Selection.Cut
    Sheets("Base de donnée ""Annuel""").Select
    Range("G2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B8").Select
    Selection.Cut
    Sheets("Base de donnée ""Annuel""").Select
    Range("H2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("B1").Select
End Sub
Sub envoibddassocie()
'
' envoibddassocie Macro
' Envoie les infos dans BDD associé
'


'
    Range("F1").Select
    Selection.Cut
    Sheets("Base de donnée ""Associé""").Select
    Range("A2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F2").Select
    Selection.Cut
    Sheets("Base de donnée ""Associé""").Select
    Range("B2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F3").Select
    Selection.Cut
    Sheets("Base de donnée ""Associé""").Select
    Range("C2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F4").Select
    Selection.Cut
    Sheets("Base de donnée ""Associé""").Select
    Range("D2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F5").Select
    Selection.Cut
    Sheets("Base de donnée ""Associé""").Select
    Range("E2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F6").Select
    Selection.Cut
    Sheets("Base de donnée ""Associé""").Select
    Range("F2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F7").Select
    Selection.Cut
    Sheets("Base de donnée ""Associé""").Select
    Range("G2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F8").Select
    Selection.Cut
    Sheets("Base de donnée ""Associé""").Select
    Range("H2").Select
    ActiveSheet.Paste
    Sheets("Saisie").Select
    Range("F1").Select
End Sub
0
marinmarais Messages postés 104 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 16 juillet 2010 1
11 janv. 2008 à 14:07
Bonjour,




Est-ce que tu n'as pas compris le code que j'ai posté hier ou tu as simplement eu la flemme de l'adapter à ton nouveau problème ?




Le but du jeu n'est pas de trouver quelqu'un pour faire le boulot à sa place, mais de comprendre afin d'être en mesure de le faire seul et de le reproduire.




Enfin c'est comme ca que je concois ce forum.




Alors au lieu de mettre :




>Range("F2").Select
>Selection.Cut
>Sheets("Base de donnée ""Associé""").Select
>Range("B2").Select
>ActiveSheet.Paste


Perd 10 minutes et essaie de comprendre ce que signifie :


>For i = 2 To nblignes
> (...)
> k = 20 * j + 3
> l = -19 * j - 1
> Range("E" & k).Select
> ActiveCell.FormulaR1C1 = "='Fichier clients'!R[" & l & "]C[-4]"
> (...)
>Next i


Une bonne utilisation des formules sur Excel est certainement en partie capable de répondre à ton problème.


Je ne veux pas paraître donneur de lecons. Simplement, c'est en se frottant à ce genre de problèmes que j'ai pu voir à quel point Excel était puissant.


Par ce problème - même si Access me semblerait plus adapté - tu pourras apprendre à manier les formules et les macros sur Excel !


 


Bon courage et bonne chance,


Thomas.








Marin Marais
0
BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008
12 janv. 2008 à 09:46
J'ai bien compris le code... en farfouillant et en modifiant j'ai pu voir sur quoi ça agissait, j'ai d'ailleurs refait une formule que tu m'avais donné car cela ne correspondait pas exactement à ce que j'attendais. 

J'ai également conscience qu'un forum ne marche pas à sens unique (et heureusement d'ailleurs ^^). J'ai commencé à toucher à VB avant-hier, c'était la première fois de ma vie, je commence à apprendre et à comprendre comment ça marche mais tout doucement...

Et mon soucis vient du fait qu'il faut prendre en compte le paramètre :
"Ligne vierge suivante de la colonne A, sans tenir compte de la position de la cellule actuellement séléctionnée" 

...et ça je ne sais pas comment le traduire en code, voilà tout.
0
BobLeSinge Messages postés 8 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 12 janvier 2008
12 janv. 2008 à 11:31
Bon, j'ai pris le problème à l'envers et ça marche :

Worksheets("Base de donnée ""Annuel""").Rows(2).Insert

Plus besoin de chercher une ligne vierge vers le bas, tout simplement insérer une ligne vierge vers le haut et le tour est joué 
0
Rejoignez-nous