Code imcomplet

Résolu
Bonjour !

C'est encore moi, j'ai encore un petit soucis de collage de cellules vides que je voudrai éviter.
Je vous joins mon code, il n'est pas très pro ,mais il fonctionne.
Seul hic, la remonter dans mes onglets "saisie" et "mouvement caisse" de cellules vides que je ne veux pas.
Un grand merci pour votre collaboration.

Sub encaissé1()

Sheets("mouvement caisse").Visible = True
   Sheets("mouvement caisse").Select
    ActiveSheet.Unprotect
    
 Sheets("saisie").Visible = True
   Sheets("saisie").Select
    ActiveSheet.Unprotect
    
    Dim plage_à_copier, première_cellule_vide, plage_collée As Range
    
 With Sheets("caisse")
        Set plage_à_copier = Range(.[AA2], .[AH:AH].Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious))
        End With
        
plage_à_copier.Copy
        
 With Sheets("mouvement caisse")
         
Set première_cellule_vide = .[A:A].Find("", SearchOrder:=xlByRows, SearchDirection:=xlNext)
        End With
        première_cellule_vide.PasteSpecial Paste:=xlPasteValues, Transpose:=False
       
        plage_à_copier.Copy
        

        With Sheets("SAISIE")
            Set première_cellule_vide = .[A:A].Find("", SearchOrder:=xlByRows, SearchDirection:=xlNext)
        End With
        première_cellule_vide.PasteSpecial Paste:=xlPasteValues, Transpose:=False
        
        

    Set plage_collée = première_cellule_vide.Resize(plage_à_copier.Rows.Count, plage_à_copier.Columns.Count)

    Sheets("mouvement caisse").Select
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    Range("A1").Select
   Sheets("mouvement caisse").Visible = False

    Sheets("saisie").Select
    ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
    Range("A1").Select
    Sheets("saisie").Visible = False

    
    
    Sheets("caisse").Select
    Range("AB2:AB36,AD2:AD36,AF2:AF36,AI2:AI36").Select
    Range("AD2").Activate
    Selection.ClearContents
    ActiveWindow.ScrollColumn = 20
    ActiveWindow.ScrollColumn = 18
    ActiveWindow.ScrollColumn = 17
    ActiveWindow.ScrollColumn = 13
    ActiveWindow.ScrollColumn = 11
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
    Range("A1").Select

 Sheets("saisie").Visible = True
    Sheets("saisie").Select
    
     Range("A1:h6000").Select
    Selection.Copy
    Range("L1").Select


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

