IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Word Discussion :

Obtenir l'espace restant sur une page (adapter la taille d'1 image à cet espace) [À faire]


Sujet :

VBA Word

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Obtenir l'espace restant sur une page (adapter la taille d'1 image à cet espace)
    Bonjour,

    Je cherche à faire une macro qui me permette de redimensionner des images importées grâce à un autre logiciel. En effet je souhaite que celles ci se dimensionnent automatiquement à l'espace restant sur ma page afin de ne pas voir l'image se retrouver seule sur une page.

    J'arrive à redimensionner l'image mais je n'arrive pas à obtenir l'espace restant sur ma page après mon texte pour avoir la taille à laquelle mettre l'image.

    Quelqu'un aurait-il une solution?

    Merci par avance

  2. #2
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut,

    Word dispose d'une fonction fourre-tout depuis WordBasic (la SelInfo qui te donne des infos sur la sélection en cours et qui est devenu Selection.Information) ==> .

    Dans ton cas (comme tu ne nous a pas dit ce que tu avais comme version, j'ai supposé un Word2003), tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       HauteurPosEnTwip = Selection.Information(wdVerticalPositionRelativeToPage)
       LargeurPosEnTwip = Selection.Information(wdHorizontalPositionRelativeToPage)
    qui renvoient la distance entre le bord supérieur (respectivement gauche) de la sélection et le bord supérieur (respectivement gauche) de la page. Les mesures sont exprimés en twips (= 1/20 point Word et 72 points Word = 1 pouce = 2,54 cm environ). Attention, les points Word ne sont ni des points Pica ni points Cicéro (mais des points que j'appelle Word car seul Word utilise).

    Voila après, tu utilises des informations de marge de ta section, ta reliure (avec les cas des pages droites et gauches), ton format de papier, une grosse soustraction plus tard, tu as tes info en cm.

    Poste si tu n'as pas assez d'explication et que tu veuilles comprendre (mais attention, c'est compliqué).

    @+

  3. #3
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Hello Sepia,
    Tu mets "Les mesures sont exprimés en twips (= 1/20 point Word et 72 points Word = 1 pouce = 2,54 cm environ)"
    Une question pour ma gouverne : Le nombre de twips ne dépend-il pas de la définition de l'écran ?
    Juste pour compliquer un peu Mais ma question demeure

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Merci Heureux-Oli, C'est bien ce qu'il me semblait
    Citation Envoyé par Le lien du lien du lien...
    Cela signifie que la relation entre les twips et les pixels dépend de la résolution de l'écran.
    Et donc, nekou, t'es pas sorti de l'ornière

  6. #6
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 087
    Points : 42 926
    Points
    42 926
    Par défaut
    Le problème avec les pages en Word, c'est que ce sont des "objets" non reconnus, on ne peut pas la saisir simplement, il faut utiliser des tas de choses pour y arriver.
    En plus, si on veut manipuler une partie du contenu pour n'importe quelle raison, on entre dans le débuts des problèmes.

    Sachant que les pages sont variables en fonction de l'imprimante, du papier, de la disposition du papier, des marges du document et cette liste n'est pas exhaustive.

    Ce sera toujours de l' "A peu près"
    Ce que l'on peut faire dans le cas de nekou, c'est compter le nombre de lignes de texte déjà présent et on devrait alors connaître le nombre de lignes "vides" et en utilisant le nombre de points utilisés par une ligne, connaître approximativement l'espace restant.

    Mais c'est pas si simple et il faut que les lignes utilisées soient toutes du même style, sans quoi il faut faire le compte par style et ...

    Pour écrire ce genre de macro, il faut vraiment que ça vale la peine.

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Un bricolage pourrait peut-être te donner une réponse mais je ne garantis rien. Consisterait à décompter physiquement le nombre lignes d'une page entièrement renseignée, ceci avec moveDown, et en testant le N° de la page, puis à compter le nombre de lignes renseignées sur ta page incomplète. Il te reste à faire une soustraction.
    Pour la page entièrement renseignée :
    Tant que N° de page ne change pas
    Compter les lignes
    Fin boucle
    et tu fais pareil pour ta feuille incomplète
    tant que MoveDown ne donne pas la même ligne (mémorisé dans Mem dans l'exemple suivant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Option Explicit
     
    Sub test()
    Dim NoPage As Integer, Mem$, NoLig1 As Integer, NoLig2 As Integer
        Selection.HomeKey Unit:=wdStory
        Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:=1
        'Compte le nombre de ligne d'une page complètement renseignée
        '(dans cet exemple la page 1)
        NoPage = Selection.Information(wdActiveEndPageNumber)
        Do While Selection.Information(wdActiveEndPageNumber) = NoPage
            Selection.MoveDown Unit:=wdLine, Count:=1
            NoLig1 = NoLig1 + 1
        Loop
     
        'recherche de la dernière page (envoie en fin de document)
        Selection.EndKey Unit:=wdStory
        NoPage = Selection.Information(wdActiveEndPageNumber) 'dernière page
     
        'Envoie en début de dernière page
        Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:=NoPage
     
        'Compte le nombre de lignes de cette dernière page
        Do While Selection.Information(wdActiveEndPageNumber) = NoPage
            With Selection
                .ExtendMode = True
                .MoveEnd Unit:=wdLine, Count:=1
            End With
            If Mem = Selection Then Exit Do
            Mem = Selection
            Selection.MoveRight Unit:=wdCharacter, Count:=1
            NoLig2 = NoLig2 + 1
        Loop
     
        'Affiche le nombre de lignes restant
        MsgBox NoLig1 - NoLig2
    End Sub
    J'ai bien dit "un bricolage"...
    A défaut de mieux
    Bon après-midi

    Edit
    Comme le dit Heureux-Oli, c'est de "l'à peu près" car ne tient pas compte des lignes de titre, des espacements donnés aux différents paragraphes, etc.

    Après, il reste également à multiplier par le nombre de points par ligne... comme le dit aussi Heureux-Oli (!)

  8. #8
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut,

    Oui c'est vrai Ouskel'n'or mais comme un twip est une unité de mesure directement linéaire au nb de cm, que l'on a rien à faire dans ce cas des pixels, et que tu peux exprimer dans Word des dimensions d'image en cm donc la résolution de l'écran n'a pas besoin d'être connue, en revanche la résolution de l'image change des choses.

    En effet, 1 cm <==> 28,2 twips donc si tu connais ta page en cm (disons du A4 soit 21 x 29,7 cm), ton orientation (disons à la française = portrait pour Word), tes marges (disons 2,5 cm de chaque côté), si tu as une position verticale de 222 twips, et que ta police soit de 12 points et que ton paragraphe est un espace avant de 6 points (standard) alors on obtient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       (29,7 - 2,5 (Marge Haute) - 2,5 (Marge Basse)) * 28,2 = 696,54 twips
       donc l'espace vertical restant est de 696,54 - 222 = 474,54 twips / 28,2 soit 16,8 cm
    Ceci est bien la hauteur restant utilisable (sur plusieurs postes avec plusiurs écrans différents y compris des 16/9). Je te conseille de prendre 0,5 cm de marge pour éviter des ennuis d'arrondi et surtout de ne te baser que sur la hauteur (pour éviter des phénomènes très moches d'anamorphose
    de ton image) et de calculer la largeur non pas par rapport à l'espace restant mais proportionnellement aux dimensions de ton image.

    Tiens-nous au courant
    @+

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Merci pour ton explication, Sepia. Elle mériterait d'être placée quelque part dans la FAQ (Word de préférence afin qu'on la retrouve...)
    Par contre,
    Citation Envoyé par nekou
    je n'arrive pas à obtenir l'espace restant sur ma page après mon texte pour avoir la taille à laquelle mettre l'image.
    Et là, pour ma part, je ne vois toujours pas, à moins de définir pour chaque ligne précédente la taille de police, les espacements avant et après paragraphe, etc.

    Comme je ne vois pas de solution simple à proposer, m'est venu une autre idée

    Consiste à
    - mémoriser le numéro de page de la fin du texte,
    - placer l'image après ce texte
    et, dans une boucle,
    - modifier la taille de l'image jusqu'à ce qu'elle entre dans la même page.
    Une taille max et une taille min évitant d'obtenir une icône

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Si Hauteur < Max et > Min => c'est bon, on ne fait rien
    Sinon
    Tant que N° page de l'image <> Page de fin de texte
        Si Hauteur > Min alors diminuer Hauteur 'un peu'
        Si Hauteur < Min => on place l'image sur la feuille suivante
    Fin tant que
    J'ai testé ça pour une image de taille systématiquement > à la taille Max, à adapter dans le cas contraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub Test()
    Dim NoPage As Integer, im As InlineShape
        'Pour accélérer le bidule
        Application.ScreenUpdating = False
     
        'Place en fin de doc (on peut remplacer par un goto No de page -> voir [1])
        Selection.EndKey Unit:=wdStory
     
        'mémorise le No de page
        NoPage = Selection.Information(wdActiveEndPageNumber)
     
        'Insère l'image. im, instance de l'image, sert à raccourcir le code -> Voir [2]
        Set im = Selection.InlineShapes.AddPicture(FileName:="D:\Rep photos\Limage.jpg")
     
        'Sélection de l'image
        Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
     
        'Tant que le N° de page est différent de celui du texte, on réduit l'image
        Do While Selection.Information(wdActiveEndPageNumber) <> NoPage
            'Réduction de l'image de "-1"  (fixé empiriquement)
            im.Height = im.Height - 1
            'On adapte le - 1 au rapport Hauteur/largeur de l'image
            im.Width = im.Width - 1 * im.Width / im.Height
        Loop
        Application.ScreenUpdating = True
    End Sub
    [1] Si un goto No de page est utilisé, il sera nécessaire de faire une boucle (donnée dans un post précédent) permettant de se placer sur la première ligne vide de la page concernée.

    [2] Passer par l'objet Image ralentit la procédure et occupe de la place mémoire mais simplifie l'écriture (cette remarque n'étant valable que pour un grand nombre d'images)

    NB - Je n'ai pas limité la taille de l'image ni à un min ni à un max mais je ne pense pas que l'adapter présente de difficulté...

  10. #10
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut
    Salut Ouskel'nor,

    le pb c'est que je ne sais pas comment faire pour mettre une info sur la FAQ et puis il faut l'épurer pour n'avoir que son contexte (comme d'habitude je vais essayer de voir ça avec Heureux-Oli).

    Ok pour ton algo qui est simple a le mérite de pouvoir être étendu sous forme progressive avec plusieurs passages. Le 1er détermine grossièrement la taille et puis on affine de plus en plus jusqu'à la granularié voulue ou jusqu'au twip (qui est l'unité la plus petite de Word).

    @+

  11. #11
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Cépanous qu'on met dans la FAQ... Tu places ton message dans Contribuez. Quand le grand responsable passe par là, il juge de l'opportunité de le placer dans la FAQ. Et là, je pense qu'il n'y aura pas de problème.
    Bonne soirée
    A+

Discussions similaires

  1. [MySQL] créer et gérer un espace publicitaire sur une page web dynamique (php, js, etc)
    Par taftchap dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/08/2011, 18h12
  2. [XI] obtenir plusieurs colonnes sur une page
    Par Aurazed dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 12/06/2007, 15h10
  3. [XSL-FO][FOP] Occuper l'espace restant d'une page
    Par FreeCake dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 25/05/2007, 14h06
  4. Réponses: 8
    Dernier message: 26/03/2006, 15h09
  5. Obtenir des infos sur une page web en ligne
    Par Logan_Cale dans le forum Web & réseau
    Réponses: 1
    Dernier message: 20/08/2005, 15h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo