Izoom, istep, pagessetup, etc

Bonjour à toutes et à tous,

Si je modifie le zoom, que doit-il se passer et que dois-je voir ? J'ai essayé de modifier le zoom de propositions menus midi retrait, à l'aperçu, je n'ai rien vu de spécial ni aucune modification visible. À l'aperçu, impossible de lire les lignes, c'est trop petit. J'ai imprimé votre code et j'essaie de comprendre, d'où les questions suivantes :

If iZoom = 0 Then iZoom = 100 que signifie cette instruction ?

i = WorksheetFunction.CountIf(.Range("A1:A10000"), "Numéro du menu") c'est quoi ce 10000 (le nombre de lignes ? )

For i = iStep + 1 To 1000 Step iStep c'est quoi ce 1000 (aucune suggestion à vous faire)

With .PageSetup : les zéros indiqués à certains endroits correspondent aux marges que j'ai mentionnées dans la mise en page ?

.LeftHeader = " " : pour d'autres également, que signifie cette instruction (sa propriété reste vide).

Arr = Evaluate("if(A1:A10000=""Numéro du menu"", Row(A1:A10000), le 7)") : c'est bien le 7 ? Que représente le 7
For i = iStep + 1 To 1000 Step iStep
Ligne = Application.Small(Arr, i) : variable non définie.

Dans ton fichier, ce problème ne se pose pas.

1menus.zip (304.31 Ko)

Bonjour à tous,

If iZoom = 0 Then iZoom = 100 que signifie cette instruction ?

