XL 2016 Passer à la page suivante automatiquement

bennp

XLDnaute Occasionnel
les voici :
ReDim TS(1 To 1000, 1 To 5)
For LE = 2 To UBound(TE, 1)
If Not IsEmpty(TE(LE, 2)) Then
LS = LS + 1
TS(LS, 1) = TE(LE, 1)
TS(LS, 2) = TE(LE, 2): End If

InitialiserMiseEnPage Feuil2.[C131], 39, 5
LS = 1
Do: Nom = TS(LS, 1): TR(1, 1) = Nom
LR = 3: For C = 1 To 4

Next C
Do: LR = LR + 1
For C = 1 To 4
TR(LR, Choose(C, 1, 23, 24, 25)) = TS(LS, C + 1)
Next C
LS = LS + 1: Loop Until TS(LS, 1) <> Nom
Set Rng = PlageSuivante(TR, LR)
LTot = Rng.Rows.Count + 1

ça serait déjà un bon début pour moi... effectivement j'ai beaucoup de lacunes en VBA
Je verrai plus tard pour les explications de mise en page

Merci beaucoup
 

Dranreb

XLDnaute Barbatruc
Vous pouvez aussi mettre le curseur sur un élément du langage et utiliser la touche F1 pour avoir de l'aide.
L'instruction Redim affecte ou réaffecte l'espace de stockage aux variables tableaux dynamiques, c'est à dire sans dimension précisée entre les parenthèses lors de leur déclaration en précisant les valeurs d'indices limites valide.
L'instruction For Variable = ValeurDébut To ValeurFin inaugure une boucle, c'est à dire un groupe d'instruction exécuté répétitivement, la Variable y étant à la ValeurDébut au 1er passage et augmentée de 1 à chaque autre passage jusqu'à ce qu'elle dépasse la ValeurFin.
Ubound(Tableau, N) permet de connaitre la limite maxi de la Nième dimension du Tableau.
L'instruction If Condition Then inaugure un bloc d'instruction qui n'est exécuté que si condition n'a pas le valeur 0 ou False. IsEempty permet de Savoir si une expression Variant n'a pas la valeur vide
Not devant une expression inverse sa valeur.
Le signe '=' en 2ième position d'une instruction marque une affectation de l'expression à sa droite à la variable ou propriété spécifiée à sa gauche.
Les 3 paramètres à spécifier à la Sub InitialiserMiseEnPage lors de son invocation sont expliqués au début de celle ci dans mon module MMiseEnPage
L'instruction Do sert aussi à inaugurer une boucle, mais contrairement à For le bloc doit se terminer par une instruction Loop et non Next.
Le ':' est un simple séparateur d'instructions lorsqu'on a décidé d'en mettre plusieurs sur une même ligne.
L'instruction Set sert à affecter à une variable objet une expression exemplaire de cet objet.
La propriété Rows d'un objet Range représente les lignes entières de cet objet.
Une propriété Count donne toujours le nombre d'éléments de l'objet.
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonjour le fil, le forum

A toute fin utile:
Avec la hauteur de ligne par défaut d'Excel et avec du papier A4, sauf erreur de ma part, le nombre de lignes par page est de 56.
 

bennp

XLDnaute Occasionnel
Bonjour,

je souhaite centrer horizontalement le texte mais ça ne fonctionne pas

Rng(Cells(3, 23), Cells(LTot, 25)).Select
Selection.HorizontalAlignment = xlCenter


upload_2017-12-29_12-6-23.png
c'est la case B166, etc qui est centrée...
merci
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Ah non, n'utilisez plus Select ni Selection.
Éventuellement: Range(Rng(3, 23), Rng(LTot,25)).HorizontalAlignment = xlCenter
Ma préférence irait plutot à Rng(3, 23).Resize(LTot-2, 3).HorizontalAlignment = xlCenter

Remarque: C'est vrai qu'il y a un terme Item sous-entendu et assumé dans l'expression Rng(3, 23) c'est en fait Rng.Item(3, 23) que est aussi Rng.Cells(3, 23).
Ne pas confondre objet Range et méthode Range, ce sont deux choses différentes. Seule la méthode Range admet deux paramètres Range la délimitant.
Mais la méthode Range renvoie un objet Range, bien sûr. Tout comme ma Function PlageSuivante d'ailleurs, qui le fait exactement par le même principe.
 
Dernière édition:

bennp

XLDnaute Occasionnel
très bien merci pour l'info
et du coup si j'ai plusieurs fonction à faire pour les mêmes cellules je fais comme ça :

Rng(3, 23).Resize(LTot, 3).HorizontalAlignment = xlCenter
Rng(3, 23).Resize(LTot - 2, 3).NumberFormat = "0.00"
ou on peut optimiser le code ?

Merci beaucoup
 

Dranreb

XLDnaute Barbatruc
S'il y a plusieurs propriétés d'une même sous-plage à changer vous pouvez faire :
VB:
With Rng(3, 23).Resize(LTot - 2, 3)
   .NumberFormat = "0.00"
   .HorizontalAlignment = xlRight
   End With
L'utilisation d'une variable Range est déjà une optimisation: plus besoin de chercher la feuille concernée: c'est une propriété de l'objet.
 

bennp

XLDnaute Occasionnel
Bonjour,

J'ai réussi à mettre les noms en majuscule mais pas en gras :
Do: Nom = TS(LS, 1): TR(1, 1) = UCase(Nom)
Range(TS(LS, 1): TR(1, 1)).Font.Bold = True

