Code pour ne pas copier les lignes vides
Bonjour, pouvez vous m'aider sur cette macro?
Elle fonctionne parfaitement, je souhaite juste ajouter le code pour ne pas copier les lignes vides dans ma sélection.
Range("D14:I26").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("simulation").Select
Range("A16").Select
Selection.Insert Shift:=xlDown
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
End SubEdit modo : merci de mettre le code entre balises avec le bouton </>
merci de votre aide !
Nadege
Bonjour,
J'ai pas bien compris ton souhaite, peut être si tu joints le fichier te répondre serait plus simple.
Mais un petite piste :Sub
Dim Cel As Range
For Each Cel In Range("D14:I26")
If Cel.Value <> "" Then ' test si la cellule à une valeur non nul
'mettre le code
End If
End ForEn gros, la marco va tester la valeur de chaque cellule, si la valeur est non nulle (cellule non vide) le code que tu mettras à la suite se lancera
Bonjour Nadège,
Pourriez-vous nous dire quelle version d'excel vous utilisez ?
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
ci-dessous une proposition :
Sub test()
Dim ligne As Range, à_copier As Range
For Each ligne In Range("D14:I26").Rows
If Not ligne.Find("*") Is Nothing Then
If à_copier Is Nothing Then Set à_copier = ligne _
Else Set à_copier = Union(à_copier, ligne)
End If
Next ligne
If à_copier Is Nothing Then Exit Sub
à_copier.Copy
Sheets("simulation").Range("A16").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
End SubBonjour,
un essai:
Sub copiePlageCellules()
transfereLignesNonVides Range("D14:I26"), Range("A1")
End Sub
Sub transfereLignesNonVides(PlageSource As Range, CelluleCible As Range)
Dim tabSansLigneVide As Variant, tabSource As Variant
Dim LignesNonVides As New Collection
Dim ligneTableau As Long
'initialisations
tabSource = PlageSource.Value
'boucle sur les lignes
For i = LBound(tabSource, 1) To UBound(tabSource, 1)
If Not ligneVide(tabSource, i) Then
LignesNonVides.Add i
End If
Next i
'transfert des lignes vide dans un tableau pour export
If LignesNonVides.Count > 0 Then
ReDim tabSansLigneVide(1 To LignesNonVides.Count, 1 To UBound(tabSource, 2))
ligneTableau = 0
For Each ligne In LignesNonVides
ligneTableau = ligneTableau + 1
For j = LBound(tabSource, 2) To UBound(tabSource, 2)
tabSansLigneVide(ligneTableau, j) = tabSource(ligne, j)
Next j
Next ligne
'export du résultat
CelluleCible.Resize(UBound(tabSansLigneVide, 1), UBound(tabSansLigneVide, 2)).Value = tabSansLigneVide
End If
End Sub
Function ligneVide(tableau As Variant, ByVal ligne As Integer) As Boolean
Dim estVide As Boolean
'valeur par défaut
estVide = True
'vérification de la ligne
For j = LBound(tableau, 2) To UBound(tableau, 2)
If Not tableau(ligne, j) = "" Then
estVide = False
Exit For
End If
Next j
ligneVide = estVide
End FunctionBonjour à tous,
Sujet passionnant à priori
Une autre possibilité si la colonne "J" ne contient aucune donnée
Sub CopierLigneNonVide()
Dim Lig As Long, NbLig As Long
Application.ScreenUpdating = False
' Avec la feuille active
With ActiveSheet
' Ajouter une formule en colonne J si vide
.Range("J14:J26").FormulaLocal = "=NBVAL(D14:I14)"
' Filter les lignes dont le nombre de valeurs > 0
With .Range("D14:J26")
.AutoFilter
.AutoFilter Field:=7, Criteria1:=">0", Operator:=xlAnd
End With
' Compter le nombre de ligne visible
For Lig = 14 To 26
If .Range("D" & Lig).EntireRow.Hidden = False Then NbLig = NbLig + 1
Next Lig
End With
' Avec la feuille de simulation
With Sheets("simulation")
' Insérer le nombre de lignes nécessaires
.Range("A16:A" & 16 + NbLig).Insert Shift:=xlDown
' Copier les lignes filtrées
ActiveSheet.Range("D14:I26").Copy
' Coller les valeurs
.Range("A16").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
End With
With ActiveSheet
.Range("D14:J26").AutoFilter
.Range("J14:J26").ClearContents
End With
Application.ScreenUpdating = True
End SubA+
Et moi qui pensais que cela serait tout simple, qu'il suffisait juste de rajouter une petite ligne
Merci pour toutes vos réponses, je vais faire des essais et vous tiens au jus !
très bonne journée
bonjour,
plus court ??? (version définitif est pour ce soir)
Sub Macro1()
a = Range("D14:I26").Value
ReDim a1(1 To UBound(a))
For i = 1 To UBound(a)
a1(i) = IIf(Len(Join(Application.Index(a, i, 0), "")), i, "~")
Next
fl = Filter(a1, "~", 0)
If UBound(fl) > -1 Then
fl1 = Application.Transpose(fl)
a2 = Application.Index(a, fl1, Array(1, 2, 3, 4, 5, 6))
Sheets("simulation").Range("A16").Resize(UBound(a2), UBound(a2, 2)).Value = a2
End If
End SubBonjour à tous,
j'ai bien pris le temps d'essayer et toutes vos propositions ne fonctionnent pas.
Peut être est ce dû aux formules dans les cellules vides ?
bonjour,
la code originale contenait "Selection.PasteSpecial Paste:=xlPasteValues", donc des formules ne sont pas collé.
Donc les proposition fonctionnent bien, la question était douteux. C'est mieux d'ajouter un fichier.
bonjour,
la code originale contenait "Selection.PasteSpecial Paste:=xlPasteValues", donc des formules ne sont pas collé.
Donc les proposition fonctionnent bien, la question était douteux. C'est mieux d'ajouter un fichier.
En effet il n'était pas question de formules...
Un essai de modification:
Sub copiePlageCellules()
transfereLignesNonVides Range("D14:I26"), Range("A1")
End Sub
Sub transfereLignesNonVides(PlageSource As Range, CelluleCible As Range)
Dim tabSansLigneVide As Variant, tabSource As Variant
Dim LignesNonVides As New Collection
Dim ligneTableau As Long
'initialisations
tabSource = PlageSource.Formula
'boucle sur les lignes
For i = LBound(tabSource, 1) To UBound(tabSource, 1)
If Not ligneVide(tabSource, i) Then
LignesNonVides.Add i
End If
Next i
'transfert des lignes vide dans un tableau pour export
If LignesNonVides.Count > 0 Then
ReDim tabSansLigneVide(1 To LignesNonVides.Count, 1 To UBound(tabSource, 2))
ligneTableau = 0
For Each ligne In LignesNonVides
ligneTableau = ligneTableau + 1
For j = LBound(tabSource, 2) To UBound(tabSource, 2)
tabSansLigneVide(ligneTableau, j) = tabSource(ligne, j)
Next j
Next ligne
'export du résultat
CelluleCible.Resize(UBound(tabSansLigneVide, 1), UBound(tabSansLigneVide, 2)).Formula = tabSansLigneVide
End If
End Sub
Function ligneVide(tableau As Variant, ByVal ligne As Integer) As Boolean
Dim estVide As Boolean
'valeur par défaut
estVide = True
'vérification de la ligne
For j = LBound(tableau, 2) To UBound(tableau, 2)
If Not tableau(ligne, j).Formula = "" Then
estVide = False
Exit For
End If
Next j
ligneVide = estVide
End FunctionJ'ai remplacé Value par Formula, les formules qui ne renvoient rien seront prises en compte et copiées.