Tout simplement si la variable vaut zéro, on la passe à 100 (Qui doit-être je pense le facteur de zoom.

i = WorksheetFunction.CountIf(.Range("A1:A10000"), "Numéro du menu") c'est quoi ce 10000 (le nombre de lignes ? )

La je pense qu'il a prêché par fainéantise. Voilà pourquoi on demande de travailler avec des tableaux structurés. On peu connaître le nombre de ligne plus facilement. Ici il a mis un nombre de ligne assez important, pour englober la totalité des lignes.

For i = iStep + 1 To 1000 Step iStep c'est quoi ce 1000 (aucune suggestion à vous faire)

Là encore un nombre d'itérations importantes. La boucle va compter de iStep +1 à 1000 Attention Step et basé sur iStep.

With .PageSetup : les zéros indiqués à certains endroits correspondent aux marges que j'ai mentionnées dans la mise en page ?

C'est possible faut voir le contexte...

.LeftHeader = " "

Là encore Crosoft vous donne l'explication.

Bonjour Jean-Paul,

Merci pour ces renseignements. Et pour Ligne comme variable non définie. J'ai repris le fichier d'origine de BsAlv (que je peux vous envoyer si nécessaire), nulle part je n'ai trouve de dim Ligne as.

Re,

nulle part je n'ai trouve de dim Ligne as.

Vous n'avez qu'a le créer, tout simplement, si vous avez un doute sur le type de variable que vous devez utiliser, le plus simple est de la déclarer en variant.

Puis vous mettez un point d'arrêt sur le premier appel de cette variable, et vous regarder dans la fenêtre des variables que est son type. Étant donné que vous l'avez déclarée en variant le type sera écrit sous cette forme Variant/XXXX

Exemple avec cette procédure :

Public Sub Test101()
Dim T As Variant
T = "Toto"
T = 123
Set T = ThisWorkbook.Worksheets("Feuil1")
End Sub

Si vous faites du pas à pas (Touche F8) T prendra les types :

  • Variant/Empty Car pas encore définit
  • Variant/String Après la validation de "Toto"
  • Variant/Integer Aprés la validation de 123
  • Variant/Object/Feuil1 Après la validation de Feuil1

Voili, voilou

Dans tous les cas je recommande fortement d'ajouter en tête de module l'Option Explicit qui va vous obliger à déclarer toutes vos variables. Ou mieux de le déclarer par défaut dans les options.

image
Sub M_Preparation(sh As Worksheet, iOrientation, iPages As Integer, Optional iZoom As Integer = 0)
     Dim Arr, iMax, i, iStep, iPages2, Ligne, Cnt, B, B1, B2     'tous les variables sont "variant"
     If iZoom = 0 Then iZoom = 100           'si Izoom (qui est optional) n'est pas donné (alors valeur=0), on utilise 100 pour iZoom
     With sh                                 'avec la feuille mentionnée
          Application.Goto .Cells(1)         'sélectionne A1 de cette feuille
          .ResetAllPageBreaks                'supprimer tous les sautes de pages

          '*******calculer le nombre de "numéro du menu" par page avec le total nombre de "numéros" et le nombre de pages voulues  ***********
          iMax = Evaluate("max(if(len(A1:A10000)>0,row(A1:A10000),0))")     'dernière ligne non-vide de la colonne A (10.000 est une valeur exagérée)
          i = WorksheetFunction.CountIf(.Range("A1:A10000"), "Numéro du menu")     'nombre de "Numéro du menu" dans la plage A1:A10.000
          iStep = WorksheetFunction.Ceiling_Math(i / iPages, 1)     'nombre de saute par page = total de "numéros" / nombre de pâges, arrondi en haut
          MsgBox "on a " & i & " menus dans la colonne A" & vbLf & "pour <10 pages, ça fait " & iStep & " menus par page" & vbLf & "donc " & WorksheetFunction.Ceiling_Math(i / iStep, 1) & " pages"

          '************************************* ajouter les sautes de page ************************************************
          Arr = Evaluate("if(A1:A10000=""Numéro du menu"",row(A1:A10000),1e7)")     'matrice qui contiendra le numéro de la ligne, si la cellule A1:A10000 = "Numéro du menu", autrement 1E7 (notation scientifique) or 10.0000.000
          For i = iStep + 1 To 1000 Step iStep     '2ième page commence au "istep+1"-ième Numéro, chaque page contient istep "numéros, donc istep est l'intervalle, 1.000 est aussi exagéré, pour le moment, ce nombre est 53
               Ligne = Application.Small(Arr, i)     'quelle est la ligne du i-ième "numéro du menu"
               If Ligne < Rows.Count Then .HPageBreaks.Add Before:=.Cells(Ligne - 1, "A") Else Exit For     'si cette ligne < nombre de lignes de la feuille (environ 1.048.000) ajouter une saute de page juste avant cette ligne, sinon quitter le boucle
          Next

          '************************************préparer l'impression  *******************************************************
          With .PageSetup
               .PrintArea = Range("A1:H" & iMax).Address     'plage à imprimer
               .PrintTitleColumns = "A:A"    'colonne à répéter (inutile, on peut supprimer cette ligne)
               .Zoom = iZoom                 'zoom comme voulu
               .CenterHorizontally = True    'placer l'impression horizontal au milieu
               .CenterVertically = True      'idem vertical
               .Orientation = iOrientation   'landscape ou portrait
               .FitToPagesWide = iPages      'nombre de pages voulues par vous
               .FitToPagesTall = 1           '1
               .LeftHeader = ""              'headers et footer pour le moment vide
               .CenterHeader = ""
               .RightHeader = ""
               .LeftFooter = ""
               .CenterFooter = ""
               .RightFooter = "&P de &N"     'sauf rightfooter = n° de page et total nombre de pages
               .LeftMargin = 0               'tous les margins pour le moment 0
               .RightMargin = 0
               .TopMargin = 0
               .BottomMargin = 0
               .HeaderMargin = 0
               .FooterMargin = 0
               .Order = xlOverThenDown       'inutile, on peut supprimer cette ligne

          End With
          .PrintPreview                      'montrer l'impression sur l'écran
     End With
     Application.StatusBar = False
End Sub

tous les variables (donc Ligne aussi) sont des variants (tout simple).

Bonsoir BsAlv,

Merci pour le nouveau code très détaillé. Cela me fait très plaisir d'avoir quelqu'un comme toi qui répond à mes sollicitations car malheureusement je ne suis pas un expert en VBA et que je n'ai pas l'esprit de déduction très développé, en supposant que j'en ai un.

a) Si j'ai bien compris, si je ne sais pas quel type qu'une variable requiert, je la met automatiquement en variant. b) Supposons que toutes les variables, comme tu le proposes, soient de type variant : pour certaines cela pourrait-il provoquer l'erreur Incompatibilité de type ? c) Autant que je m'en souvienne, option explicit existe bien dans mon code.

Pour revenir à ton fichier, pourquoi Ligne ne semble pas être déclarée et que cela ne provoque pas d'erreur alors que chez moi cela provoque une erreur ?

Le module tests est-il obligatoire À quoi sert-il ?

Dim Arr, iMax, i, iStep, iPages2, Ligne, Cnt, B, B1, B2     'tous les variables sont "variant"

Tous ces variables sont déclarés, mais comme je n'ai pas ajouté des "as ...", ce sont des variants. C'est une discussion comme celle du sexe des anges, mais moi, je ne m'occupe pas pour le faire plus explicit. Mais @Jean_paul a une autre opinion, donc ... .

Je ne sais pas ouvrir votre fichier, donc je ne vois pas l'origine de ton erreur, mais si tu utilise un variable pour une autre variable ou fonction, peut-être que tu dois utiliser une conversion comme cint, cDbl, cStr, etc.

Je n'ai pas créé le module "Tests", donc s'il est nécessaire ? Je ne suis pas sûr, mais je ne le pense pas.

Bonjour BsAlv,

J'ai compris mais désolé tu ne réponds pas aux questions posées.

ligne est un variant et dans mes macros cela ne pose pas des erreurs. J'essaie d'ouvrir ton fichier de samedi, mais il y a un mot de passe.

Donc je ne peux pas vérifier cela. je pense que j'ai répondu à tout.

5menus-2026.xlsm (270.81 Ko)

