Copier/coller en VBA marche pas sur la 1ère case

Bonjour,

J'ai élaboré une macro, à partir de ce que j'ai trouvé, afin de copier/coller une autre case, contenant une formule, si une case à cocher est cochée.

Ceci afin d'avoir une formule qui s'adapte à la ligne dans laquelle elle est mise (je n'ai pas trouvé d'autre solution pour cela)

Vers la fin de cette macro je copie/colle les valeurs sur elles même afin de ne plus avoir de formule (qui se mettent à jour au lancement et font ramer). J'utilise pour ça la même range qui m'a permis de remplir les cases.

ActiveSheet.Range("B" & xRg.Row) = ActiveSheet.Range("B" & xRg.Row).Value

La macro marche bien sauf que ma première ligne avec une case cochée se retrouve avec #valeur ou 0 au lieu du résultat attendu.

J'ai identifier que le copier/coller valeur était le problème car quand je l'enlève le problème disparait (mais du coup j'ai une formule alors que je voudrai avoir une valeur pour éviter de ramer).

Je peux aussi rajouter que je ne vois pas la macro passer par cette case, alors que je vois les autres cases être surlignées. D'ailleurs auriez-vous un moyen d'empêcher le tableur d'afficher les changements de cellules et/ou de feuille ? Je pense que ça réduirait le chargement.

J'ai essayé en passant par différentes façon de copier coller (en plusieurs lignes, avec sélection) en gardant la même range mais rien n'y fait.

Mais cela marche si je fais une 2ème macro avec exactement le même code ! (même trucs désactivé, même range juste la partie avec ma formule en moins) et si je l'exécute indépendamment, si je fait un call dans la 1ère, tjr le même problème, mais si je l'exécute moi même ça marche impec ...

Je précise que dans mon vrai fichier sur lequel je travail, j'ai tjr besoin que le calcul des formule soit actif, c'est qu'une formule personnalisée est présente en bcp d'exemplaire et fait ramer le fichier au démarrage (mise à jour de bcp de valeur en fonction d'une bdd externe), je veux donc faire passer cette mise à jour sur un bouton

Merci d'avance pour votre aide !

Voici le code complet :

Sub getPRItest()

    Dim xRg As Range

        With ThisWorkbook.ActiveSheet

            Application.ScreenUpdating = False
            Application.EnableEvents = False
            Application.Calculation = xlCalculationManual
            'Pour accélérer la macro

            For Each xRg In .Range("A1:A10")
            If UCase(xRg.Text) = "VRAI" Then

            ThisWorkbook.Worksheets("Feuil3").Range("B12").Copy
            ActiveSheet.Range("B" & xRg.Row).PasteSpecial

            ActiveSheet.Range("B" & xRg.Row) = ActiveSheet.Range("B" & xRg.Row).Value

            Application.ScreenUpdating = True
            Application.EnableEvents = True
            Application.Calculation = xlCalculationAutomatic

            End If
            Next xRg
End With
End Sub
5test.xlsm (35.22 Ko)

Salut,

J'ai réécrit ton code. A tester !

Sub getPRItest()

    Dim lastrow As Long
    Dim xRg As Range 'Déclaration des ranges

    lastrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    'Pour accélérer la macro

            For Each xRg In ActiveSheet.Range("A1:A" & lastrow)
            If UCase(xRg.Text) = "VRAI" Then

            ActiveSheet.Range("B" & xRg.Row) = Worksheets("Feuil3").Range("B12").Value

            End If
            Next xRg

    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic

End Sub

Pour info, tu remettais les paramètres d'affichage au mauvais endroit dans ton code du coup ça ne servait à rien car il le réactivait dès la première boucle.

Girodo,

Merci de ta réponse, elle m'a permis de trouver le problème !

Le problème venait de "Application.Calculation = xlCalculationManual"

En effet je passait en manuel, copier/coller ma formule, la valeur n"était pas recalculée puis je copier/coller la valeur sur elle même, donc j'obtenais un 0 ^^ et ça n'arrivait que sur la première cellule car je repassait en automatique dès la première boucle !

J'ai donc corrigé ça et je n'ai plus le problème.

Pour les autres modifications que tu as apporté à mon code, j'ai gardé ma version car mon but était de coller une formule qui s'adapte dans mes cellule, je ne veux donc ni copier/coller la valeur (me donnerai un 0), ni la formule (me donnerai la formule brut, sans adaptation).

ex: je copie en A1 "=somme(B1;C1)", quand je vais la coller, j'aurai en K1 "=somme(L1;M1)" et en K35 "somme(L35;M35)

Afin d'obtenir plus généralement en K# "=somme(L#;M#)" avec # = xRg.Row mais je n'ai pas réussi à le coder directement donc j'ai fait pas copier collé d'une case.

Si tu as une autre solution, je suis preneur !

J'ai laissé le application.calculation dans mon code (dans chaque boucle), je ne sais pas si c'est vraiment utile mais bon. Est-ce que ça peut causer de la latence de passer en manuel et en auto à chaque boucle ? (il y a bcp de boucles)

Voici donc le code :

Sub getPRItest()

    Dim xRg As Range

        With ThisWorkbook.ActiveSheet

            Application.ScreenUpdating = False
            Application.EnableEvents = False
            'Pour accélérer la macro

            For Each xRg In .Range("A1:A10")
            If UCase(xRg.Text) = "VRAI" Then

            Application.Calculation = xlCalculationManual

            ThisWorkbook.Worksheets("Feuil3").Range("B12").Copy
            ActiveSheet.Range("B" & xRg.Row).PasteSpecial

            Application.Calculation = xlCalculationAutomatic

            ActiveSheet.Range("B" & xRg.Row) = ActiveSheet.Range("B" & xRg.Row).Value

            End If
            Next xRg

            Application.ScreenUpdating = True
            Application.EnableEvents = True
            Application.Calculation = xlCalculationAutomatic

End With
End Sub
Rechercher des sujets similaires à "copier coller vba marche pas 1ere case"