Selection en VBA lignes non vides

Bonjour, je veux sélectionner dans un tableau excel de grandeur variable ( nb de colonnes fixe, nb de lignes variable de 100 à 1500), pour impression, toutes les lignes non vides . La cellule de la colonne "A" est toujours renseignée (N° de ligne). Si je sélectionne toute la plage possible, l'imprimante "gaspille" des feuilles (lignes vides). Merci de m'orienter vers la syntaxe à utiliser.

Au plaisir de lire l'expert qui résoudra mon problème, JL

Bonjour

essaie cette macro:

Sub SuppLigne()
    Range("a1:a1500").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub

Cdlt

Bonjour Patty5046, merci pour ta réponse, je précise que mon fichier ne comprend pas de "trous" qu'il faudrait éliminer.

Après essai le résultat est pareil, puisque il reste des lignes "vides" si par ex. le fichier ne comporte que 160 lignes. Il faudrait une syntaxe qui recherche la dernière ligne non vide et qui limiterait ainsi la zone d'impression. En attendant je vais continuer à rechercher dans mes manuels et faire des essais.........Merci et bonne journée, JL

bonjour,

En VBA, la règle c'est de ne pas sélectionner.

Dans ton cas il suffit de définir la zone d'impression.

Essaie cette macro :

Sub test()
ActiveSheet.PageSetup.PrintArea = [A1].CurrentRegion.Address
ActiveSheet.PrintOut Preview:=True
End Sub

Sinon :

A+

150projet-reserv.xlsm (604.60 Ko)

Bonjour galopin01, merci pour ta réponse, après test, ça bloque sur la ligne

" activesheet.PageSetup.printarea = [A1].currentregion.Address" j'ai un message d'erreur disant:

erreur d'execution 91, variable objet ou variable de bloc with non définie.

De plus ne sont pas sélectionnées les colonnes AH et AI, et elles doivent absolument apparaitre sur le document imprimé.

Je joins le fichier en question, sachant que pour le moment je travaille sur la commande "editer reservation2" (bouton sur page "accueil", les autres boutons d'impression ne sont pas opérationnels.

Au plaisir de te lire, JL

Méééé... Puisque qu'on vous dit que le jeu, c'est de ne rien sélectionner et de ne rien activer !

Mettre :

Public Sub imprimerliste2()
Dim a, iLR%
With Sheets("reservations2")
   iLR = .Range("A" & .Rows.Count).End(3).Row
   a = .Range("A1:AI" & iLR).Value
End With
With Sheets("Feuil1")
   .[A1].Resize(UBound(a), UBound(a, 2)) = a
   .Range("A:A,D:D,E:E,G:G,H:H,J:J,AE:AE,AF:AF,AG:AG").EntireColumn.Hidden = True
   .PageSetup.printarea = .Range("A1:AI" & iLR).Address
   .PrintOut Preview:=True 'mode aperçu : Supprimer Preview:=True pour impression directe
End With
End Sub

Re-bonjour Galopin01, merci de cette réponse rapide et efficace, en effet ça marche super, quel que soit le nombre de lignes!

Etant "petit apprenti" en VBA, je voudrais comprendre la syntaxe proposée, et la signification des éléments suivants:

  • a: pourquoi, que signifie t-il, quel rôle?
  • iLR%: même question
  • a = .Range("A1:AI" & iLR).Value quelle valeur ou plage cette syntaxe donne t-elle?

Peut-on trouver sur le marché (librairie spécialisée ou web) un bouquin qui parle des différentes syntaxes à utiliser et aussi qui les explique?

En tout cas merci de ton aide, je peux maintenant poursuivre mon projet.

Au plaisir de te lire, bonne semaine, JL

P.S. je cherche en vain le bouton pour signaler que mon problème est résolu: je suis vraiement cloche!

Tout ce qui se trouve après le mot Dim fait parti des déclarations de variable :

a est déclaré sans autre spécification : Ce peut être n'importe quoi. En l'occurrence ici ce sera un Array (tableau) dont les dimensions ne sont pas spécifiées : Normal, je ne sais pas encore ce que je mettrai dedans...

iLR est une variable de type Integer

Dim iLR% 

veux dire exactement la même chose que :

Dim iLR as Integer

après cette ligne :

iLR = .Range("A" & .Rows.Count).End(3).Row

iLR contient le n° de la dernière ligne écrite en colonne A. (soit 4 dans ton exemple...)

Par suite

a = .Range("A1:AI" & iLR).Value

signifie que a contient un tableau de valeurs qui sont en fait le contenu de .Range("A1:AI4")

par suite ce tableau sera transposé dans la Feuille1

On redimensionne la cellule A1 aux dimensions de a et on dit que cette plage = a

Ce qui est plus rapide qu'un Copier / Coller

Au lieu de

With Sheets("Feuil1")
   .[A1].Resize(UBound(a), UBound(a, 2)) = a

J'aurai aussi pu écrire :

With Sheets("Feuil1")
   .Range("A1:AI" & iLR)= a

Mais la première notation (avec Resize) est la plupart du temps utilisé par les développeurs habitués pour des raisons complexes à expliquer.

La programmation VBA est un long apprentissage, il n'y a pas de méthode particulière pour apprendre. La meilleure manière est de coder, coder, coder et... coder !

Après, la consultation de forum pour corriger ses erreurs ou apprendre des techniques plus efficace est aussi un très bon moyen de progresser.

A+

Bonsoir Galopin01, merci pour toutes ces explications, je vais essayer d'integrer cela dans ma petite tête.

Merci encore et bonne semaine, JL

Bonsoir,

Exemples d'impressions sans les lgnes vides en PJ

Ceuzin

Bonjour, j'ai un autre écueil: je veux copier une liste variable en nombre de lignes, toujours sur 3 colonnes,

et la coller à la suite d' une autre liste, elle aussi variable en nombre de lignes. Si je fais un copier-coller de la première liste en incluant le max de lignes prévisibles, j'obtiens un décalage sur ma deuxième liste (lignes vides), même en faisant la recherche de la dernière ligne non vide.J'ai écrit:

Public Sub transf_nouv_liste1()
Application.ScreenUpdating = False

Dim a, iLR%
With Sheets("feuil2")          'là est la liste à copier
   iLR = .Range("A" & .Rows.Count).End(3).Row
   a = .Range("A1:C" & iLR).Value
   Range("A1:C&iLR").Copy
End With

With Sheets("feuil4")
Range("A" & Rows.Count).End(xlUp).Offset(1).Select     ' recherche 1ere ligne vide  
 .Resize(UBound(a), UBound(a, 2)) = a
  Selection.PasteSpecial paste:=xlValues  
  End With

End Sub

Mais j'ai le message: méthode non gérée par cet objet

Merci au "dépanneur" qui pourra me conseiller, JL

Bonjour,

Essaie ceci :

Public Sub transf_nouv_liste1()
Dim i As Integer, ii As Integer
    i = Worksheets("Feuil2").Cells(Rows.Count, 1).End(xlUp).Row
    ii = Worksheets("Feuil4").Cells(Rows.Count, 1).End(xlUp).Row
    If ii > 1 Then ii = ii + 1
    Worksheets("Feuil4").Cells(ii, 1).Resize(i, 3).Value = _
    Worksheets("Feuil2").Cells(1).Resize(i, 3).Value
End Sub

Bonjour Jean Eric, merci pour ta réponse, après test cela ne marche pas, rien ne se passe, aucune cellule ou plage sélectionnée , copiée ou collée, la liste à compléter reste en l'état. Je vais essayer de creuser plus avant dans mes bouquins, Merci quand même pour ton implication, bonne semaine, JL

Bonjour,

Voir fichier joint.

Exécuter à plusieurs reprises la procédure...

Cdlt.

42cap24.xlsm (20.81 Ko)

Bonsoir Jean Eric, merci et toutes mes excuses, après relecture et réflexion, la macro est bien opérationnelle. Il fallait simplement que je modifie le nom de la feuille 4 pour lui donner le nom de ma feuille! (ah! l'étourdi........) Comme quoi il faudrait toujours tourner sept fois autour du clavier avant de s'exprimer.

J'ai trouvé une autre syntaxe qui fonctionne, mais elle est un peu plus longue que ton modèle.

Merci encore et bonne semaine, JL

Public sub transf_liste_placement
Dim T, n%

  With Worksheets("feuil2")
       n = .Cells(.Rows.Count, 1).End(xlUp).Row
       With .Range("A1:C" & n)
            T = .Value

       End With
    End With

    With Worksheets("liste placement1")
       n = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
        .Cells(n, 1).Resize(UBound(T, 1), 3).Value = T
       .Activate
   End With
End sub

Bonjour (tous)

Moi j'aurais juste une remarque, je ne sais pas ce que tu gères comme évènements, mais je dis juste :

heureusement qu'il n'y en a qu'un seul par mois (comme 12 plans, 12 réservations) parce qu'avec un par jour (365 plans, 365 réservations) la file d'attente serait longue, le temps que tu parcours 730 onglets avant de trouver celui qui correspond à la réservation... je pense que je n'aurais pas la patience de faire la queue... j'irais au ciné à la place...

Bonjour, je suis pleinement conscient que ma bafouille demande à être améliorée, c'est pourquoi grâce à ce forum je m'adresse à des personnes qui maitrisent le sujet. Alors si quelqu'un a des idées novatrices, je suis preneur. Bonne journée, JL

Rechercher des sujets similaires à "selection vba lignes vides"