Il manque la réponse concernant le module Tests

4menus-2026.xlsm (270.81 Ko)

je répète,

Je n'ai pas créé le module "Tests", donc s'il est nécessaire ? Je ne suis pas sûr, mais je ne le pense pas.

et c'était une erreur orthographe "propositiobs" au lieu de "propositions"

Sheets("Propositiobs menus midi retrait"),
4menus-2026.xlsm (241.81 Ko)

Bonjour à tous,

Il manque la réponse concernant le module Tests

Si un module de tests existe cela sent le Jean-Paul

Il peut être supprimé en toute quiétude.

De plus nous avons déjà abordé le fait que renseigner en dur le noms des feuilles dans le code, est une très mauvaise habitude qui à terme peut poser des problèmes comme celui qui vient de vous arriver.

Créez donc des constantes que vous pourrez appeler dans vos modules voici un exemple :

Option Explicit
' // Module GlobalConsts

'----------------------- CONSTANTES DE NOM DE FEUILLES -----------------------
Public Const MMR_SHEET_NAME As String = "Propositions menus midi retrait"
'...
'...
'...

Vous aurez plus de facilité ensuite, avec l'intellisense.

image

re,

je vois dans la réaction de @Jean-paul, que ces 2 conversions "Cint" ne sont pas nécessaires.

Et dans la feuille code, pour la procédure M.Préparation, comment je vais faire référence au module GlobalConsts ?

Re,

Regardez bien l'image de mon précédent post.

Bonjour Jean-Paul (excusez-moi, j'ai oublié de le faire hier),

J'ai vu. Juste une question, d'après vos deux images, globalconst, là j'ajoute le nom de la const ?

Bonjour à tous,

d'après vos deux images, globalconst, là j'ajoute le nom de la const ?

Question. Pourquoi créer un module 'GlobalConsts' ou autre qui regroupe vos principales constantes ?

  • Pour vous c'est plus rapide, vous n'avez plus à vous souvenir de l’orthographe exacte des noms de feuilles, colonnes etc..
  • Si vous décidez de changer de nom pour une feuille, colonne etc vous ne devez le faire qu'à un seul endroit
  • Comme vu plus haut vous bénéficiez de l'auto-complétion.

Donc ajouter un module que vous nommerez, 'GlobalConsts' ou 'Consts' ou 'Constantes' si vous préférez du français.

Pour ajouter le module, cela se passe dans l'environnement VBE. Dans le menu sélectionner Insertion/Module. Une fois fait changez son nom dans la fenêtre de ses propriétés.

image

Un fois ceci fait vous pouvez ajouter toutes les constantes ou variable publiques que vous désirez.

ATTENTION TOUTE FOIS A L'UTILISATION DE VARIABLES GLOBALES (Une variable globale est difficilement maintenable, préférez-lui une portée locales)

Voici un exemple de constantes publiques incluses dans un module Factory :

'------------------------ CONSTANTES POUR LE TABLEAU DES PARAMETRES
Public Const COL_KEYS As String = "Keys"
Public Const COL_VALUES As String = "Values"
Public Const COL_INITIALVALUES As String = "Initial values"
Public Const COL_NOTES As String = "Notes"

'------------------------ CONSTANTES POUR LE TABLEAU DES ARTICLES

Public Const COL_ARTICLE_NR As String = "Nr Article"
Public Const COL_ARTICLE_NOM As String = "Nom"
Public Const COL_ARTICLE_DESCRIPTION As String = "Description"
Public Const COL_ARTICLE_PRIX As String = "Prix Unité"
Public Const COL_ARTICLE_STOCK As String = "Stock"
Public Const COL_ARTICLE_VALEUR_STOCK As String = "Valeur Stock"
Public Const COL_ARTICLE_STOCK_MINI As String = "Stock Min"
Public Const COL_ARTICLE_FLAG As String = "flag"
Public Const COL_ARTICLE_STATUS As String = "Statuts"

Et voici un exemple d'auto-complétion :

image

Ma question concernait si je devais ajouter quelque chose après GlobalConst (en l'occurrence MMP_Sheet_Name)? Dans la seconde image, il semblerait qu'il y ait une erreur : il faut MMR et non MMP

Re,

Ma question concernait si je devais ajouter quelque chose après GlobalConst

Concernant lappel de constantes, variables, fonctions ou procédures Le vous conseille de donner le chemin explicite.

Si vous déclarez une constante ou variable dans un module en public exemple ici GlobalConsts vous pouvez :

  • Soit l’appeler directement T =  MMR_SHEET_NAME
  • Soit donner un chemin explicite T = GlobalConsts.MMR_SHEET_NAME

Pour ma part je préfère utiliser les chemins explicites.

il semblerait qu'il y ait une erreur : il faut MMR et non MMP

N'avez-vous pas remarqué que le curseur cache la barre du R ?

Rechercher des sujets similaires à "izoom istep pagessetup etc"