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 D5:D15

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
    Sans titre.jpg
    38.3 KB · Affichages: 63
  • Sans titre.jpg
    Sans titre.jpg
    38.3 KB · Affichages: 65
  • Sans titre.jpg
    Sans titre.jpg
    38.3 KB · Affichages: 67
  • Sans titre2.jpg
    Sans titre2.jpg
    62.1 KB · Affichages: 64
  • Sans titre2.jpg
    Sans titre2.jpg
    62.1 KB · Affichages: 67
  • Sans titre2.jpg
    Sans titre2.jpg
    62.1 KB · Affichages: 67
Dernière édition:

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 !!! :mad:

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 :eek:

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 :eek: 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

Statistiques des forums

Discussions
312 459
Messages
2 088 582
Membres
103 885
dernier inscrit
xeps