VBA coller si cellules de destination sont vides

Bonjour,

Je cherche à écrire un code VBA qui me permettrait de coller les valeurs des plusieures colonnes sur d'autres colonnes de la même feuille, mais coller uniquement si les cellules de destination sont vides afin de ne pas écraser des données qui seraient déjà renseignées dans celles-ci.

Merci pour votre aide.

Bonjour LionSleep, le forum,

Un exemple basique......

7classeur1.xlsm (36.77 Ko)

Si cela ne te convient pas, pense à joindre un fichier...

Cordialement,

Merci Xorsankukai pour ta réponse et solution rapide.

C'est exactement ce que je cherche. Il me faudra encore l'adapter à mon tableau. J'espère y arriver.

Ma macro était là suivante:

Sub CopierValeurs()

  If Feuil1.Range("Be6:Be58, Bg6:Bg58, Bi6:Bi58, Bk6:Bk58, Bm6:Bm58, Bo6:Bo58, Bq6:Bq58, Bs6:Bs58, Bu6:Bt58, Bw6:Bw58").Value = "" Then

  Feuil1.Range("Be6:Be58").Value = Feuil1.Range("ac6:ac58").Value
  Feuil1.Range("Bg6:Bg58").Value = Feuil1.Range("ae6:ae58").Value
  Feuil1.Range("Bi6:Bi58").Value = Feuil1.Range("ag6:ag58").Value
  Feuil1.Range("Bk6:Bk58").Value = Feuil1.Range("ai6:ai58").Value
  Feuil1.Range("Bm6:Bm58").Value = Feuil1.Range("ak6:ak58").Value
  Feuil1.Range("Bo6:Bo58").Value = Feuil1.Range("am6:am58").Value
  Feuil1.Range("Bq6:Bq58").Value = Feuil1.Range("ao6:ao58").Value
  Feuil1.Range("Bs6:Bs58").Value = Feuil1.Range("aq6:aq58").Value
  Feuil1.Range("Bu6:Bu58").Value = Feuil1.Range("as6:as58").Value
  Feuil1.Range("Bw6:Bw58").Value = Feuil1.Range("au6:au58").Value
  End If

  MsgBox " Copie Effectuée ..."
End Sub

mais elle Beug dès la 1ere ligne

Par contre, ta macro est très lourde à s'exécuter. Près de 2 minutes sur mon pc. J'ai peur de ne pas pouvoir l'intégrer à mon fichier qui comprends bien plus de cellules à traiter. Ou alors c'est mon pc qui rame. Si tu as une suggestion!

Merci en tout cas, tu m'as permis de bien avancer dans mon projet. Merci beaucoup.

Ton code marche à merveille en fait. C'est mon ordi qui a planté.

Pourrais tu m'aider à adapter ton code pour qu'il fonctionne sur mon fichier?

Mon problème: lui indiquer les colonnes car c'est une colonne sur deux qu'il faut copier et idem, coller une sur deux.

Colonnes source: 30, 32, 34, 36, 38, 40, 42, 44, 46, 48

Colonnes de destination: 42, 44, 46,48 50, 52, 54, 56, 58, 60

J'ai écrie ce code mais bien sûr çà ne marche pas:

With Sheets("Feuil1")
   For lig = 6 To 58
    For col = 30, 32, 34, 36, 38, 40, 42, 44, 46, 48
     .Cells(lig, col + 6) = IIf(.Cells(lig, col + 6) = "", .Cells(lig, col), .Cells(lig, col + 6))
    Next col

Je pense approcher du but. J'ai indiqué les lignes et les colonnes à copier, mais je ne sais pas comment lui indiquer dans quelles colonnes coller les données.

le code bug encore sur cette ligne: je pense que c'est à cause du +6, entre autre...

   .Cells(lig, col + 6) = IIf(.Cells(lig, col + 6) = "", .Cells(lig, col), .Cells(lig, col + 6))

Que représente le +6? Un décalage de +6 colonne vers la droite à partir de la 1ére colonne désignée à savoir la colonne 30 pour repérer les colonnes de destination ?

Le collage des données se fera t-il aussi sur 1 colonne sur 2? Sinon comment l'indiquer?

Voici ou j'en suis:

Sub CopierValeurs()
 Dim lig%, col%

 Application.ScreenUpdating = False

  With Sheets("Feuil1")
   For lig = 6 To 58
    For col = 30 To 48 Step 2
     .Cells(lig, col + 6) = IIf(.Cells(lig, col + 6) = "", .Cells(lig, col), .Cells(lig, col + 6))
    Next col
   Next lig
  End With
End Sub

Merci pour votre aide.

Bonjour,

