Probleme excel
francois
-
lami20j Messages postés 21644 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21644 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour,
je souhaiterai réaliser quelque chose d'un peu spécial avec excel mais j'ai besoin d'aide. J'ai une cellule dont la valeur change en fonction d'un critère. Comment peut-on faire pour conserver quelque part les anciennes valeurs prises par cette cellule ?
Deuxième chose, qui pour moi est le meme problème. Comment peut-on dire à excel d'étendre la dernière ligne remplie d'un tableau ?
Merci de m'aider car je suis en stage et j'en aurai vraiment besoin
Merci
je souhaiterai réaliser quelque chose d'un peu spécial avec excel mais j'ai besoin d'aide. J'ai une cellule dont la valeur change en fonction d'un critère. Comment peut-on faire pour conserver quelque part les anciennes valeurs prises par cette cellule ?
Deuxième chose, qui pour moi est le meme problème. Comment peut-on dire à excel d'étendre la dernière ligne remplie d'un tableau ?
Merci de m'aider car je suis en stage et j'en aurai vraiment besoin
Merci
A voir également:
- Probleme excel
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Si ou excel - Guide
- Déplacer colonne excel - Guide
- Excel trier par ordre croissant chiffre - Guide
12 réponses
Salut François,
Pour ta première question, la petite macro ci-dessous fonctionne.
- Archive les données à historiser dans une feuille ad hoc ("HistoVal" dans l'exemple)
- Copie la macro dans le code de la feuille où se trouve la cellule à historiser.
Comment peut-on dire à excel d'étendre la dernière ligne remplie d'un tableau ?
Peux-tu préciser ?
Pour ta première question, la petite macro ci-dessous fonctionne.
- Archive les données à historiser dans une feuille ad hoc ("HistoVal" dans l'exemple)
- Copie la macro dans le code de la feuille où se trouve la cellule à historiser.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Adapter :
' - le nom de la feuille archive ("HistoVal" dans l'exemple)
' - l'adresse de la cellule à surveiller ("B5") dans l'exemple)
Dim Dernièreligne As Long
Dernièreligne = Sheets("HistoVal").Cells(1, 1).CurrentRegion.Rows.Count
If Me.Range("B5").Value <> Sheets("HistoVal").Cells(Dernièreligne, 1).Value Then
Sheets("HistoVal").Cells(Dernièreligne + 1, 1).Value = Me.Range("B5").Value
End If
End SubJe ne saisis pas bien ce que tu veux dire :
Comment peut-on dire à excel d'étendre la dernière ligne remplie d'un tableau ?
Peux-tu préciser ?
Salut Francois,
si tu me fais parvenir ton mail, ca sera plus commode.
Un petit coup de vba, et hop!!!
M.
si tu me fais parvenir ton mail, ca sera plus commode.
Un petit coup de vba, et hop!!!
M.
;-)
François !! Par principe, n'écrit jamais, ton adresse mail !!
Tout le monde peut lire, et pas seulement ceux qui sont là pour t'aider !!
Tu as toujours moyen, en ouvrant le profil du "posteur", de voir son mail ou comment le joindre s'il a indiqué ces informations...
Ce n'est pas prudent de mettre ainsi ton mail...
;-)
François !! Par principe, n'écrit jamais, ton adresse mail !!
Tout le monde peut lire, et pas seulement ceux qui sont là pour t'aider !!
Tu as toujours moyen, en ouvrant le profil du "posteur", de voir son mail ou comment le joindre s'il a indiqué ces informations...
Ce n'est pas prudent de mettre ainsi ton mail...
;-)
OK, François,
D'abord, crée une feuille "HistoVal" dans ton classeur.
Puis :
1) Dans la barre de menu Excel, fais :
Outils/Macro/Visual Basic Editor
==> Tu te trouves dans l'éditeur Visual Basic.
Tu dois avoir, dans une lucarne verticale à gauche, l'Explorateur de Projets, qui se présente comme l'Explorateur Windows. (si ce n'est pas le cas, fais : Affichage/Explorateur de projets)
2) Dans cet Explorateur de projets, tu dois voir une ligne, en gras :
VBAProject(<nom de ton classeur>)
En développant ce "projet", tu aperçois une ligne Microsoft Excel Objects, et comme des sous dossiers, des lignes correspondant à tes feuilles, et une ligne ThisWorkbook
3) Fais un double clic sur la ligne correspondant à la feuille de ton classeur qui contient la cellule à surveiller
==> la partie droite de l'écran devient blanche, surmontée de 2 listes déroulantes : (Général) et (Déclarations)
4) Copie la macro qui se trouve dans ce post, et colle-la dans ce grand espace blanc.
5) Dans la macro que tu viens de coller, remplace "B5" (deux endroits) par l'adresse réelle de la cellule que tu veux surveiller.
C'est tout.
Essaie et dis-moi si ça marche.
N.B. L'archivage commencera en ligne 2 de ta feuille HistoVal. Tu peux mettre un titre de colonne dans la cellule A1.
D'abord, crée une feuille "HistoVal" dans ton classeur.
Puis :
1) Dans la barre de menu Excel, fais :
Outils/Macro/Visual Basic Editor
==> Tu te trouves dans l'éditeur Visual Basic.
Tu dois avoir, dans une lucarne verticale à gauche, l'Explorateur de Projets, qui se présente comme l'Explorateur Windows. (si ce n'est pas le cas, fais : Affichage/Explorateur de projets)
2) Dans cet Explorateur de projets, tu dois voir une ligne, en gras :
VBAProject(<nom de ton classeur>)
En développant ce "projet", tu aperçois une ligne Microsoft Excel Objects, et comme des sous dossiers, des lignes correspondant à tes feuilles, et une ligne ThisWorkbook
3) Fais un double clic sur la ligne correspondant à la feuille de ton classeur qui contient la cellule à surveiller
==> la partie droite de l'écran devient blanche, surmontée de 2 listes déroulantes : (Général) et (Déclarations)
4) Copie la macro qui se trouve dans ce post, et colle-la dans ce grand espace blanc.
5) Dans la macro que tu viens de coller, remplace "B5" (deux endroits) par l'adresse réelle de la cellule que tu veux surveiller.
C'est tout.
Essaie et dis-moi si ça marche.
N.B. L'archivage commencera en ligne 2 de ta feuille HistoVal. Tu peux mettre un titre de colonne dans la cellule A1.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Pour VBA, je ne maitrise pas trop. Je fais mes macros en enregistrant les actions à exécuter à la souris ou au clavier directement dans excel. Cela peut se faire meme dans excel 2003.
Armojax, t'es un dieu. çà marche nickel .
Merci beaucoup à tous de votre aide. Je voudrais maintenant sélectionner la dernière ligne de ce tableau d'historique, pour pouvoir utiliser la dernière valeur prise par la cellule.
Aidez moi encore svp...
Merci beaucoup
Merci beaucoup à tous de votre aide. Je voudrais maintenant sélectionner la dernière ligne de ce tableau d'historique, pour pouvoir utiliser la dernière valeur prise par la cellule.
Aidez moi encore svp...
Merci beaucoup
;-)
Oui, cela se fait depuis longtemps.. ;-)
Quand tu enregistres, en automatique, tes actions, tout est transformé en code VBA (Visual Basic for Application), et stocké dans ton classeur dans un environnement spécial : L'Editeur Visual Basic...
Cet éditeur te sert à créer tes propres programmes, où à modifier ceux qui existent, pour automatiser tes tâches sous Excel (ou autres du pack office)...
Quand tu enregistres une macro, le code écrit est plutôt "brut de décoffrage" et est souvent à revoir car les instructions utilisées ne sont pas "optimisées", mais en allant mettre ton nez dans cet éditeur, cela va t'aider à comprendre comment cela fonctionne...
Tu vas voir que tout est organisé sous forme Objet/Propriété ou Méthode
L'objet de base, sous Excel, c'est le classeur (Workbook), ensuite, chaque classeur est composé de feuilles (sheets), chaque feuille composée de cellules (cells)...
Chaque type d'objet possède ses propres caractéristiques (propriétés), et sa façon de réagir aux événements et actions (Méthode)
Jusque là, c'est clair ?
Oui, cela se fait depuis longtemps.. ;-)
Quand tu enregistres, en automatique, tes actions, tout est transformé en code VBA (Visual Basic for Application), et stocké dans ton classeur dans un environnement spécial : L'Editeur Visual Basic...
Cet éditeur te sert à créer tes propres programmes, où à modifier ceux qui existent, pour automatiser tes tâches sous Excel (ou autres du pack office)...
Quand tu enregistres une macro, le code écrit est plutôt "brut de décoffrage" et est souvent à revoir car les instructions utilisées ne sont pas "optimisées", mais en allant mettre ton nez dans cet éditeur, cela va t'aider à comprendre comment cela fonctionne...
Tu vas voir que tout est organisé sous forme Objet/Propriété ou Méthode
L'objet de base, sous Excel, c'est le classeur (Workbook), ensuite, chaque classeur est composé de feuilles (sheets), chaque feuille composée de cellules (cells)...
Chaque type d'objet possède ses propres caractéristiques (propriétés), et sa façon de réagir aux événements et actions (Méthode)
Jusque là, c'est clair ?
Bon, hébé si ça fonctionne, tant mieux.
Si je comprends bien la suite, tu veux pouvoir utiliser l'avant dernière valeur, c'est bien ça ?
Si c'est ça, je te propose une autre version de la macro précédente. Au lieu d'historiser les valeurs en les ajoutant en fin de liste, ce qui décale la dernière valeur à chaque ajout, on va plutôt insérer en tête de liste la valeur récente. De cette façon, l'avant dernière valeur se trouve toujours au même endroit.
Voici donc une nouvelle mouture :
La cellule A2 contient la valeur actuelle, et A3 contient la valeur précédente.
Tu peux donc, sans VBA, aller chercher via Excel cette valeur sans problème.
PS1. N'oublie pas de remplacer B5 par l'adresse de la cellule.
PS2. Si tu veux conserver la macro précédente, mets-la en commentaires, en faisant précéder chaque ligne d'une apostrophe (les lignes deviennent vertes).
Si je comprends bien la suite, tu veux pouvoir utiliser l'avant dernière valeur, c'est bien ça ?
Si c'est ça, je te propose une autre version de la macro précédente. Au lieu d'historiser les valeurs en les ajoutant en fin de liste, ce qui décale la dernière valeur à chaque ajout, on va plutôt insérer en tête de liste la valeur récente. De cette façon, l'avant dernière valeur se trouve toujours au même endroit.
Voici donc une nouvelle mouture :
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Adapter :
' - le nom de la feuille archive ("HistoVal" dans l'exemple)
' - l'adresse de la cellule à surveiller ("B5") dans l'exemple)
If Me.Range("B5").Value <> Sheets("HistoVal").Range("A2").Value Then
Me.Range("B5").Copy
Sheets("HistoVal").Range("A2").Insert Shift:=xlDown
End If
End SubComme précédemment, la liste commence en A2 pour laisser un titre de colonne.
La cellule A2 contient la valeur actuelle, et A3 contient la valeur précédente.
Tu peux donc, sans VBA, aller chercher via Excel cette valeur sans problème.
PS1. N'oublie pas de remplacer B5 par l'adresse de la cellule.
PS2. Si tu veux conserver la macro précédente, mets-la en commentaires, en faisant précéder chaque ligne d'une apostrophe (les lignes deviennent vertes).
Hello François,
Voilà, je suis revenu.
Ça m'étonne que ça ne marche pas : j'ai pris un classeur vierge, j'y ai copié la macro, et chez moi ça marche.
Essaie de repartir à zéro :
- sélectionne toutes les lignes de macro, et efface-les.
- recopie la macro que je t'ai envoyée.
Accessoirement, et s'il n'y a rien de confidentiel dans tes données, mon mail est mon pseudo en minuscules chez free.fr.
Comme tu veux.
Ajx.
Voilà, je suis revenu.
Ça m'étonne que ça ne marche pas : j'ai pris un classeur vierge, j'y ai copié la macro, et chez moi ça marche.
Essaie de repartir à zéro :
- sélectionne toutes les lignes de macro, et efface-les.
- recopie la macro que je t'ai envoyée.
Accessoirement, et s'il n'y a rien de confidentiel dans tes données, mon mail est mon pseudo en minuscules chez free.fr.
Comme tu veux.
Ajx.
Salut,
françois j'ai testé le module d'armojax ( salut armojax, j'ai noté ton mail ) et il fonctionne.
Petites améliorations :
1. on ajoute une ligne qui nous permet de vider le presse-papier ( vu que la cellule reste sélectionnnée quand on fait copier ) - le cas écheant si on appuie 2 fois sur entrer on vas copier aussi la cellule B5 dans B6.
2. on utilise la propriète ScreenUpdating pour rendre la feuille à son état normal sinon même avec l'ajoute de la ligne de 1. on vois 2 cellules selectionnées sur la même feuille ( assez embêtant)
françois j'ai testé le module d'armojax ( salut armojax, j'ai noté ton mail ) et il fonctionne.
Petites améliorations :
1. on ajoute une ligne qui nous permet de vider le presse-papier ( vu que la cellule reste sélectionnnée quand on fait copier ) - le cas écheant si on appuie 2 fois sur entrer on vas copier aussi la cellule B5 dans B6.
2. on utilise la propriète ScreenUpdating pour rendre la feuille à son état normal sinon même avec l'ajoute de la ligne de 1. on vois 2 cellules selectionnées sur la même feuille ( assez embêtant)
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' Adapter :
' - le nom de la feuille archive ("HistoVal" dans l'exemple)
' - l'adresse de la cellule à surveiller ("B5") dans l'exemple)
If Me.Range("B5").Value <> Sheets("HistoVal").Range("A2").Value Then
Me.Range("B5").Copy
Sheets("HistoVal").Range("A2").Insert Shift:=xlDown
Application.SendKeys "{ESC}" ' le presse-papier est vidé
End If
Application.ScreenUpdating = True ' etat normal de la feuille
End Sub
Hello lami20j,
Merci pour la petite amélioration. Effectivement, la trace du Copy fait désordre.
Toujours dans le cadre des variantes, plutôt que SendKeys, on peut mettre :
Application.CutCopyMode = False.
Quant au ScreenUpdating, il n'a pas été mis à False auparavant, alors quel intérêt de le mettre à True ?...
Ajx.
Merci pour la petite amélioration. Effectivement, la trace du Copy fait désordre.
Toujours dans le cadre des variantes, plutôt que SendKeys, on peut mettre :
Application.CutCopyMode = False.
Quant au ScreenUpdating, il n'a pas été mis à False auparavant, alors quel intérêt de le mettre à True ?...
Ajx.
Salut armojax,
Quant au ScreenUpdating, il n'a pas été mis à False auparavant, alors quel intérêt de le mettre à True ?...
Quand j'ai testé ta macro, j'ai ajouté aussi au debut :
Application.ScreenUpdating = False mais ça ne change rien.
Tu peut tester et tu verras, l'important c'est que ça marche.
Concernant l'utilisation de SendKeys c'est seulement un moyen de le faire, toujours il y a plusieurs solutions.
françois a dit :
Pour VBA, je ne maitrise pas trop.
Alors je pense que c'est bien pour lui de savoir qu'il y a plusieurs posibilités pour resoudre un problème.
A+
Amicalement,
lami20j
P.S. Quand j'ai proposé les petites améliorations, je ne pas voulais te corriger, c'était plutôt pour françois.
Quant au ScreenUpdating, il n'a pas été mis à False auparavant, alors quel intérêt de le mettre à True ?...
Quand j'ai testé ta macro, j'ai ajouté aussi au debut :
Application.ScreenUpdating = False mais ça ne change rien.
Tu peut tester et tu verras, l'important c'est que ça marche.
Concernant l'utilisation de SendKeys c'est seulement un moyen de le faire, toujours il y a plusieurs solutions.
françois a dit :
Pour VBA, je ne maitrise pas trop.
Alors je pense que c'est bien pour lui de savoir qu'il y a plusieurs posibilités pour resoudre un problème.
A+
Amicalement,
lami20j
P.S. Quand j'ai proposé les petites améliorations, je ne pas voulais te corriger, c'était plutôt pour françois.
C'est plutôt sympa de proposer des pistes différentes. Il y a presque toujours plusieurs façons de faire, et confronter les solutions fait avancer le schmilblick.
D'ailleurs souvent, quand on replonge dans un truc qu'on a soi-même écrit, on se dit qu'on ne le referait pas de la même façon.
Donc à bientôt pour de prochaines aventures...
Ajx.
D'ailleurs souvent, quand on replonge dans un truc qu'on a soi-même écrit, on se dit qu'on ne le referait pas de la même façon.
Donc à bientôt pour de prochaines aventures...
Ajx.
A propos,
Annule le mode Couper ou Copier et supprime la marque de sélection, donc il n'y a pas de Copier. Ca ne marche pas, donc on reste avec SendKeys.
Et encore à la place de
et ça puisque la méthode Insert à l'argument facultatif Shift qui peut permettre le déplacément en bas ou à droite (par défaut en bas).
Application.CutCopyMode = False
Annule le mode Couper ou Copier et supprime la marque de sélection, donc il n'y a pas de Copier. Ca ne marche pas, donc on reste avec SendKeys.
Et encore à la place de
Insert Shift:=xlDownon peut aussi écrire
Insert(xlShiftDown)ou tout court
Insert
et ça puisque la méthode Insert à l'argument facultatif Shift qui peut permettre le déplacément en bas ou à droite (par défaut en bas).
Armojax, pourrais-tu me dire aussi comment je peux utiliser ton code. Où dois-je le sauvegarder ? Comment il s'utilise ? Désolé mais à chaque fois que je fais des macros je les fais directement dans excel et pas avec VBA.
Merci
Quelle version de Excel ? Cela fait un bail que l'on utilise plus les macros directement dans la feuille... Ou tu dois mal t'exprimer ?
;-)
Pas dans la feuille, mais dans le code de la feuille. :o)
Tu as connu les versions d'Excel où tu écrivais tes macros directement dans les cellules ? C'était avant leVBA... Renseigne toi
;-)
On ne doit pas bien se comprendre, WhiteFang, et on doit bien être d'accord sur le fond. Regarde les n° 1 et 8 de ce post : il n'y a aucune ambiguité, et aucun code à placer directement dans une feuille de calcul.
Pas question de remonter à Excel.5 ou antérieur, évidemment !!!!