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 :

xlPasteFormulas décale les indices des formules


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2022
    Messages : 11
    Par défaut xlPasteFormulas décale les indices des formules
    Bonjour,

    A l'instant je rencontre un problème sur une macro, je ne peux pas poster les classeurs qui sont confidentiels mais le problème me paraît assez simple à décrire.

    J'ai un tableau dans une feuille X remplis grâce à des formules. Je souhaite copier et coller ce tableau d'une feuille à une autre située dans le même classeur en conservant les formules à l'identique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If Not wsExtractNomcl.Columns(numero_colonne_extract_nomcl_audric).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av)) Is Nothing Then
                    Ligne_Affaire_Extract_Nomcl = wsExtractNomcl.Columns(numero_colonne_extract_nomcl_audric).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av)).Row
                    wsExtractNomcl.Range("B" & Ligne_Affaire_Extract_Nomcl & ":" & "H" & Ligne_Affaire_Extract_Nomcl + 16).Copy
                    wsSuivi.Range("B" & indice_feuille_suivi).PasteSpecial (xlPasteAll)
    ElseIf Not wsExtractNomcl.Columns(numero_colonne_extract_nomcl_vincent).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av)) Is Nothing Then
                    Ligne_Affaire_Extract_Nomcl = wsExtractNomcl.Columns(numero_colonne_extract_nomcl_vincent).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av)).Row
                    wsExtractNomcl.Range("J" & Ligne_Affaire_Extract_Nomcl & ":" & "P" & Ligne_Affaire_Extract_Nomcl + 16).Copy
                    wsSuivi.Range("B" & indice_feuille_suivi).PasteSpecial (xlPasteAll)
    End If
    La macro me le copie bien cependant les indices dans la formule se décalent. Typiquement la première formule est écrite à la ligne 6 de la feuille X et cette formule est :
    ='Feuille X'!$D4

    Dans la formule copiée et collée dans l'autre feuille la formule est écrite à la ligne 3 et devient :
    ='Feuille X'!$D1

    Je souhaiterais que Excel ne recalcule pas l'indice contenu dans la formule, qu'elle soit simplement copiée-collée tel quelle. Donc je souhaite que la formule copiée est collée dans l'autre feuille écrite à la ligne 3 soit :
    ='Feuille X'!$D4

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 248
    Par défaut
    Hello,
    si tu veux que la formule soit la même il faut mettre les références dans la formule en Absolue exemple :
    ='Feuille X'!$D$4
    Ami calmant, J.P

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2022
    Messages : 11
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,
    si tu veux que la formule soit la même il faut mettre les références dans la formule en Absolue exemple :


    Ami calmant, J.P
    Ah super ça marche nickel, en plus de ça ce n'était pas mon seul problème et vous avez résolu l'autre problème en même temps. Merci bien !

  4. #4
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2022
    Messages : 11
    Par défaut
    J'en profite pour demander autre chose :

    Comment je met toute une plage de cellules en référence absolue ?
    Je peux le faire cellule par cellule mais il y a 5000 lignes et j'ai pas vraiment envie de passer 10h à le faire ligne par ligne

  5. #5
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Bonjour

    autre approche : au lieu de faire une copie, tu fais une assignation de la formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wsSuivi.Range("B" & indice_feuille_suivi).Formula =  wsExtractNomcl.Range("B" & Ligne_Affaire_Extract_Nomcl & ":" & "H" & Ligne_Affaire_Extract_Nomcl + 16).Formula
    Avec FormulaR1C1 c'est équivalent à une copie, avec Formula c'est forcément en absolu (c'est =A1" qui est copié)

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2022
    Messages : 11
    Par défaut
    Citation Envoyé par Tête de chat Voir le message
    Bonjour

    autre approche : au lieu de faire une copie, tu fais une assignation de la formule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wsSuivi.Range("B" & indice_feuille_suivi).Formula =  wsExtractNomcl.Range("B" & Ligne_Affaire_Extract_Nomcl & ":" & "H" & Ligne_Affaire_Extract_Nomcl + 16).Formula
    Avec FormulaR1C1 c'est équivalent à une copie, avec Formula c'est forcément en absolu (c'est =A1" qui est copié)
    Merci de ta réponse je viens de tester et ta solution marche aussi. Cependant j'ai encore un problème qui est que les données de départ ne sont pas bonnes quand elles sont en colonnes absolues (c'est à dire type $D1).

    J'ai testé de les mettre en références absolues (c'est-à-dire type $D$1) et là les données sont bonnes.

    Le problème étant que j'ai 5000 lignes que je dois mettre en référence absolue et avant de coder une macro pour pas me les taper à la mano je voulais savoir s'il était possible de le faire avec une fonction excel déjà toute faite

  7. #7
    Membre émérite
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2022
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2022
    Messages : 685
    Par défaut
    Rien compris...

    Que la cellule de départ, disons A1, contienne =D1, =$D1, =D$1 ou =$D$1, et que tu fais par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A2").formula = Range("A1").formula
    , tu va te rerouver en A2 avec la même formule =D1, =$D1, =D$1 ou =$D$1...
    ... qui est ce que tu avais demandé ou du moin ce que je croyais que tu avais demandé !

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 248
    Par défaut
    Citation Envoyé par disel Voir le message
    Le problème étant que j'ai 5000 lignes que je dois mettre en référence absolue et avant de coder une macro pour pas me les taper à la mano je voulais savoir s'il était possible de le faire avec une fonction excel déjà toute faite
    Tu peux essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub ConvertRelativeToAbsolute()
    Dim cell As Range, strFormulaOld$, strFormulaNew$
    For Each cell In Cells.SpecialCells(3)
    strFormulaOld = cell.Formula
    strFormulaNew = _
    Application.ConvertFormula _
    (Formula:=strFormulaOld, fromReferenceStyle:=xlA1, _
    toReferenceStyle:=xlA1, toAbsolute:=xlAbsolute)
    cell.Formula = strFormulaNew
    Next cell
    End Sub

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 525
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 525
    Par défaut
    Citation Envoyé par disel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    If Not wsExtractNomcl.Columns(numero_colonne_extract_nomcl_audric).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av)) Is Nothing Then
                    Ligne_Affaire_Extract_Nomcl = wsExtractNomcl.Columns(numero_colonne_extract_nomcl_audric).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av)).Row
                    wsExtractNomcl.Range("B" & Ligne_Affaire_Extract_Nomcl & ":" & "H" & Ligne_Affaire_Extract_Nomcl + 16).Copy
                    wsSuivi.Range("B" & indice_feuille_suivi).PasteSpecial (xlPasteAll)
    ElseIf Not wsExtractNomcl.Columns(numero_colonne_extract_nomcl_vincent).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av)) Is Nothing Then
                    Ligne_Affaire_Extract_Nomcl = wsExtractNomcl.Columns(numero_colonne_extract_nomcl_vincent).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av)).Row
                    wsExtractNomcl.Range("J" & Ligne_Affaire_Extract_Nomcl & ":" & "P" & Ligne_Affaire_Extract_Nomcl + 16).Copy
                    wsSuivi.Range("B" & indice_feuille_suivi).PasteSpecial (xlPasteAll)
    End If
    Heu ... tu arrives à te relire ?

    Tu peux factoriser et simplifier tout cela, ca faciliteras la maintenance:
    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
    20
    21
    22
    23
    24
    25
        Dim FoundAudric As Excel.Range
        Set FoundAudric = wsExtractNomcl.Columns(numero_colonne_extract_nomcl_audric).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av))
     
        Dim FoundVincent As Excel.Range
        Set FoundVincent = wsExtractNomcl.Columns(numero_colonne_extract_nomcl_vincent).Find(wsListeProjetsAR.Cells(indice_affaire_voulue, numero_colonne_av))
     
        Dim Source As String
        Dim Target As String
        Dim DoCopy As Boolean
        If Not (FoundAudric Is Nothing) Then
            Ligne_Affaire_Extract_Nomcl = FoundAudric.Row
            Source = "B" & Ligne_Affaire_Extract_Nomcl & ":" & "H" & Ligne_Affaire_Extract_Nomcl + 16
            Target = "B" & indice_feuille_suivi
            DoCopy = True
        ElseIf Not (FoundVincent Is Nothing) Then
            Ligne_Affaire_Extract_Nomcl = FoundVincent.Row
            Source = "J" & Ligne_Affaire_Extract_Nomcl & ":" & "P" & Ligne_Affaire_Extract_Nomcl + 16
            Target = "B" & indice_feuille_suivi
            DoCopy = True
        End If
     
        If (DoCopy) Then
            wsExtractNomcl.Range(Source).Copy
            wsSuivi.Range(Target).PasteSpecial xlPasteAll
        End If
    Il y a peut être moyen de faire mieux, mais c'est déja plus claire.

  10. #10
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2022
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Septembre 2022
    Messages : 11
    Par défaut
    Citation Envoyé par Tête de chat Voir le message
    Rien compris...

    Que la cellule de départ, disons A1, contienne =D1, =$D1, =D$1 ou =$D$1, et que tu fais par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range("A2").formula = Range("A1").formula
    , tu va te rerouver en A2 avec la même formule =D1, =$D1, =D$1 ou =$D$1...
    ... qui est ce que tu avais demandé ou du moin ce que je croyais que tu avais demandé !
    Oui tu as totalement répondu à ma première question et je t'en remercie.
    Ma deuxième portait sur totalement autre chose mais jurassic pork m'a donné la réponse, donc c'est bon

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/03/2014, 18h35
  2. [Excel] 2007 change les coordonnées des formules?
    Par bakonu dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 30/10/2013, 07h57
  3. Réponses: 2
    Dernier message: 28/09/2011, 13h51
  4. [JFreeChart] incliner les indications des axes
    Par Ivelios dans le forum 2D
    Réponses: 4
    Dernier message: 27/07/2009, 10h45
  5. C'est quoi les INDICES des triangles?
    Par Happy dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/03/2006, 22h03

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