13 réponses

  1. Bonjour,

    Tout d'abord une remarque. Il manque la fin du code ou alors c'est un extrait et ces lignes me paraissent superflues

    ActiveWindow.ScrollColumn = 20
    ActiveWindow.ScrollColumn = 18
    ActiveWindow.ScrollColumn = 17
    ActiveWindow.ScrollColumn = 13
    ActiveWindow.ScrollColumn = 11
    ActiveWindow.ScrollColumn = 6
    ActiveWindow.ScrollColumn = 4
    ActiveWindow.ScrollColumn = 2
    ActiveWindow.ScrollColumn = 1
     

    Ton problème est-il relatif à des cellules vides à l'intérieur d'une ligne ou à des lignes entièrement vides ?
    1. Bonsoir thev !

      Avant tout merci de prendre en compte mon problème.

      Mes lignes à copier vont de AB à AH. Dans les colonnes AE,AG,AH j’ai des formules qui prennent en compte les valeurs des colonnes adjacentes. Même vides ces lignes de AB à AH sont copiées et collées sans les formules. Je le remarque lorsque je fais des tris sur mes onglets de destination.
      1. Bonsoir,

        ce code modifié vous évitera de copier les lignes vides de la plage utilisée des colonnes AB à AH


        Sub encaissé1()

        Sheets("mouvement caisse").Visible = True
        Sheets("mouvement caisse").Select
        ActiveSheet.Unprotect

        Sheets("saisie").Visible = True
        Sheets("saisie").Select
        ActiveSheet.Unprotect

        Dim plage_à_copier As Range, première_cellule_vide As Range, plage_collée As Range

        Set xl = Excel.Application 'application Excel
        For Each ligne In Sheets("caisse").UsedRange.Columns("AB:AH").Rows 'plage des lignes utilisées dans les colonnes AB à AH
        If Join(xl.Transpose(xl.Transpose(ligne.Value)), "") <> Empty _
        And ligne.Row <> 1 Then 'si la ligne n'est pas vide et n'est pas la première
        'stockage des lignes à copier
        If plage_à_copier Is Nothing Then Set plage_à_copier = ligne _
        Else Set plage_à_copier = Union(plage_à_copier, ligne)
        Next ligne

        plage_à_copier.Copy
        With Sheets("mouvement caisse")
        Set première_cellule_vide = .[A:A].Find("", SearchOrder:=xlByRows, SearchDirection:=xlNext)
        If première_cellule_vide Is Nothing Then Set première_cellule_vide = .[A1]
        End With
        première_cellule_vide.PasteSpecial Paste:=xlPasteValues, Transpose:=False

        plage_à_copier.Copy
        With Sheets("SAISIE")
        Set première_cellule_vide = .[A:A].Find("", SearchOrder:=xlByRows, SearchDirection:=xlNext)
        If première_cellule_vide Is Nothing Then Set première_cellule_vide = .[A1]
        End With
        première_cellule_vide.PasteSpecial Paste:=xlPasteValues, Transpose:=False
        Set plage_collée = première_cellule_vide.Resize(plage_à_copier.Rows.Count, plage_à_copier.Columns.Count)

        Sheets("mouvement caisse").Select
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        Range("A1").Select
        Sheets("mouvement caisse").Visible = False

        Sheets("saisie").Select
        ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
        Range("A1").Select
        Sheets("saisie").Visible = False

        Sheets("caisse").Select
        Range("AB2:AB36,AD2:AD36,AF2:AF36,AI2:AI36").Select
        Range("AD2").Activate
        Selection.ClearContents

        Sheets("saisie").Visible = True
        Sheets("saisie").Select

        Range("A1:h6000").Select
        Selection.Copy
        Range("L1").Select

        End Sub

        --
         
        1. Merci pour le temps que vous me consacrez

          Mais j'ai le message "erreur de compilation variable non définie" qui arrive à la ligne:
          Set xl = Excel.Application

          Prenez votre temps pour me répondre, demain sera un autre jour.

          Merci
          1. ajouter la définition de ligne

               Dim xl As Excel.Application
            Dim ligne As Range, plage_à_copier As Range, première_cellule_vide As Range, plage_collée As Range

            1. Merci pour ton aide, surtout à des heures aussi tardives,

              Ci-dessous le code modifié. Mais maintenant j'ai le message" Next sans For" qui apparait à la ligne Next ligne du code.

              Sheets("mouvement caisse").Visible = True
              Sheets("mouvement caisse").Select
              ActiveSheet.Unprotect

              Sheets("saisie").Visible = True
              Sheets("saisie").Select
              ActiveSheet.Unprotect

              Dim xl As Excel.Application
              Dim ligne As Range, plage_à_copier As Range, première_cellule_vide As Range, plage_collée As Range

              Set xl = Excel.Application 'application Excel
              If Join(xl.Transpose(xl.Transpose(ligne.Value)), "") <> Empty Then 'si la ligne n'est pas vide
              'stockage des lignes à copier
              If plage_à_copier Is Nothing Then Set plage_à_copier = ligne _
              Else Set plage_à_copier = Union(plage_à_copier, ligne)
              End If
              Next ligne

              plage_à_copier.Copy
              With Sheets("mouvement caisse")
              Set première_cellule_vide = .[A:A].Find("", SearchOrder:=xlByRows, SearchDirection:=xlNext)
              If première_cellule_vide Is Nothing Then Set première_cellule_vide = .[A1]
              End With
              première_cellule_vide.PasteSpecial Paste:=xlPasteValues, Transpose:=False

              plage_à_copier.Copy
              With Sheets("SAISIE")
              Set première_cellule_vide = .[A:A].Find("", SearchOrder:=xlByRows, SearchDirection:=xlNext)
              If première_cellule_vide Is Nothing Then Set première_cellule_vide = .[A1]
              End With
              première_cellule_vide.PasteSpecial Paste:=xlPasteValues, Transpose:=False

              Set plage_collée = première_cellule_vide.Resize(plage_à_copier.Rows.Count, plage_à_copier.Columns.Count)

              Sheets("mouvement caisse").Select
              ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
              Range("A1").Select
              Sheets("mouvement caisse").Visible = False

              Sheets("saisie").Select
              ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
              Range("A1").Select
              Sheets("saisie").Visible = False

              Sheets("caisse").Select
              Range("AB2:AB36,AD2:AD36,AF2:AF36,AI2:AI36").Select
              Range("AD2").Activate
              Selection.ClearContents

              Sheets("saisie").Visible = True
              Sheets("saisie").Select

              Range("A1:h6000").Select
              Selection.Copy
              Range("L1").Select
              1. ci-joint code corrigé

                Sub encaissé1()

                Sheets("mouvement caisse").Visible = True
                Sheets("mouvement caisse").Select
                ActiveSheet.Unprotect

                Sheets("saisie").Visible = True
                Sheets("saisie").Select
                ActiveSheet.Unprotect

                Dim xl As Excel.Application
                Dim ligne As Range, plage_à_copier As Range, première_cellule_vide As Range, plage_collée As Range

                Set xl = Excel.Application 'application Excel
                For Each ligne In Sheets("caisse").UsedRange.Columns("AB:AH").Rows 'plage des lignes utilisées dans les colonnes AB à AH
                If Join(xl.Transpose(xl.Transpose(ligne.Value)), "") <> Empty _
                And ligne.Row <> 1 Then 'si la ligne n'est pas vide et n'est pas la première
                'stockage des lignes à copier
                If plage_à_copier Is Nothing Then Set plage_à_copier = ligne _
                Else Set plage_à_copier = Union(plage_à_copier, ligne)
                End If
                Next ligne

                plage_à_copier.Copy
                With Sheets("mouvement caisse")
                Set première_cellule_vide = .[A:A].Find("", SearchOrder:=xlByRows, SearchDirection:=xlNext)
                If première_cellule_vide Is Nothing Then Set première_cellule_vide = .[A1]
                End With
                première_cellule_vide.PasteSpecial Paste:=xlPasteValues, Transpose:=False

                plage_à_copier.Copy
                With Sheets("SAISIE")
                Set première_cellule_vide = .[A:A].Find("", SearchOrder:=xlByRows, SearchDirection:=xlNext)
                If première_cellule_vide Is Nothing Then Set première_cellule_vide = .[A1]
                End With
                première_cellule_vide.PasteSpecial Paste:=xlPasteValues, Transpose:=False
                Set plage_collée = première_cellule_vide.Resize(plage_à_copier.Rows.Count, plage_à_copier.Columns.Count)

                Sheets("mouvement caisse").Select
                ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                Range("A1").Select
                Sheets("mouvement caisse").Visible = False

                Sheets("saisie").Select
                ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
                Range("A1").Select
                Sheets("saisie").Visible = False

                Sheets("caisse").Select
                Range("AB2:AB36,AD2:AD36,AF2:AF36,AI2:AI36").Select
                Range("AD2").Activate
                Selection.ClearContents

                Sheets("saisie").Visible = True
                Sheets("saisie").Select

                Range("A1:h6000").Select
                Selection.Copy
                Range("L1").Select

                End Sub


                1. Bonjour thev,

                  Je ne sais comment te remercier tout fonctionne à merveille.

                  Il me manque encore une formule pour finaliser le petit outil de gestion de ma nouvelle association. Je me permets de te la soumettre en espérant ne pas trop abuser.

                  Il s’agit de la formule « sommeproduit » avec 2 conditions.
                  En cellule G16 je saisi une date.
                  En colonne A j’ai toutes mes dates
                  En colonne E j’ai le chiffre 0
                  Si la date en G16 est trouvée dans la colonne A et que le chiffre 0 en colonne E correspond, alors en multiplie les chiffres des colonnes D et F correspondants.
                  Résultat, somme de tous les produits trouvés à cette date.
                  1. Essayer cette formule matricielle
                    {=SOMMEPROD(ABS(A:A=G16);ABS(NON(E:E));D:D;F:F)}

                    rappel : pour entrer une formule matricielle, SHIFT + CRTL + ENTREE

                    1. Bonsoir thev,

                      Ta formule fonctionne, mais j'ai omis de dire que toutes mes colonnes sauf la cellule G16 se trouve sur un autre onglet nommé "mouvement caisse".
                      Et je suis tellement nul que je n'arrive pas à intégrer ce nom dans la formule.
                      1. Je viens de régler mon problème d'onglet.

                        Mille fois merci pour votre aide.