Demande d'aide

Salut,

J'ai besoin d'un petit coup de main pour que cette macro "de débutant" qui fais pas ce que je veut!

' Copie la formule de base

' Touche de raccourci du clavier: Ctrl+Shift+X

Sheets("Mac").Select

Range("E10:CA10").Select

Selection.Copy

Sheets("Devis1").Select

ActiveSheet.Paste

ActiveCell.Select

End Sub

1 : Je voudrais qu'elle aille dans la feuille depuis laquelle elle est lancée et pas toujours dans "Devis1"

2 : Je voudrais aussi que dans cette feuille ou elle est lancée peut importe l'emplacement ou elle est lancée elle "Paste" toujours à partir de la colonne "E" et de la ligne sur laquelle elle est lancée!

Pour résumer ? : feuille active : relative / Feuille Mac, Range, copy : absolue / et pour "Paster"! / Colonne absolue ligne relative!

C'est du chinois ou j'ai bon dans l'explication ? !

Merci a vous d'avance.

Comiksou

Bonjour,

Essaie ceci :

Sub Comiksou()
    Dim n%
    n = ActiveCell.Row
    Worksheets("Mac").Range("E10:CA10").Copy ActiveSheet.Cells(n, 5)
End Sub

La macro précédente opère un copier-coller, collant les valeurs et les formats de cellule et les formules éventuelles. Si tu n'as besoin de récupérer que les valeurs, tu peux te passer de copier-coller :

Sub Comiksou2()
    With ActiveCell
        Cells(.Row, 5).Resize(, 75).Value = Worksheets("Mac").Range("E10:CA10").Value
    End With
End Sub

Cordialement.

Merci oui !

Impressionnant j'imagine que c'est une macro ultra simple mais il manque beaucoup de connaissance de base sur VBA...

J'imagine que tu as créer une variable ou un truc comme sa.. peux tu m'en dire plus sur ce que tu as codé pour faire évoluer mes connaissance!

Merci

Bonjour,

Quand tu enregistres une macro, l'enregistreur ne fait qu'enregistrer tes mouvements dans le classeur et les commande que tu actives, d'où une foule de Select, Selection, Activate, etc. qui résultent du fait que manuellement tu passes ton temps à déplacer le curseur, donc à sélectionner des cellules, des plages, des feuilles... (et tu ne peux faire autrement !). Mais VBA si ! Lui n'a pas besoin de sélectionner, au contraire, chaque sélection est une action supplémentaire pour lui qui n'a pour effet que de ralentir l'exécution.

Mais comme tu ne peux opérer manuellement de la même façon, la commande la plus directe et rapide pour VBA ne pourra jamais être enregistrée, il te faut l'écrire...

De même, lorsque tu actionnes une commande Excel ou un fonctionnalité, tu définis en même temps certains paramètres pour son exécution, tu modifies en fait la paramètres de la commande dont la valeur par défaut ne te convient pas. Mais l'enregistreur ne fait pas le tri : il reprend à l'enregistrement tous les paramètres, ceux que tu as modifié comme ceux auxquels tu n'as pas touché. D'où un code plus long et plus lent, qu'il convient toujours d'épurer...

En outre, tu ne pourras jamais enregistrer des instructions conditionnelles, des boucles, ou faire appel à des variables ou des tableaux... tous éléments de programmation qui te permettent de diversifier les actions programmées et les rendre plus efficaces.

Au cas particulier, une commande de copier-coller ordinaire s'écrit en VBA sous la forme :

plageSource.Copy plageDestination (une ligne de code)

Car la méthode Copy comporte un argument Destination qui te permet de l'économie d'une manoeuvre supplémentaire pour le collage (VBA est informé d'emblée de ce qu'il doit faire après copie).

Les plages de cellules sont définies par leurs références en lignes et colonnes, sur une feuille, dans un classeur... Lorsqu'on ne précise pas la feuille ou le classeur, pour VBA ce sera par défaut la feuille active du classeur actif, mais en ne le précisant pas, tu fais chercher par VBA quelle est la feuille active, en le lui disant tu lui évites d'avoir à le chercher ! C'est tout l'intérêt de doter ses expressions dans le code de ce qu'on désigne comme qualificateurs d'objet (sans parler du fait que lors de l'exécution de certaines commandes la feuille active peut se trouver modifiée, ce qui peut réserver quelques surprises....).

On peut généralement négliger l'indication du classeur actif (quand on ne travaille pas avec de multiples classeurs ouverts) mais l'indication de la feuille pour préciser la position d'une plage est une nécessité pour optimiser le code.

Dans ton cas, nous avons donc feuilleSource.plageàcopier.Copy feuilleDestination.cellulesupérieuregauchedelacopie

Pour définir la cellule cible pour le collage, on sait que la colonne est E (la 5e) et que la ligne est fourni par la cellule active (indication fournie par l'utilisateur en positionnant le curseur sur une cellule pour indiquer la ligne).

On déclare donc une variable (il est toujours préférable de déclarer toutes ses variables, et de les typer autant que possible, l'exécution sera plus rapide), de type Integer (si on devait opérer au-delà de la ligne 32767 il faudrait choisir le type Long).

Ce qui se fait sous la forme : Dim n As Integer qu'on raccourcit en : Dim n% % étant un caractère de déclaration de type signifiant As Integer (on en dispose de quelques uns pour les types String: $, Long: &, Single: !, Double: #, Currency: @, ce qui peut s'avérer pratique pour raccourcir l'écriture des instructions de déclarations).

De même (pour raccourcir l'écriture) on passera de préférence les arguments de la méthode par position (dans l'ordre où l'interpréteur de commande les attend) plutôt que par nom (en les nommant: Nomargument:= Valeurargument, le passage par nom ne présente d'intérêt que s'il y a de nombreux arguments optionnels, qu'on n'utilise pas et on peut donc passer les seuls arguments utiles sans tenir compte de l'ordre).

Pour la 2e procédure indiquée, note que le point devant Row fait que cette propriété se réfère à ActiveCell (et renverra la ligne de la cellule active). Pas de point devant Cells (qui réfère donc à la feuille active: pour être conforme à mes déclarations ci-dessus, j'aurais dû écrire : ActiveSheet.Cells..., je n'ai pas voulu allonger la ligne mais ce serait effectivement mieux !).

La plage cible est définie à partir de sa première cellule redimensionnée (avec Resize) sur 75 colonnes (et 1 ligne, ce qu'on ne modifie pas), la plage Source est définie par ses références, les deux plage sont égales et la commande est de la forme :

plageCible.Value = plageSource.Value (ce que l'enregistreur ne pourra jamais écrire, mais qui demeure le plus rapide pour affecter des valeurs). Note que pour une plage (objet Range) la propriété Value (valeur) est la propriété par défaut, de ce fait on peut se dispenser de préciser Value dans bien des cas... mais pour ce type de commande d'affectation la précision est indispensable pour que la commande s'exécute).

Note aussi qu'en éliminant toute sélection du code, on évite les déplacements correspondants dans le classeur, ce qui fait gagner du temps à la fois par l'action qu'on évite, et aussi par la mise à jour de l'affichage que chaque changement implique et qui prend un temps conséquent.

Quand on ne peut éviter des changements liés à des écritures répétées sur la feuille au premier plan sur l'écran, on y pallie dans le code par une instruction : Application.ScreenUpdating = False qui bloque la mise à jour de l'affichage jusqu'à la fin de la procédure.

Pour compléter cela, les cours pourront t'apporter une connaissance plus large et une vue d'ensemble des rudiments de la programmation VBA, qui s'élargiront au fil de tes expérimentations...

Cordialement.

Super merci pour tout du coup même si tape du code a rallonge je n'aurais pas de "clip" d'image lors de l’exécution!

Du coup j'en déduit dans ton explication qu'il faut appeler un chat "un chat" !? dans VbA pour éviter à la commande de suivre un chemin inutile ou d’effectuer des recherches inutiles!

J'ai une autre macro a simplifier je vais m'inspirer de ton code pour la retaper (j'en ai plein en tête)

Par contre j'ai un sérieux soucis pour vraiment faire évoluer mon travail et j’aimerais que tu jette un coup d’œil quand tu peux c'est déjà très sympa de m'avoir indiqué tout sa!

Quand je colle les céllules via "comiksou"! dans ma feuille "devis" je voudrais qu'elle amène avec elle trois listes déroulantes (toujours sur la même ligne)

Ces 3 listes sont en cascade (ou dans trois cellules adjacentes?) et indiquent a des formules (qui viennent du même copier coller) d'aller chercher dans une autre feuille du classeur : "BB_prix" des valeurs (afin d'avoir plein de détail de dépense par type d'ouvrage a droite de mon devis) exemple des formules amenées (=INDEX(BB_PRIX!D37:AJ67;EQUIV(D10;BB_PRIX!D37:D67;0);7)

Dans cette exercice une partie est a réaliser sur excel je pense (lier les zones de champs en fonction des résultats des listes déroulantes)

Une autre me parait limpide maintenant grâce a vous c’est de ramener le champs avec les listes déroulantes une fois les liaisons crées...

Si vous (ou tu) pourrais m'aider pour cette procédure cela me changerais la vie!

En PJ je met le fichier de base avec la bibliothèque prix afin de mieux localiser les valeurs :

13exemple.xlsm (171.04 Ko)

Une dernière remarque pour toi qui doit être utilisateur avancé excel vba :

Je travaille depuis des années sur LOTUS le vieux tableur 1-2-3 qui est ultra simple et puissant a mes yeux... celui ci autorise la commande annuler (ctrl z) après une macro et a priori c'est impossible sur excel ? étonnant!

Je vous remercie d'avance pour votre retour et encore merci pour toutes ces infos très enrichissantes!

Christophe

Pas le temps tout de suite, mais je regarderai.

J'ai eu une période Lotus autrefois ! En passant à Excel (5, à l'époque) j'ai regretté l'absence de fonctions de bases de données qu'offrait Lotus dans son tableur (que j'ai dû pallier par du VBA...)

Mais effectivement, on ne peut annuler le résultat d'une macro, ce qui oblige à certaines précautions lors d'essais...

J'ai oublier :

Les trois listes déroulantes :

1ere : corps d'état (gros oeuvre, terrassement...)

2éme : famille d'ouvrage : (décapage, fouilles en pleine masse...)

3éme le poste : (fouilles en tranchées...)

Exemple : Je choisis le corps d'état : installation de chantier dans la première = dans la deuxieme j'ai le choix entre Terrassements complémentaires et Remblais et d'autres à venir...

Je choisi : Remblais

J'ai le choix entre Remblais en terre du site et d'autres à venir...

J'obtiens le prix et les sous détail venant de la bibliothèque !

En vous remerciant


Ok merci en attendant je vais continuer à m’entraîner !

Encore merci

Bonjour,

Ta macro Précision en manque un peu !

Elle peut s'écrire ainsi :

Sub Précision()
    Dim c As Range
    Set c = ActiveCell
    Sheets("Mac").Range("O15:Q15").Copy c
End Sub

après rectification de la plage copiée.

Elle exige évidemment d'être lancée à partir de la feuille Lot_VRD, après sélection de la cellule cible.

Dispositif dépendant exclusivement du choix de l'utilisateur, qui ne doit pas faire d'erreur...

La liste déroulante en O15 se retrouve naturellement collée...

Mais je ne vois pas les listes-cascade que tu évoques par ailleurs, ni où sont les données destinées à les alimenter.

Cordialement.

Re bonjour,

Voici mon fichier en PJ,

Mon soucis et que quand je lance la macro COMIKSOU je copie trois listes en cascade contenant des données d'une autre feuille, et que dans mes listes déroulantes il y a des vides qui pollue la navigation...

J'aimerais trouver une fonction qui supprime ces vides passer par un tri intermédiaire autrement une fonction ?

Merci d'avance pour votre réponse

16devis-comiksou.xlsm (272.73 Ko)

Désolé, pas encore eu le temps de regarder, je suis quelque peu débordé...

Rechercher des sujets similaires à "demande aide"