IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Un formule math pour toutes les cellules d'une colone [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier Avatar de mentat
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Août 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electrotechnicien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 139
    Points : 99
    Points
    99
    Par défaut Un formule math pour toutes les cellules d'une colone
    Bonjour à tous.

    J'ai un tableau de 8 colonnes, je remplis ce tableau par ligne avec l'aide d'une macro par un collage spécial ne récupérant que les valeurs.

    Mon soucis c'est que l'utilisateur peut être amené à modifier une valeur dans le tableau de la base de donné seulement il faudrait qu'un calcul soit automatisé.

    Par Ligne
    La colonne 8 de mon tableau (colonne I) est égale à la colonne 5 de mon tableau (colonne F) moins la colonne 7 (colonne H)

    Ce qui donne pour la ligne 4: I4=F4-H18

    Et cela pour chaque ligne de mon tableau...

    Je souhaiterai utilisé faire ce calcul par macro afin que l'utilisateur ne change pas la formule...

    j'ai essayé ceci... Seulement l'utilisateur peut changer la valeur de la case...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Base de donné").Range("I4", "I65536").Value = "=RC[-3]-RC[-1]"
    J'ai essayé par une boucle mais ça ne fonctionne pas non plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For n = 4 To Worksheets("Base de donné").Range("I65536").Value
      Worksheets("Base de donné").Range("I" & n).Value = Worksheets("Base de donné").Range("I" & n).Offset(3, 3) - Worksheets("Base de donné").Range("I" & n).Offset(1, 1)
     Next n
    Si quelqu'un peut m'aider....

    Merci

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Ce qui donne pour la ligne 4: I4=F4-H18
    C'est toujour H18 ou bien c'est indexer..
    I5=F5-H18 ou bien I5=F5-H19 ??
    A+
    Edit: Premier jet avec incrémentation de H18
    Coller le code dans le module de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Column <> 9 Or Target.Count > 1 Or Target = "" Then Exit Sub
        Target = Target.Offset(0, -3) - Target.Offset(14, 1)
    End Sub

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 102
    Points : 117
    Points
    117
    Par défaut
    Bonjour mentat
    Bonjour LeForestier

    A tester une macro évènementielle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Option Explicit
    Dim flag As Boolean
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim cellule As Range
    If flag = True Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    With Sheets(Target.Worksheet.Name)
    'La colonne 8 de mon tableau (colonne I)
    'est égale à la colonne 5 de mon tableau (colonne F)
    'moins la colonne 7 (colonne H)
    If Target.Column = 5 Or Target.Column = 7 Then
    flag = True
        If IsNumeric(.Cells(Target.Row, 5)) And IsNumeric(.Cells(Target.Row, 7)) Then
            .Cells(Target.Row, 8) = .Cells(Target.Row, 5) - .Cells(Target.Row, 7)
        End If
    End If
    End With
    flag = False
    End Sub
    Le code est basé sur le numéro des colonnes.

    JP014

  4. #4
    Membre régulier Avatar de mentat
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Août 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electrotechnicien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 139
    Points : 99
    Points
    99
    Par défaut
    Oups je me suis complétement tropé dans l'exemple formulé.

    Je vous présente toute mes excuses...

    exemple :

    ligne 4: I4=F4-H4
    ligne 5: I5=F5-H5
    ligne 6: I6=F6-H6

    etc....

    et sur cette formule là j'ai oublié les -

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     For n = 4 To Worksheets("Base de donné").Range("I65536").Value
      Worksheets("Base de donné").Range("I" & n).Value = Worksheets("Base de donné").Range("I" & n).Offset(-3, -3) - Worksheets("Base de donné").Range("I" & n).Offset(-1, -1)
     Next n
    Mais ma formule ne fonctionne toujours pas...

    Je suis pas tres réveiller aujourd'hui lol, désolé.

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    J'ai un peu repenser ta demande et ..
    A coller dans le module de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Count > 1 Then Exit Sub 'pour quand copie de bloc
        Select Case Target.Column
        Case 6
            Target.Offset(0, 3) = Target - Target.Offset(0, 2)
        Case 8
            Target.Offset 0, 1) = Target.Offset(0, -2) - Target
        End Select
    End Sub
    Et si par hazard tu colle un bloc, tu peu réinitialiser toute la feuille avec...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub MiseAJour()
    Dim DerLig As Long
    Dim lig As Long
        DerLig = Range("F65536").End(xlUp).Row
        For i = 4 To DerLig
            Cells(lig, "I") = Cells(lig, "F") - Cells(lig , "H")
        Next i
    End Sub
    A+
    Edit :Rectifier suivant ton dernier poste

  6. #6
    Membre régulier Avatar de mentat
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Août 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electrotechnicien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 139
    Points : 99
    Points
    99
    Par défaut
    Ok merci ça à l'aire de fonctionner sauf pour la mise à jour...

    J'ai une erreur 1004 sur cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Cells(lig, "I") = Cells(lig, "F") - Cells(lig, "H")
    Par contre j'ai un peut de mal à comprendre ces code peut tu me les détailler...

    En tout cas merci beaucoup...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 102
    Points : 117
    Points
    117
    Par défaut
    Bonjour

    Quand on utilise Cells, il faut des valeurs numériques
    Cells( numéro de ligne, numéro de colonne)
    Par contre avec Range on utilise une combinaison des 2
    Range("code alpha de la colonne" & numéro de la ligne)

    JP014

  8. #8
    Membre régulier Avatar de mentat
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Août 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Electrotechnicien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 139
    Points : 99
    Points
    99
    Par défaut
    Ok Alors voici pour la mise à jours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub CommandButton1_Click()
    Dim DerLig As Long
    Dim lig As Long
        DerLig = Range("F65536").End(xlUp).Row
        For i = 4 To DerLig
            Range("I" & i) = Range("F" & i) - Range("H" & i)
        Next i
    End Sub
    Merci à tous les deux ça fonctionne....

    Par contre je comprend pas trop la fonction Target... Je vais essayé de comprendre son fonctionnement.

    Mais tout fonctionne Merci encore.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 102
    Points : 117
    Points
    117
    Par défaut
    Bonjour

    Quand on utilise une macro évènementielle comme "change" le sytème nous indique la cellule ou la zone active par un "objet" qui a pour nom "Target".
    La propriété value permet de connaitre la valeur dans la cellule,
    Row donne le numéro de la ligne ou se trouve la cellule
    Column donne le numéro de la colonne
    .........................

    http://silkyroad.developpez.com/VBA/EvenementsFeuille/

    JP014

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    J'ai effectivement une erreur dans la mise à jour, employer i à la place de Lig (question d'habitude)
    Et pas besoin de compliquer la macro.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub MiseAJour()
    Dim DerLig As Long
    Dim lig As Long
        DerLig = Range("F65536").End(xlUp).Row
        For Lig = 4 To DerLig
            Cells(Lig, "I") = Cells(Lig, "F") - Cells(Lig , "H")
        Next Lig
    End Sub
    Target C'EST la cellule active et tu peu y puisser toute les propriétés d'une cellule.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/01/2015, 14h51
  2. [XL-2010] Code aléatoire pour toutes les cellules vides d'une colonne
    Par GADENSEB dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/09/2014, 16h07
  3. [RegEx] Extraire toutes les cellules d'une page html
    Par Patrick dans le forum Langage
    Réponses: 1
    Dernier message: 16/04/2008, 23h35
  4. Réponses: 2
    Dernier message: 20/02/2008, 18h08
  5. [VBA-E] supprimer le contenu de toutes les cellules d'une feuille
    Par BipBip2 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 13/08/2004, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo