BobLeSinge
Messages postés8Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention12 janvier 2008
-
10 janv. 2008 à 15:31
BobLeSinge
Messages postés8Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention12 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*
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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
antoine_ferard
Messages postés222Date d'inscriptionmercredi 5 avril 2006StatutMembreDernière intervention18 février 20113 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
Vous n’avez pas trouvé la réponse que vous recherchez ?
marinmarais
Messages postés104Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention16 juillet 20101 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.
BobLeSinge
Messages postés8Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention12 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
marinmarais
Messages postés104Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention16 juillet 20101 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
BobLeSinge
Messages postés8Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention12 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
marinmarais
Messages postés104Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention16 juillet 20101 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 !
BobLeSinge
Messages postés8Date d'inscriptionjeudi 10 janvier 2008StatutMembreDernière intervention12 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.