Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

VBA : copier valeurs cellules non " "

SARdynamite

XLDnaute Junior
Bonjour, sans base VBA j'ai essayer pendant 1 heure de bidouiller mais sans succès.

J'ai une plage C5:C15 de formules renvoyant une valeur ou " "

J'aimerais qu'à chaque modification d'une cellule de la plage B5:B15, les valeurs (pas les formules) des cellules non " " de C5:C15 soient copiées en D515

Les cellules " " de C5:C15 ne devant donc pas être copiées.

Je me remets à vous car j'avoue sècher. Merci d'avance.
 

Etienne2323

XLDnaute Impliqué
Re : VBA : copier valeurs cellules non " "

Salut SARdynamite,
voici une proposition. À mettre dans le module de la feuille en question.

Étant donné que les cellules qui n'ont pas de valeur sont remplies par du vide, on peut les inclure dans la copie de la plage et elles n'auront aucune incidence sur le résultat de la copie.

VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage As Range

Application.ScreenUpdating = False
Set Plage = Range("B5:B15")

If Not Intersect(Plage, Target) Is Nothing Then
    Application.EnableEvents = False
    Range("C5:C15").Copy
    Range("D5").PasteSpecial xlPasteValues
    Application.EnableEvents = True
End If

Set Plage = Nothing
End Sub

Cordialement,

Étienne
 
Dernière édition:

SARdynamite

XLDnaute Junior
Re : VBA : copier valeurs cellules non " "

Bonjour Etienne et merci beaucoup,

En réalité je veux vraiment ne pas copier les cellules " " car je souhaite après me servir de véritables cellules vides (complètement) pour un graphique.
C'est là tout le dilemne !
 

Etienne2323

XLDnaute Impliqué
Re : VBA : copier valeurs cellules non " "

Salut SARdynamite,

voici alors selon votre demande.

VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage As Range
Dim i as Long

Application.ScreenUpdating = False
Set Plage = Range("B5:B15")

If Not Intersect(Plage, Target) Is Nothing Then
    Application.EnableEvents = False
    For i = 5 To 15
        If Cells(i, 3).Value <> "" Then
            Cells(i, 3).Copy
            Cells(i, 4).PasteSpecial xlPasteValues
            Application.CutCopyMode = False
        End If
    Next i
    Application.EnableEvents = True
End If

Set Plage = Nothing

End Sub

Cordialement,

Étienne
 
Dernière édition:

Liline33

XLDnaute Nouveau
Re : VBA : copier valeurs cellules non " "

Bonjour Etienne et merci beaucoup,

En réalité je veux vraiment ne pas copier les cellules " " car je souhaite après me servir de véritables cellules vides (complètement) pour un graphique.
C'est là tout le dilemne !

Je ne sais pas sure d'avoir bien compris ton problème et si cette fonction peut résoudre ton soucis, en mettant dans la cellule D5 la formule :
=si(C5<>"";C5;"") --> recopier C5 si la valeur n'est pas nulle
et la recopier dans les autres cellules de la ligne D
 

SARdynamite

XLDnaute Junior
Re : VBA : copier valeurs cellules non " "

Liline c'est ce que je fais déjà dans ma colonne C5 par rapport aux cases B5

Etienne merci,
Au moment de modifier une cellule B5:B15 j'obtiens ce message d'erreur
 

Pièces jointes

  • Sans titre.jpg
    38.3 KB · Affichages: 64
  • Sans titre.jpg
    38.3 KB · Affichages: 65
  • Sans titre.jpg
    38.3 KB · Affichages: 68
  • Sans titre2.jpg
    62.1 KB · Affichages: 65
  • Sans titre2.jpg
    62.1 KB · Affichages: 68
  • Sans titre2.jpg
    62.1 KB · Affichages: 68
Dernière édition:

Etienne2323

XLDnaute Impliqué
Re : VBA : copier valeurs cellules non " "

Salut SARdynamite,
mes excuses. C'est mon erreur. J'ai modifié sans tester. Il faut déclarer la variable i dans le haut du module

Voir mon message précédent modifié.

Cordialement,

Étienne
 

Etienne2323

XLDnaute Impliqué
Re : VBA : copier valeurs cellules non " "

Re,
il faudrait également que tu t'assures que la procédure se termine bien par un
Code:
End Sub
et non seulement pas un
Code:
End

Cordialement,

Étienne
 

SARdynamite

XLDnaute Junior
Re : VBA : copier valeurs cellules non " "

Re !

3 erreurs : il copie la colonne C en colonne C et pas en D !
Il copie de mauvaises premières valeurs.
Et enfin il copie les " " par des 0 ! (hors il faudrait qu'il s'abstienne de les copier).

:O
 

Etienne2323

XLDnaute Impliqué
Re : VBA : copier valeurs cellules non " "

Salut SARdynamite

1) Il copie bel et bien en colonne D !!!
2) Il copie, tel que demandé, les valeurs de la colonne C vers la colonne D
3) J'aurais du comprendre que les " " étaient différents de "" (ce qui est normalement utilisé pour représenter du vide !!!)

Voici le code commenté qui prouve le tout.

VB:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage As Range
Dim i As Long

Application.ScreenUpdating = False

'Plage sur laquelle on réalise le test événementiel
Set Plage = Range("B5:B15")

