Grand merci à tous. Je vais étudier ces macros et le langage macro par la même occasion ...
Belle journée. François BRUYANT - Gestion commerciale et financière - 02 47 58 94 55 AMIANTE 37 - 9 rue des Cordeliers 37220 L’île Bouchard. Le 29 mars 2018 à 23:00, Jean-Francois Nifenecker < [email protected]> a écrit : > Bonsoir, > > (j'ai un pb avec les listes : je reçois les messages avec un "certain" > retard...) > > Le 29/03/2018 à 15:13, [email protected] a écrit : > >> Bonjour, >> Une autre possibilité, insérer des champs d'une Base de données dans la >> quelle ont été entrées les coordonnées des Maitres d'ouvrage. >> Documents 1, 2 etc sont connectés à cette Base de données. >> Pour afficher l'enregistrement d'un chantier particulier, faire Ctrl+F4 >> pour visualiser la Table, sélectionner l'enregistrement puis imprimer >> (après avoir éventuellement cliqué sur l"icône Données dans les champs >> si on veut être sûr de sa sélection). >> >> > ... et je n'ai toujours pas reçu votre message cité par Jean-Mi... > > Bonjour, >>> merci pour votre réponse. Celle ci sous entends d'utiliser la >>> programmation >>> dans libreoffice. >>> Dans ma question, j'ai précisé la manière de créer les variables via le >>> menu Champs, Variables, définir une variable, dans Writer, et je souhaite >>> ne pas avoir à programmer, simplement déclarer une variable. >>> Un exemple : >>> dans le document 1, crée à partir d'un modèle contenant une variable >>> "maitredouvrage" et une variable "adrMO", je définie la valeur de >>> "maitredouvrage à "M Duchemole", et celle de "adrMO" à "Av Gen de Gaulle >>> Paris" et je souhaite que dans le document 2 , créer à partir d'un autre >>> modèle qui contient aussi ces variables, les voir prendre pour valeur "M >>> Duchemole" et "Av Gen de Gaule Paris". >>> Si cela n'est pas possible sans programmer, mais possible en programmant, >>> je suis aussi preneur ! (en langage libreoffice ou python). >>> >> > Argh ! Je n'avais pas bien lu /o\ > > En dehors de la proposition de Jean-Michel, je ne vois qu'une macro pour > injecter les champs d'utilisateur (c'est comme ça que ça s'appelle) d'un > document vers un autre. > > Voici les primitives que j'utilise (la doc est dans le code) : > > 8< ----------------------------------------------------- > > Public Const MFLD_USERSERVICE = "com.sun.star.text.fieldmaster.User." > Public Const MFLD_USERINSTANCE = "com.sun.star.text.fieldmaster.User" > > 'masterfield type identifiers > Public Const MFLD_TYPEUSERID = ".User." > > '------------------ > > Function ExportMasterFields(ByRef pTargetDoc As Object, Optional > pSourceDoc As Object) As Boolean > 'Exports user fields to some other Writer document. > 'Input: > '-- pTargetDoc: the target Writer document > '-- pSourceDoc: (optional) the source document. > ' Defaults to the current document. > 'Output: True if the process went well, otherwise False > > Dim lo_MastersSrc As Object 'the masterfields > container in the source document > Dim l_MasterName As String 'the current masterfield > name > Dim l_Value As Variant 'the current masterfield > value > Dim l_OK As Boolean 'the process flag > Dim i As Long > > l_OK = False > If IsMissing(pSourceDoc) Then pSourceDoc = ThisComponent > > On Local Error Goto FuncEnd: > > lo_MastersSrc = pSourceDoc.TextFieldMasters > For i = LBound(lo_MastersSrc.ElementNames()) To > UBound(lo_MastersSrc.ElementNames()) > l_MasterName = lo_MastersSrc.ElementNames(i) > 'we just export users' masterfields (but not sequence > fields) > If IsMasterFieldUser(l_MasterName) Then > 'read the masterfield name in the source document > l_MasterName = GetMasterFieldNameOnly(l_Maste > rName) > 'get its value > l_Value = GetMasterFieldValue(l_MasterName, > pSourceDoc) > 'create it within the target document > CreateMasterField(l_MasterName, l_Value, > pTargetDoc) > End If > Next > l_OK = True > > FuncEnd: > ExportMasterFields = l_OK > End Function 'ExportMasterFields > > Function CreateMasterField(ByRef pFieldName As String, Optional pValue As > Variant, Optional pDoc As Object) As Boolean > 'Creates a user field (aka MasterField in a Writer document). > 'Input: > '-- pFieldName: the master field name > '-- pValue: if provided, sets the initial value for the created master > field. > '-- pDoc: the document in which the master field is to be created. > ' If not specified, the current document is assumed. > 'Output: True if the operation was successful otherwise False. > > Dim lo_Masters As Object 'the masterfields in the target > document > Dim lo_Master As Object 'a masterfield > Dim l_OK As Boolean 'the process flag > > l_OK = False > If IsMissing(pDoc) Then pDoc = ThisComponent > > On Local Error Goto ErrHandler > lo_Masters = pDoc.TextFieldMasters > If Not lo_Masters.hasByName(MFLD_USERSERVICE & pFieldName) Then > lo_Master = pDoc.createInstance(MFLD_USERINSTANCE) > lo_Master.Name = pFieldName > End If > > If Not IsMissing(pValue) Then > lo_Master = lo_Masters.getByName(MFLD_USERSERVICE & > pFieldName) > lo_Master.Content = pValue > End If > > ErrHandler: > l_OK = Not Err > > CreateMasterField = l_OK > End Function 'CreateMasterField > > Function GetMasterFieldNameOnly(ByRef pMasterName As String) As String > 'Returns the field name alone, as seen in the UI. > 'Input: > '-- pMasterName: the full field name (incl. the MFLD_SERSERVICE part) > 'Output: the name alone. > > Dim l_Name As String > Dim l_arrParts() As String > > l_Name = "" > 'we look for the last part of the passed name (separator is a dot) > l_arrParts = Split(pMasterName, ".") > l_Name = l_arrParts(UBound(l_arrParts)) > > GetMasterFieldNameOnly = l_Name > End Function 'GetMasterFieldNameOnly > > Function GetMasterFieldValue(ByRef pFieldName As String, Optional pDoc As > Object) As Variant > 'returns the value of a master field or Nothing if the field is not found. > 'Input: > '-- pFieldName: the master field name > '-- pDoc: the document in which the master field is searched. > ' If not specified, the current document is assumed. > 'Output: the value of the field or Nothing if not found. > > Dim lo_Masters As Object > Dim lo_Master As Object > Dim l_Result As Variant > > l_Result = Nothing > If IsMissing(pDoc) Then pDoc = ThisComponent > > lo_Masters = pDoc.TextFieldMasters > lo_Master = lo_Masters.getByName(MFLD_USERSERVICE & pFieldName) > IF Not IsNull(lo_Master) Then > l_Result = lo_Master.Content > End If > > GetUserFieldValue = l_Result > End Function 'GetMasterFieldValue > > Function IsMasterFieldUser(ByRef pMasterFieldName As String) As Boolean > 'Checks whether a masterfield is a user one or not. > 'Input: > '-- pMasterFieldName: the masterfield name to check > 'Output: True is its name contents a ".User." part, otherwise False > > Dim l_IsUser As Boolean > > l_IsUser = (InStr(pMasterFieldName, MFLD_TYPEUSERID) > 0) 'other > possibility is: "SetExpression" > > IsMasterFieldUser = l_IsUser > End Function 'IsMasterFieldUser > > ------------------------------------------------------------- >8 > > La fonction à appeler est ExportMasterFields() en lui passant, a minima, > l'objet document cible (par défaut le document source est le document > courant). > > Les autres sous-programmes sont appelés par ExportMasterFields(). > > Attention : ce code n'est pas complètement à l'épreuve des balles... Je > sais 2-3 endroits où des vérifications seraient utiles mais pas le temps de > les ajouter pour le moment. > > > Conseil de nommage des champs d'utilisateur à exporter : vous pouvez > améliorer/sécuriser les choses en adoptant une convention de nommage de vos > champs d'utilisateur, en les préfixant de façon uniforme. De cette manière, > vous pourriez ne recopier que ceux qui vous intéressent en vérifiant les > préfixes lors de l'export (-> modifiez ExportMasterFields() en conséquence). > > > > Bien cordialement, > -- > Jean-Francois Nifenecker, Bordeaux > > -- Envoyez un mail à [email protected] pour vous désinscrire Les archives de la liste sont disponibles à https://listarchives.libreoffice.org/fr/users/ Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être supprimés
