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

VB.NET Discussion :

word et graphiques/pictures


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut word et graphiques/pictures
    Bonjour,
    Je me bas avec le msdn (qui a un système de recherche particulier tout de même) pour trouver de quoi m'aider sans succès.
    J'ai des graphiques sur Excel, je fais un .copypicture() sur eux et je les balances à des endroits spécifiques de mon fichier Word. Mais ils apparaissent très gros, et moi je veux modifier leurs tailles.
    Seulement je n'arrive pas à accéder à ces graphiques (normalement maintenant des bitmap), ce ne sont pas des shapes, et je ne vois pas d'autres objets qui pourrait correspondre pour faire ce maudit changement de taille.

    Please help me ! ça doit pas être si compliqué.

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    ce ne sont pas des shapes, et je ne vois pas d'autres objets qui pourrait correspondre pour faire ce maudit changement de taille
    Helas ce sont des InlineShapes....!!!
    La mise à l'echelle se fait en pour-cent des width & height courants

    code:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     
    Imports WD = Microsoft.Office.Interop.Word
    Imports XL = Microsoft.Office.Interop.Excel
    Imports OffCore = Microsoft.Office.Core
     
    Public Class frmPictureFromExcelToWord
        Dim myFile As String
        Dim appWord As WD.Application
        Dim oDoc As WD.Document
        Dim appExcel As XL.Application
        Dim oWorkBook As XL.Workbook
        Dim oSheet As XL.Worksheet
     
        Private Sub frmPictureFromExcelToWord_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'init Word
            appWord = New WD.Application
            oDoc = appWord.Documents.Open(myFile)
            appWord.Visible = True
     
            'init Excel
            appExcel = New XL.Application
            oWorkBook = appExcel.Workbooks.Open(myFile)
            oSheet = oWorkBook.Worksheets(1)
            appExcel.Visible = True
     
            'Copy du Chart 1
            Dim grafic1 As XL.Chart = oSheet.Shapes().Item(1).Chart
            grafic1.CopyPicture(XL.XlPictureAppearance.xlScreen,
                                  XL.XlCopyPictureFormat.xlPicture,
                                  XL.XlPictureAppearance.xlScreen)
     
            'Paste dans le range  selectionne  du doc...
            Dim rngDoc As WD.Range = oDoc.ActiveWindow.Panes(1).Selection.Range()
     
            rngDoc.Select()
            rngDoc.Paste()
     
            'mise a l'echelle de l'unique shape (un chart)
            Dim shps As WD.InlineShapes = rngDoc.InlineShapes
            shps(1).Select()
            shps(1).LockAspectRatio = OffCore.MsoTriState.msoTrue
            Dim percent As Single = 25 'c'est un pourcentage du width et height courants
            shps(1).ScaleWidth = percent
            shps(1).ScaleHeight = percent
     
     
        End Sub
    bon code...

  3. #3
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    J'aurais pu chercher un moment, je n'aurais jamais trouvé ou tilter sur InlineShapes ...
    Merci beaucoup, je peux me remettre sur cette tâche.

  4. #4
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    J'ai encore un soucis concernant ce inlinescale :

    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
    For k = 5 To 1 Step -1
                            Try
                                xlrecep.Worksheets(j).chartobjects("graphique " & k).CopyPicture()
                                Select Case j
                                    Case 3
                                        doc.Bookmarks.Item("SURN").Range.PasteAndFormat(WdPasteDataType.wdPasteShape)
                                        If (k = 2) Or (k = 3) Or (k = 4) Or (k = 5) Then
                                            p = doc.InlineShapes.Count
                                        End If
                                    Case 4
                                        doc.Bookmarks.Item("EAU").Range.PasteAndFormat(WdPasteDataType.wdPasteShape)
                                        If k = 2 Or k = 3 Then
                                            p = doc.InlineShapes.Count
                                        End If
                                    Case 5
                                        doc.Bookmarks.Item("DMSO").Range.PasteAndFormat(WdPasteDataType.wdPasteShape)
                                        If k = 2 Or k = 3 Then
                                            p = doc.InlineShapes.Count
                                        End If
                                End Select
                                doc.InlineShapes(p).ScaleHeight = 50
                                doc.InlineShapes(p).ScaleWidth = 50
                            Catch
                            End Try
                        Next
    Ceci est mon code. Je m'en sert pour copier et redimensionner des graphiques, sachant que dans le premier cas le redimensionnement dois avoir lieu sur les 4 derniers graphiques et sur les deux autres cas uniquement les deux derniers (dans mon word 3 zones de graphique, un avec 5 graph, les deux autres avec 3)
    C'est peut être une erreur de ma part, mais j'ai beau avoir un code qui marche théoriquement, les graphiques ne sont pas tous redimensionné comme souhaité. Je vois deux lieux ou sa pourrait pêcher : le select case que je gère mal ? ou alors le l'index p du inlineshapes qui ne se comporte pas comme je le pense (j'ai dans l'esprit que le dernier index de la collection correspond au dernier shape ajouté)

    Dans l'histoire, seul les deux derniers graphes de chaque séries sont modifiés.

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    re
    Je viens de voir ton post avec un peu de retard....
    sachant que dans le premier cas le redimensionnement dois avoir lieu sur les 4 derniers graphiques et sur les deux autres cas uniquement les deux derniers (dans mon word 3 zones de graphique, un avec 5 graph, les deux autres avec 3)
    Helas 2 et 3 ne sont pas les 2 derniers d'apres ton code...
    Les 2 derniers sont dans l' ordre du worsheet: 4 et 5 (l'iteration etant negative) et portant en plus sur 5 graphiques dans le worsheet...

    Il y a peut etre confusion à cause de l'teration à rebours dans l 'ordre des graphiques du classeur excel...

    Ton code est bon sauf que dans Word il faut toujours respecter ces 3 regles d'airain :
    -preciser la Portee ou Objet Cible :Range ou Bookmark ou Selection parce ces objets se chauvechent dans Word...
    -Selectionnner l'objet..
    -ensuite Travailler dessus..
    Tu travailles sur Word.Document.InlinesShapes c.a.d tous les InlineShapes du doc...mauvais et tu te noies dans les indices des shapes....

    Au lieu simplement de cibler les bonnees portees:
    - BookMark.Range ,BookMark.Range.Paste et BookMark.Range.InlineShape(un seul shape que tu scales en vol)...

    ton code code revu (en fontion des "2 derniers"):

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
      Private Sub btnCopyPaste_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCopyPaste.Click
            If oDoc Is Nothing Then Return
            If oSheet Is Nothing Then Return
     
     
            'CIBLER toujours les Ranges surlequels on travaille 
            Dim rngDoc As WD.Range = oDoc.Range
     
            'On cible le RANGE du BookMark selectionnne
            'qui contient l'UNIQUE InlineShape "pasté"
            Dim rngBKM As WD.Range
     
            'ECHELLE
            Dim sc As Single = 50.0
     
            'INIT le range du doc
            rngDoc = oDoc.Range
            For j = 1 To 5
                Try
                    For k = 5 To 1 Step -1
                        'VIDE LA POUBLLE
                        Clipboard.Clear()
                        oWorkBook.Worksheets(j).ChartObjects("Graphique " & k).CopyPicture()
                        Select Case j
                            Case 3
                                rngBKM = rngDoc.Bookmarks.Item("SURN").Range
                                rngBKM.Select()
                                rngBKM.Paste()
                            If k = 2 Or k = 3 Or k = 4 Or k = 5 Then
                                    'perform scaling in place
                                    rngBKM.InlineShapes.Item(1).ScaleHeight = sc
                                    rngBKM.InlineShapes.Item(1).ScaleWidth = sc
                                End If
                            Case 4
                                Clipboard.Clear()
                                oWorkBook.Worksheets(j).ChartObjects("Graphique " & k).CopyPicture()
                                rngBKM = rngDoc.Bookmarks.Item("EAU").Range
                                rngBKM.Select()
                                rngBKM.Paste()
                                ' HALTUS !!!!
                                ' 2 et 3 ne sont pas les 2 derniers 
                                ' les 2 derniers sont : 5 et 4 l'iteration etant negative 
                                ' et portant en plus sur 5 graphiques dans le worsheet
                                If k = 4 Or k = 5 Then
                                    'perform scaling in place
                                    rngBKM.InlineShapes.Item(1).ScaleHeight = sc
                                    rngBKM.InlineShapes.Item(1).ScaleWidth = sc
                                End If
     
                            Case 5
                                Clipboard.Clear()
                                oWorkBook.Worksheets(j).ChartObjects("Graphique " & k).CopyPicture()
                                rngBKM = rngDoc.Bookmarks.Item("DMSO").Range
                                rngBKM.Select()
                                rngBKM.Paste()
                                If k = 4 Or k = 5 Then
                                    'perform scaling in place
                                    rngBKM.InlineShapes.Item(1).ScaleHeight = sc
                                    rngBKM.InlineShapes.Item(1).ScaleWidth = sc
     
                                End If
                        End Select
     
                    Next
                Catch ex As Exception
     
                End Try
            Next
     
        End Sub
    bon code....

  6. #6
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    Concernant l'indice des deux derniers schémas, non, il n'y a pas d'erreur, j'ai en fait un certains nombre de graphiques, sur un certain nombre de feuilles, la plus part du temps il y a 3 graphique, mais la première feuille de chaque classeur en possède 5, c'est l'intérêt du try...catch donc dans le premier cas je prend les 4 derniers, et dans les autres cas les deux derniers.
    Sachant également que je souhaite que dans tout les cas, seul le premier ne soit pas redimensionné, il sert plus ou moins d'entête.
    Concernant la règle d'airain, j'en ai jamais entendu parlé avant (lacune dans mon apprentissage ? logique, j'en ai pas eu)

    Je vais tenter d'utiliser ton enseignement. Mais reste toujours que je comprends pas le comportement de mon code, m'enfin ça, c'est souvent. Merci beaucoup.

    me voilà maintenant à modifier mon code en fonction et je dois avouer que je ne comprend pas :
    Par exemple si j=4, avec ton code, le programme va copier le graphique, puis clear le presse papier pour le copier a nouveau ? C'est intéressant de faire ça ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Liaison excel word pour graphique
    Par minam dans le forum Word
    Réponses: 6
    Dernier message: 25/03/2009, 18h38
  2. [EDI] Poster un message avec environnement graphique type Word
    Par pssinjaune dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 08/05/2006, 13h10
  3. [VBA-E]Insertion graphique Excel dans Word
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 19/04/2006, 14h26
  4. [VBA-E]Copie graphique de excel vers word
    Par conconbrr dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/02/2006, 10h49
  5. afficher un graphique dans word à partir de mon code vba
    Par guysocode dans le forum VBA Word
    Réponses: 2
    Dernier message: 07/11/2005, 14h15

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