autre chose pour les bordures j'ai ce code :
End With
With Union(Range(Rng(4, 1), Rng(LTot - 1, 22)), Range(Rng(4, 23), Rng(LTot - 1, 23)), Range(Rng(4, 24), Rng(LTot - 1, 24)), Range(Rng(4, 25), Rng(LTot - 1, 25)), Range(Rng(LTot, 23), Rng(LTot, 25))).BorderAround(ColorIndex:=16)
End With
mais je pense que le Union selectionne tout ensemble alors que je souhaite que chaque plage de cellule ait une bordure

upload_2017-12-31_13-33-16.png

merci et bonne Année !!!
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Le caractère gras ça ne fait plus partie de la valeur. C'est du format de cellule. Donc aussi à la fin :
VB:
   Rng(1, 1).Font.Bold = True
Pour les bordues essayez :
VB:
   Rng.Rows(4).Resize(LTot - 4).BorderAround ColorIndex:=16
   Rng(4, 22).Resize(LTot - 4, 4).Borders(xlInsideVertical).ColorIndex = 16
Bonne année
 

bennp

XLDnaute Occasionnel
autre chose aussi, jai voulu mettre tout ça ensemble mais ça fonctionne pas :

With Rng.Rows(3)
.RowHeight = 30
.Interior.Color = RGB(186, 255, 186)
.VerticalAlignment = xlCenter
'.BorderAround(ColorIndex:=3)
'.Borders.ThemeColor = 2
End With

les .Borders ne fonctionnent pas, j'ai dû refaire un With spécial pour eux
 

Dranreb

XLDnaute Barbatruc
Bonjour et bonne année.
Oui, je cherche aussi toujours pour mettre ces bordures de la façon la plus simple possible.
La méthode .BorderAround devrait marcher tout de même. Toutefois les parenthèses dont vous l'encadrez ne sont pas reconnues comme délimiteurs de la liste de paramètres. Cela est signalé par VBA en ajoutant un espace entre le nom de la méthode et la parenthèse ouvrante.
Pour les bordures intérieures, ben comme ce n'est qu'une ligne il ne reste que les verticales intérieures. Simplement .Borders(xlInsideVertical).ThemeColor = 2 ne marche pas ?
 

bennp

XLDnaute Occasionnel
Oui, sans les parenthèse ça fonctionne ! par contre je n'ai toujours pas réussi à régler la zone d'impression.
je pense qu'il faut modifier cette partie :
Set CelDéb = Cel: Set CelCou = Cel: LgnPgBk = Cel.Row

je n'arrive pas à dire qu'il faut que la zone d'impression commence en A1

merci
 

bennp

XLDnaute Occasionnel
j'ai modifié cette ligne en changeant par Cells(1, 1) :

Wsh.PageSetup.PrintArea = Range(Cells(1, 1), CelCou.Offset(0, NbColMax - 1)).Address

je retouve bien toute la zone d'impression mais du coup mes sauts de page ne sont plus bon ..
 

Dranreb

XLDnaute Barbatruc
Avez vous appliqué ce que j'ai dit au #39 ?
…: LgnPgBk = Cel.Row n'est alors plus bon non plus, c'est LgnPgBk = 1
Mais s'il y a beaucoup de choses avant, le 1er tableau sera systématiquement sur une nouvelle page même s'il reste assez de place sur la dernière. Je ne peux pas savoir quelle valeur il faudrait donner à LgnPgBk au début pour éviter cela.
 

bennp

XLDnaute Occasionnel
Effectivement si je mets 1, le 1er tableau commence à la page suivante, j'ai essayé plusieurs valeurs et en augmentant, on a bien le tableau a la suite mais les sauts de page ne fonctionnent pas.

Je ne vois pas comment trouver la bonne valeur et surtout s'il y en a une...

je joins mon fichier à jour

merci
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
On voit que le dernier saut de page est à la ligne 130

Edit: Il ne faut pas changer la hauteur des lignes d'entête, sinon ça va être impossible à faire.
Parce que la solution se base sur un nombre de lignes qui tiennent sur une page, mais des lignes toutes de la même hauteur, bien évidemment !
 
Dernière édition:

bennp

XLDnaute Occasionnel
ok merci pour l'info, j'ai mis 129 et ça à l'air de fonctionner. C'est compliqué pour moi de réduire la hauteur des entêtes car le texte est trop grand et je dois faire un retour à la ligne. Pour l'instant, ça fonctionne, je vais voir en fonction du nombre de tableaux et de leur taille si ça fonction toujours.

merci
 

bennp

XLDnaute Occasionnel
je voudrais mettre "0" dans la colonne "épaisseur" si la colonne "fruit comporte le nom "pomme"
j'ai testé ça :
If TS(LS, 2) = "pomme" Then TS(LS, 3) = 0: End If
je suppose que c'est plus compliqué que ça ? je n'y arrive pas avec les formule dans excel, j'avais pensé à utiliser les fonctions recherche et decaler.. Une idée ?

merci
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Il ne faut pas de End If quand la 1ère ou seule instruction suit immédiatement le Then sur la même ligne.
 

bennp

XLDnaute Occasionnel
ok j'ai remplacé par
Code:
If TE(LE, 2) = "pomme" Then TE(LE, 3) = "0"
la macro ne bug pas mais les valeurs ne sont pas mises à 0

merci
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas