Probleme excel

francois -  
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
A voir également:

12 réponses

Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
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.
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 Sub
Je 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 ?
0
francois
 
je reformule le problème que tu n'as pas compris. Comment peut-on copier des données automatiquement dans la première ligne libre d'un tableau.
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
0
WhiteFang Messages postés 2063 Statut Membre 204 > francois
 
;-)

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 ?

;-)
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529 > WhiteFang Messages postés 2063 Statut Membre
 
Hello WhiteFang,

Pas dans la feuille, mais dans le code de la feuille. :o)
0
WhiteFang Messages postés 2063 Statut Membre 204 > Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention  
 
;-)

Tu as connu les versions d'Excel où tu écrivais tes macros directement dans les cellules ? C'était avant leVBA... Renseigne toi

;-)
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529 > WhiteFang Messages postés 2063 Statut Membre
 
Hello,

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 !!!!
0
micheeel Messages postés 10 Statut Membre 2
 
Salut Francois,

si tu me fais parvenir ton mail, ca sera plus commode.
Un petit coup de vba, et hop!!!

M.
0
francois
 
voila mon mail.
francois.devanne@9online.fr

Si tu m'envoie un fichier VBA, pourrais-tu m'expliquer exactement où je dois le copier et comment je l'utilise, stp ?

Merci
0
WhiteFang Messages postés 2063 Statut Membre 204 > francois
 
;-)

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...

;-)
0
francois > francois
 
je sais. Je m'en veux d'avoir mis mon adresse. je voulais répondre en perso à celui qui me l'a demandée mais j'ai fait une fausse manip'. J'espère qu'il n'y aura pas trop de mauvais esprits pour la polluer...
0
WhiteFang Messages postés 2063 Statut Membre 204
 
;-)

Sinon, avant de répondre à ta question, je t'en pose une autre : Connais-tu VBA ?

;-)
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
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.
0

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

Posez votre question
francois
 
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.
0
francois
 
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
0
WhiteFang Messages postés 2063 Statut Membre 204
 
;-)

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 ?
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
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 :
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 Sub
Comme 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).
0
francois
 
merci pour ton aide armojax. ta nouvelle mouture m'intéresserait effectivement beaucoup. Le problème, c'est que l'ancienne marchait mais que la nouvelle marche pas. pourrais-tu m'aider stp ?
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529 > francois
 
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.
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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)

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
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
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.
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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.
0
Armojax Messages postés 1916 Date d'inscription   Statut Membre Dernière intervention   1 529
 
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.
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
A propos,

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:=xlDown
on 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).
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

C'est plutôt sympa de proposer des pistes différentes.
Tu sais trés bien que je suis d'accord avec toi.
J'ai l'esprit assez clair pour accepter des solutions meilleures que les miennes.
Sinon je n'étais pas là.

Si jamais j'aurai besoin d'un coup de main je n'hésiterai pas.

lami20j
0