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 :

Ajouter une nouvelle colonne sans décaler les indices dans les formules [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut Ajouter une nouvelle colonne sans décaler les indices dans les formules
    Bonjour a tous,

    Sur un fichier qui est mis à jour trimestriellement j'ai un tableau qui historise une partie de mes données.
    A chaque MàJ, via une macro j'insère une nouvelle colonne pour y historiser les derniers résultats avant de les remplacer.
    Il y a également à gauche de ce tableau un colonne contenant des formules pour vérifier la cohérence des derniers résultat.
    Mon problème est que lors de l'insertion de la nouvelle colonne, l'indice dans les formules de contrôle se décale automatiquement et donc ma formule ne pointe plus sur les derniers résultats mais sur les avant derniers.
    Ma question est donc la suivante, est-il possible d'inserer une colonne sans décaler les indices des formules?
    Si non, une idée pour contourner le problème?

    petit schéma au cas où mes propos ne soient pas clairs

    colonne A: formule avec référence à la colonne B
    colonne B: valeur
    MàJ: insertion de colonne en B
    colonne B -> colonne C
    colonne A avec référence à la colonne C alors que j'aimerais que la référence reste sur la colonne B

    Merci d'avance.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Technicien bureau d'études
    Inscrit en
    Novembre 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien bureau d'études

    Informations forums :
    Inscription : Novembre 2015
    Messages : 118
    Par défaut
    Bonjour Halaster.
    Si tu n'as besoin que de la valeur de la cellule en colonne B pour le reste de ta formule, tu peux utiliser la fonction indirect.
    Exemple en [a1] = =INDIRECT("b1")
    Quant tu vas insérer ta colonne cela restera conforme à ta demande.

  3. #3
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    +1 L'indirection me semble bien approprié

  4. #4
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Bonjour,

    Autre solution :
    En A1 :
    =DECALER(A1;0;1) fera référence à la cellule juste à droite de la cellule A1. Donc la cellule B1 avant et après insertion en colonne B.

    Lien pour plus d'infos sur la fonction DECALER

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Merci à tous,

    En fait je cherchais un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Calculation = xlCalculationManual
    A mettre dans ma macro mais pour les décalage d'indices, c'est pour ça que j'avais poster dans la section vba.

    Le problème avec vos solutions c'est que dois changer toutes mes formules et y en beaucoup et j'aurais aimé l'éviter mais si j'ai pas le choix...

    Du coup c'est la formule d'antony que je vais utiliser car elle s'adapte toute seule au changement de ligne, ce que ne fait pas la formule avec indirect.

    Merci encore.

  6. #6
    Membre Expert Avatar de antonysansh
    Homme Profil pro
    Chargé d'études RH
    Inscrit en
    Mai 2014
    Messages
    1 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé d'études RH
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2014
    Messages : 1 115
    Par défaut
    Beaucoup de formules, c'est-à-dire ?

    T'es formules sont uniquement des formules simples de ce genre : =B1 ?

    Si c'est le cas voila une conversion automatique :

    En B4 j'ai la formule =D6

    Je lance cette procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        Call Convert(Range("B4"))
    End Sub
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Convert(ByVal rg As Range)
        Dim ref As Range, RowDecalage&, ColumnDecalage&
            Set ref = Range(Replace(rg.Formula, "=", ""))
            RowDecalage = ref.Row - rg.Row
            ColumnDecalage = ref.Column - rg.Column
            rg.Formula = "=OFFSET(" & Replace(rg.Address, "$", "") & "," & RowDecalage & "," & ColumnDecalage & ")"
    fin:
        Set ref = Nothing
    End Sub
    Je me retrouve avec la formule =DECALER(B4;2;2) en B4.

    Tu peux ensuite boucler pour faire sur tout ton fichier.

  7. #7
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    C'est du genre b1-c1
    Et il y en a environ 11*6*5 soit 330, tableau sur 11ans 5 feuilles similaires et 6 tableaux par feuille.

    Mais avec ta formule je gagne déjà le *11 sur et peut être le *6 aussi.

    Bref rien d'insurmontable heureusement.
    Et même si j'avais du refaire les 330 forules je l'aurais fait aussi ou je l'aurais fais en programmant des boucles ce qui débugage compris m'aurais pris plus de temps.

    Edit: merci antony pour la macro, j'essayerais de l'adapter pour ma formule, ça me permettra de progresser.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Technicien bureau d'études
    Inscrit en
    Novembre 2015
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien bureau d'études

    Informations forums :
    Inscription : Novembre 2015
    Messages : 118
    Par défaut
    A ce moment là tu peux réagir différemment.
    Si nous restons en VBA pur tu peux utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    r = Range("a1:a" & [a65000].End(xlUp).Row).Formula
    Cells(1, 2).EntireColumn.Insert
    Cells(1, 1).Resize(UBound(r)) = r

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/09/2014, 11h30
  2. Réponses: 2
    Dernier message: 24/03/2014, 11h53
  3. Créer une nouvelle colonne sans les espaces
    Par dumor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/10/2008, 18h50
  4. ajouter une nouvelle colonne par un SELECT
    Par maysa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/09/2006, 13h14
  5. Réponses: 2
    Dernier message: 06/07/2006, 13h09

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