XL 2016 Selectionner une ligne jusqu'à dernière colonne

maroon

XLDnaute Junior
Bonjour!

Avec la macro que je fais j'aimerais mettre en couleur certaines lignes: des lignes vides qui séparent certaines parties du tableau. Je connais le numéro des lignes mais comme le nombre de colonnes varient je détermine le numéro de la dernière colonne avec le code:

VB:
ActiveCell.SpecialCells(xlLastCell).Column

Donc si je souhaite sélectionner la ligne vide numéro 15 par exemple jusqu'à la dernière colonne du tableau comment je dois écrire le code? Pour ensuite lui affecter une mise en forme.

Je n'arrive pas à trouver la syntaxe en utilisant le morceau de code que j'ai mis juste au-dessus.

Merci d'avance si quelqu'un peut m'aider!
 
Solution
Bonjour,

A mon avis, si "derlig" est un entier, il n'y a pas de raison que "i" n'en soit pas également un. ;)

Concernant le calcul de ce "derlig", je ne suis pas certain que ce soit bon et que tu trouves réellement la vraie dernière ligne de ton tableau...
J'ai l'impression que ça ne fonctionne que s'il n'y a rien en-dessous du tableau.

La dernière colonne du tableau doit être la même pour toutes les lignes, donc autant la calculer au départ une fois pour toute et la mettre dans une variable.

Tu peux même définir une "plage", d'une ligne de hauteur, allant de la colonne A à la dernière colonne du tableau, que tu peux en suite décaler avec un offset pour colorier les lignes qui doivent l'être. ;)

Tes deux "For" imbriqués font la...

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @Staple1600,

J'avoue ne pas avoir lu tous les messages, loin de là. Je viens de voir que tu avais évoqué le tableau structuré avant mon message. Rendons à César (ou pas ;) ) ce qui lui appartient. Mille excuse si d'autres l'avaient déjà évoqué aussi.

Je me demanderai toujours quel est le ballot chez MS qui a appelé de telles structures "Tableaux" comme n'importe quel autre tableau au sein d'une page. Même le traducteur (qui est peut-être le vrai responsable) n'a pas remarqué l’ambiguïté d'une telle dénomination. Notons qu'en langue grande-bretonnne, ListObject n'évoque pas d'emblée grand chose non plus. Alors qu'une liste de courses qui comporte de multiples objets et lignes, je sais tout de suite ce que c'est. Mais appeler un tableau dit "structuré" du nom de "liste de courses" eut été étrange, non ?

Finalement, "Tableau structuré" c'est bien.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re

•>mapomme
Chez les Saxons (pas ceux d'Angela), certes ils parlent de ListObject
Mais ils causent aussi de Flat Table et Cross Table :eek:

Et là, pour un francophone (de Manille ou d'ailleurs), cela complique les choses.
Depuis ce matin, je m'échine et j'échoue
(et G..gle me renvoie toujours vers F.Table >>> X.Table mais moi c'est le contraire que je veux ici faire avec PQ
Appel aux confinés en passant ;)
 

TooFatBoy

XLDnaute Barbatruc
VB:
 For Each cel In plage
        For i = 1 To derlig
            If IsEmpty(Cells(i, 1).Value) = True Then

non mais sérieux ??????, :oops: :oops: :oops:
tu va boucler sur toute les cells du tableau

LOL et RE LOL
D'une part ce n'est pas très sympa de se moquer du code d'une personne qui vient ici pour demander de l'aide, d'autre part perso je ne suis pas totalement persuadé que ça boucle sur toutes les cellules dudit tableau (mais peut-être me trompé-je)...
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Je ne sais pas s'il y a une unique soulution à ce type de Pb. Dans le cas présent, il suffit apparemment de boucler sur les cellules de la première colonne pour décider ou non du coloriage de la ligne. Pour un autre tableau, ce sera sans doute autre chose.
A mon avis, le plus déterminant est de savoir comment décider si une cellule est vide ou non. Et ça aussi dépend de la structure logique de son tableau (exemple une cellule vide contenant la chaine "" doit elle être prise pour vide ou non, etc.)
 

Staple1600

XLDnaute Barbatruc
Re

•>Marcel32
Le fil étant marqué résolu ( et la solution pour le demandeur étant la tienne - message#20), rien n’empêche que le fil continue à vivre sa vie (avec ou sans le demandeur) ;)
Et quand en plus, il y a du confinement dans l'air, bah cela fait sortir les digressions du bois ;)
 

jmfmarques

XLDnaute Accro
Re-coucou

Je crois personnellement que ce qui importe, sur ce forum, est de trouver la solution générique à une difficulté et qu'il ne faut pas se contenter d'une solution qui suffit pour faire face à une "configuration du terrain"

Les méthodes à mettre en oeuvre pour déterminer la dernière colonne et la dernière ligne non entièrement vides d'une feuille sont probablement nombreuses. Je ne vois par ailleurs personnellement pas la différence entre une feuille et une plage, si ce n'est la taille ! Le principe de recherche reste le même.
Quel est alors le critère de choix de la méthode ? Tout simplement celui de la vitesse d'exécution.
J'aimerais à ce propos vraiment que les tests conduits soient faits sur du "complexe" et plutôt "volumineux"
J'ai proposé plus haut une feuille de calcul ainsi construite :
VB:
 With ActiveSheet
    .Range("a1") = "a"
    .Range("C1") = "a"
    .Range("X10").Formula = "=IF(E1<>"""", E1,"""")"
    .Range("K100000").Formula = "=IF(E1<>"""", E1,"""")"
    .Range("G123000").Interior.Color = RGB(0, 0, 0)
  End With
On y a des constantes, des formules et du formatage, le tout très disséminé sur une grande plage.

- Ne sont exactes que les solutions qui retournent :
--- la colonne X et la ligne 100000 lorsque E1 n'est pas vide
et
--- la colonne C et la ligne 3 lorsque E1 est vide

Il conviendrait de chronométrer maintenant sur ces bases les différentes solutions envisagées et de signaler ici la durée constatée.
 

jmfmarques

XLDnaute Accro
OK Staple
Je vais donc donner l'exemple
Ici, je vais travailler en tremplin (en utilisant une feuille annexe "tremplin") :
VB:
Dim deb As Single, derlig As Long, dercol As Long, plage As Range, derncell As Range
  deb = Timer
  With ActiveSheet
    derlig = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
    dercol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
    Application.ScreenUpdating = False
    Set plage = Range(Cells(1, 1), Cells(derlig, dercol))
  End With
  With Worksheets("tremplin")
    .Cells.ClearContents
    .Range(plage.Address) = plage.Value
    .UsedRange
    Set derncell = .Cells.SpecialCells(xlCellTypeLastCell)
  End With
  MsgBox Timer - deb
  MsgBox derncell.Row & vbCrLf & derncell.Column
  Application.ScreenUpdating = True
J'ai les deux résultats attendus (avec E1 vide ou avec E1 rempli) avec le même temps d'exécution : 3,62 secondes avec la configuration de la feuille telle qu'exposée.
A vous, maintenant.
 

jmfmarques

XLDnaute Accro
Merci Staple

(t'as raison ... ta machine est lente ...)
Mais ce qui intéresse maintenant, c'est plutôt les performances comparées de diverses méthodes (avec cette configuration de feuille).
De sorte à aboutir peu à peu à la meilleure solution possible.
 

Discussions similaires

Réponses
6
Affichages
351

Statistiques des forums

Discussions
312 164
Messages
2 085 877
Membres
103 009
dernier inscrit
dede972