Sub CopierValeurs()
 Dim lig%, col%

 Application.ScreenUpdating = False

  With Sheets("Feuil1")
   For lig = 6 To 58
    For col = 30 To 48 Step 2
     .Cells(lig, col + 6) = IIf(.Cells(lig, col + 6) = "", .Cells(lig, col), .Cells(lig, col + 6))
    Next col
   Next lig
  End With
End Sub

Bravo, tu y es presque, bel effort !

Tu veux copier la colonne 30 dans la colonne 42, la 32 dans la 44 etc...donc un pas de 2 donc effectivement step2....

Donc

 .Cells(lig, col + 12) = IIf(.Cells(lig, col + 12) = "", .Cells(lig, col), .Cells(lig, col + 12))

Lorsque col vaut 30:

cellule (lig, 42)= si cellule(lig, 42)=vide alors, cellule(lig,30), sinon cellule(lig,42)

(Si le temps d'exécution de la macro est trop long, il faudra envisager l'utilisation d'un un tableau (array) pour gagner en rapidité).

Cordialement,

"Tu veux copier la colonne 30 dans la colonne 42, la 32 dans la 44 etc...donc un pas de 2 donc effectivementstep2...."

Non je me suis mal exprimé désolé, je veux copier la colonne 29 dans la colonne 57, la 31 dans la 59, la 33 dans la 61, jusqu'à la colonne 47 dans la colonne 75.

Voir ci-dessous.

img 20210427 103800

C'est s'en doute pour cela que le code ne marche pas encore. j'ai remplacé les .Cells(lig, col + 6) par .Cells(lig, col + 12) mais rien..

Re,

je veux copier la colonne 29 dans la colonne 57, la 31 dans la 59, la 33 dans la 61, jusqu'à la colonne 47 dans la colonne 75.

donc +28 pour la correspondance des colonnes...

Dans ce cas:

Sub CopierValeurs()
 Dim lig%, col%

 Application.ScreenUpdating = False

  With Sheets("Feuil1")
   For lig = 6 To 58
    For col = 29 To 47 Step 2
     .Cells(lig, col + 28) = IIf(.Cells(lig, col + 28) = "", .Cells(lig, col), .Cells(lig, col + 28))
    Next col
   Next lig
  End With
End Sub

Si lig=6 et col= 29 : on a bien

.cells(6,57) = si(.cells(6,57)= vide, alors .cells(6,29), sinon .cells(6,57)....

Cordialement,

oui c'est bien ça pourtant ça ne marche pas.

img 20210427 113321
img 20210427 123033

J'ai ce message qui apparaît au lancement de la macro, pourtant ma feuille n'est pas protégée, mais plus tard elle le sera bien sûr.

J'ai repris sous la même forme que ton fichier xorsankukai, les emplacements exacts des cellules et des colonnes de mon fichier original, en y intégrant le code vba qui s'active en cliquant sur le triangle jaune.

Sur mon Pc la procédure est très longue à s’exécuter et plante excel....

Merci de bien vouloir m'expliquer, voir corriger ce qui ne va pas.

6coller-si-vide.xlsm (135.75 Ko)

Désolé xorsankukai, en fait du code marche à merveille sur les deux fichiers, seulement, il ne marche pas sur mon fichier car les cellule sont verrouillées. Je ne peux pas enlever la protection de peur que les utilisateurs font de fausses manipulations. Une fois la feuille protégée, la macro ne fonctionne plus.

Alors comment faire fonctionner le code sur des cellules verrouillées? Enlever puis remettre la protection de la feuille?

image image

Je procède de cette façon, en verrouillant toutes les cellules de la feuille puis en protégeant la feuille en permettant de sélectionner les cellules verrouillées et non, afin de n'autoriser les utilisateurs à renseigner leurs données uniquement dans les plages de cellules leurs étant réservées par un code.

S'il y a une meilleure solution??? Merci

Re,

Enlever puis remettre la protection de la feuille?

Un truc du genre: (mets ton mot de passe entre les guillemets)

Sub CopierValeurs()
 Dim lig%, col%

 Application.ScreenUpdating = False

  With Sheets("Feuil1")
   .Unprotect "mot_de_passe"
    For lig = 6 To 58
     For col = 29 To 47 Step 2
      .Cells(lig, col + 28) = IIf(.Cells(lig, col + 28) = "", .Cells(lig, col), .Cells(lig, col + 28))
     Next col
    Next lig
   .Protect "mot_de_passe"
  End With
End Sub

Cordialement,

Merci beaucoup pour ton aide. Je testerai cela demain plus en profondeur. A priori cela ne résout pas mon problème car protéger ou pas, la macro beug sur mon fichier mais bizarrement pas sur le fichier que j'ai poster plus haut. Je vous tiens au courant.

tu as résolus mon problème de base.

Je tiens vraiment à te remercier xorsankukaipour l'aide très pratique que tu m'as apporter pour mon fameux copier coller.

Bientôt prêt à cliquer sur RÉSOLU.

Mai Il y a encore une chose que je ne comprend pas. Ton code fonctionne très bien si je déplace la feuille de calcul vers un nouveau fichier excel et que j'y intègre le code, mais il ne fonctionne pas sur le fichier sur lequel j'aimerai l'intégrer. Pourtant c'est le même onglet. Pourquoi? Qu'est ce qui fait que la macro bug? Elle exécute le travail, mais je suis obligé de faire Echap car elle fait scintiller pendant de longues minutes ma feuille excel. Comme si elle travaillait, cellule après cellule.

J'aimerais joindre le fichier qui me sert de test "Coller si vide 2" mais service non disponible. j’essaierai plus tard. L'onglet VCM DP de ce fichier est identique au fichier excel dans lequel je souhaite travailler ( j'ai fais un copier déplacer). Dans ce fichier test, le code fonctionne mais pas de mon fichier original. Aurais tu une idée du pourquoi?

Si nous parvenons à comprendre et surtout à résoudre ce problème, j'aimerai encore compliquer la macro afin quelle puisse permettent de remplir (copier/coller) à la fois les colonnes de gauches vers les colonnes de droites et des colonnes de droites vers celle de gauches. Si cellules vide bien sûr toujours.

Car l'utilisateur pourrait très bien commencer par renseigner les colonnes de droites (Les Week-end) avant celles de gauches (Les semaines).

Mais pour l'heure, Pourquoi ça ne marche pas dans mon fichier....

Voici le fichier test:

11coller-si-vide2.xlsm (170.22 Ko)

Merci pour ton aide

Bonjour,

J'ai refais des tests ce matin sur mes deux fichiers excel, mais rien à faire. Dans le fichier test, "coller-si-vide.xlsm, le code de xorsankukai fonctionne très bien mais pas dans le fichier ou j'aimerais l'intégrer. Pourtant j'ai fait une copier du même onglet vers ce classeur test.

De plus pour résoudre ma dernière demande, à savoir faire que le code copie/colle aussi bien les valeurs de gauche à droite que de droite à gauche, voici le code que j'ai complété, mai bien sûr il ne fonctionne pas. ça aurait été trop simple voyons!

Sub CopierValeurs()
 Dim lig%, col%

 Application.ScreenUpdating = False

  With Sheets("VCM DP")
   .Unprotect "333"
    For lig = 6 To 58
     For col = 29 To 47 Step 2
      .Cells(lig, col + 28) = IIf(.Cells(lig, col + 28) = "", .Cells(lig, col), .Cells(lig, col + 28))
     Next col
    Next lig
   .Protect "333"
  End With

  Application.ScreenUpdating = False

    With Sheets("VCM DP")

    For lig = 6 To 58
     For col = 57 To 75 Step 2
      .Cells(lig, col - 28) = IIf(.Cells(lig, col - 28) = "", .Cells(lig, col), .Cells(lig, col - 28))
     Next col
    Next lig
   .Protect "333"
  End With
End Sub

J'ai modifié les numéros de colonnes et remplacer les 3 "+28" par "-28". Je sais c'est drôlement nul! Mais je bosse.

J'aimerais vraiment résoudre ce problème qui dur maintenant depuis des jours afin, d'avancer, de proposer une solution efficace aux internautes et surtout, de vous libérer de ce sujet.

Bonjour,

J'ai testé ton fichier, la macro s'exécute bien jusqu'au bout....

J'ai regroupé tes 2 macros en une seule....

Sub CopierValeurs()
 Dim lig%, col%

  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual

  With Sheets("VCM DP")
   .Unprotect "333"
     For lig = 6 To 58
      For col = 29 To 47 Step 2
       .Cells(lig, col + 28) = IIf(.Cells(lig, col + 28) = "", .Cells(lig, col), .Cells(lig, col + 28))
       .Cells(lig, col) = IIf(.Cells(lig, col) = "", .Cells(lig, col + 28), .Cells(lig, col))
      Next col
     Next lig
   .Protect "333"
  End With

  Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
End Sub

Cordialement,

Super merci c'est exactement ce que je cherchais.

Et, Oui, elle s'exécute parfaitement c'est vrai, sauf dans le fichier dans lequel je la voudrais. 🥺🤔 Pas grave, je ne sais pas pourquoi.

Je te remercie profondément pour le temps et l'aide concrète que m'as accordé.

Tu as résolu mon problème.

Merci beaucoup pour la macro!

A bientôt peut-être!? 🤠

Re,

Merci pour le retour et pour avoir passé le sujet en résolu,

Bonne continuation,

A bientôt,

Rechercher des sujets similaires à "vba coller destination vides"