'Si la cellule modifiée fait partie de notre plage de référence, soit B5:B15, alors ...
If Not Intersect(Plage, Target) Is Nothing Then
    Application.EnableEvents = False 'On va enlever le lancement événementiel l'instant du copiage
    For i = 5 To 15 'On va boucler sur les lignes 5 à 15
        
        'Si le contenu de la cellule de la colonne C est différent de "" et de " " alors
        If Cells(i, 3).Value <> "" And Cells(i, 3).Value <> " " Then
            Cells(i, 3).Copy 'On copie la cellule de la colonne C
            Cells(i, 4).PasteSpecial xlPasteValues 'On colle le tout dans la cellule de la colonne D correspondante
            Application.CutCopyMode = False 'Libère le presse-papier
        End If
    Next i
    Application.EnableEvents = True 'Remet le événementiel
End If

Set Plage = Nothing 'Vide la mémoire attribuée à notre variable Plage

End Sub

J'apprécie beaucoup de la reconnaissance comme celle-ci !!!

Je passe la main à quelqu'un d'autre pour la suite !

Etienne
 

SARdynamite

XLDnaute Junior
Re : VBA : copier valeurs cellules non " "

Je vous prie de m'excuser. Je suis très reconnaissant du temps et des efforts consacrés et mes intentions n'étaient pas de vous froisser.

Votre code fonctionne bel et bien comme je l'ai demandé, c'est mon adaptation à ma feuille réelle qui ne fonctionne pas.

J'ai juste changé B5:B15 pour K28:K267 et i = 28 to 267

ainsi que Cells(i , ) pour 2 autres colonnes 26 et 32 (en imaginant que le chiffre représentait le rang alphabétique de la colonne)

Je ne comprends pas

Merci encore ! Je suis tout sauf insensible à l'aide.
 
Dernière édition:

Etienne2323

XLDnaute Impliqué
Re : VBA : copier valeurs cellules non " "

Salut SARdynamite,
OK je passe l'éponge.

Sachez que le i représente la ligne et non la colonne.

Lorsqu'on travaille avec Cells(i,j), le premier terme est pour la ligne et le second pour la colonne tandis que lorsqu'on travaille avec Range("A1"), le premier terme est pour la colonne et le second pour la ligne.

Pour la suite, si ça ne fonctionne toujours pas, déposez votre fichier sur le forum. Travaillez avec du concret est toujours beaucoup plus facile.

Étienne
 

SARdynamite

XLDnaute Junior
Re : VBA : copier valeurs cellules non " "

Un dernier grand merci !
Grâce à vos explications détaillées j'ai pu m'en sortir.

Du coup j'ai compliqué la chose pour une plage ligne/colonne plutot qu'une simple colonne :

Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage As Range
Dim i As Long

Application.ScreenUpdating = False
Set Plage = Range("K28:K267")

If Not Intersect(Plage, Target) Is Nothing Then
    Application.EnableEvents = False
    For i = 28 To 267
        If Cells(i, 51).Value <> "" Then
            Cells(i, 51).Copy
            Cells(i, 56).PasteSpecial xlPasteValues
            Application.CutCopyMode = False
        Else: Cells(i, 56).Clear
        End If
        If Cells(i, 52).Value <> "" Then
            Cells(i, 52).Copy
            Cells(i, 57).PasteSpecial xlPasteValues
            Application.CutCopyMode = False
        Else: Cells(i, 57).Clear
        End If
        If Cells(i, 53).Value <> "" Then
            Cells(i, 53).Copy
            Cells(i, 58).PasteSpecial xlPasteValues
            Application.CutCopyMode = False
        Else: Cells(i, 58).Clear
        End If
        If Cells(i, 54).Value <> "" Then
            Cells(i, 54).Copy
            Cells(i, 59).PasteSpecial xlPasteValues
            Application.CutCopyMode = False
        Else: Cells(i, 59).Clear
        End If
    Next i
    Application.EnableEvents = True
    Range("B5").Select
End If

Set Plage = Nothing

End Sub

Ce code fonctionne mais est très long à être exécuté.

J'ai donc voulu alléger les choses pour gagner en rapidité

Code:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Plage As Range
Dim i As Long
Dim j As Long

Application.ScreenUpdating = False
Set Plage = Range("K28:K267")

If Not Intersect(Plage, Target) Is Nothing Then
    Application.EnableEvents = False
    For i = 28 To 267
        For j = 51 To 54
            If Cells(i, j).Value <> "" Then
                Cells(i, j).Copy
                Cells(i, 56).PasteSpecial xlPasteValues
                Application.CutCopyMode = False
            End If
        Next j
    Next i
    Application.EnableEvents = True
    Range("B5").Select
End If

Set Plage = Nothing

End Sub

...celui-ci ne fonctionne plus Si une âme charitable veut bien m'aider une ultime fois. A moins qu'il ne soit pas possible d'optimiser dans mon cas.

Pour cette ligne : Cells(i, 56).PasteSpecial xlPasteValues en fait les valeurs de (i , j) 51 à 54 doivent être collées en 56/57/58/59. C'est surement pour ça qu'il y a un sushi.

Bonne journée
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : VBA : copier valeurs cellules non " "

Bonjour,

pas tout suivi, mais... ceci devrait pouvoir s'alléger :
Code:
Cells(i, j).Copy
                Cells(i, 56).PasteSpecial xlPasteValues
                Application.CutCopyMode = False

de cette façon :
Code:
Cells(i, 56).Value = Cells(i, j).Value

bonne journée
@+
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…