IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > VBA
        Quelles sont les macros qui s'exécutent seules dans Word ?
        Comment exécuter une macro d'un document Word ?
        Quelles sont les syntaxes du langage VBA ?
        Comment sélectionne-t-on avec VBA Word
        Que représente la collection Sentences ?
        Comment mettre en place un moyen d'ouvrir un document à l'endroit de la dernière édition ?
        Je reçois un message d'erreur me signalant que le type de données utilisateur est non défini, pourquoi ?
        Comment appeler une macro se trouvant dans un autre document ?
        Comment déclarer mes variables en VBA ?
        Comment connaitre les valeurs des twips en VBA ?
        Comment vider le presse-papier en VBA ?
        Comment atteindre une plage comprise entre deux signets ?
        Pourquoi travailler avec l'objet Range et l'objet Selection ?
        Comment faire pour changer l'imprimante par défaut en Word ?
        Comment tester le type de données dans mon code ?
        Comment déclarer un objet application dans mon code ?
        Pourquoi ai-je toujours un texte sélectionné ?
        Comment insérer la date du jour dans un signet Word ?
        Comment créer un certificat local pour les macros VBA ?
        Comment changer le répertoire par défaut de Word ?
        Est-il possible d'obtenir plusieurs résultats d'une fonction ?
        Comment récupérer les fautes d'orthographe contenues dans un document et les sauvegarder dans un fichier texte ?
        Peut-on ajouter des raccourcis-clavier par le code ?
        Peut-on générer les statistiques par le code ?
        Comment remplacer une macro dans tous fichiers DOT d'un répertoire ?
        Comment obtenir l'affichage de certaines boîtes de dialogue prédéfinies ?
        Pourquoi lorsque je tape mon code, la liste me proposant la suite du code n'apparaît pas ?
        Pourquoi les arguments passés à une méthode ou une propriété sont-ils précédés du nom de l'argument et de := ?
14.1. Fichiers (3)
                Comment Lire et modifier les propriétés des fichiers Office ?
                Comment utiliser le système de fichier dans une procédure ?
                Comment fonctionnent les protections Word ?
14.2. Formulaires 'UserForm' (1)
                Comment afficher mon formulaire (UserForm) ?
14.3. Paragraphes (5)
                Comment ajouter un paragraphe dans un document ?
                Comment accéder aux paragraphes d'un document Word ?
                Lorsque je change le texte de mon paragraphe la mise en page change ?
                Pourquoi je n'arrive pas à sélectionner le dernier mot de mon paragraphe ?
                Comment supprimer les lignes vides d'un document ?
14.4. Interraction avec d'autres logiciels (3)
                Comment envoyer un document par mail ?
                Comment utiliser Word avec les autres logiciels de la suite Office ?
                Comment ajouter une référence à mon projet ?
14.5. Pages (4)
                Comment obtenir le nombre de page d'un document?
                Comment exporter un nombre de pages choisies ?
                Comment isoler une page spécifique dans un document ?
                Comment enregistrer chaque page de mondocument dans un nouveau document ?



Quelles sont les macros qui s'exécutent seules dans Word ?
auteur : Lebeau Olivier
En attribuant un nom particulier à une macro, la macro pourra s'exécuter lors de
certains évènements comme l'ouverture d'un document, la création d'un nouveau document.

Macro Evènement
AutoExec Lorsque vous démarrez Word
AutoNew Lors de la création d'un nouveau document basé sur un modèle
AutoOpen Lors de l'ouverture d'un document
AutoClose Lors de la fermeture d'un document
AutoExit Lorsque vous quittez Word
Document_BuildingBlockInsert Cette macro s'exécute lors de l'insertion d'un élément "QuickPart"
Document_Close Cette macro s'exécute lors de la fermeture du document
Document_ContentControlAfterAdd Lors de l'ajout d'un Contrôle de contenu spécifique
Document_ContentControlBeforeContentUpdate Lors de la modification du contenu d'un Contrôle de contenu spécifique
Document_ContentControlBeforeDelete Avant suppression d'un Contrôle de contenu spécifique
Document_ContentControlBeforeStoreUpdate Survient avant que le magasin de données XML du document soit mis à jour avec la valeur d'un contrôle du contenu.
Document_ContentControlOnExit Sur sortie du contrôle
Document_New Sur création d'un nouveau document alors que le document qui contient la procédure est ouvert.
Document_Open Sur ouverture d'un document alors que le document qui contient la procédure est ouvert.
Document_Sync Se produit lorsque la copie locale d'un document faisant partie d'un espace de travail de document est synchronisée avec la copie sur le serveur.
Document_XMLAfterInsert Se produit lorsqu'un utilisateur ajoute un nouvel élément XML à un document.
Document_XMLBeforeDelete Se produit lorsqu'un utilisateur supprime un élément XML d'un document.

Comment exécuter une macro d'un document Word ?
auteur : SilkyRoad
Nécessite d'activer la référence "Microsoft Word xx.x Object Library".
vba

Dim WordApp As Word.Application

    Set WordApp = CreateObject("Word.Application")
    WordApp.Visible = True
    
    WordApp.Documents.Open ("C:\monDocument.dot")
    WordApp.Run "laMacro"

Quelles sont les syntaxes du langage VBA ?
auteur : Maxence Hubiche
Un petit tutoriel pour vous guider : Les cinq syntaxes de base du langage VBA


Comment sélectionne-t-on avec VBA Word
auteur : bidou
Quelques exemples standards. Sélectionner tout le document
objDoc.Range(0, 0).Select
Selection.MoveEnd wdStory
Aller au début du document
Selection.HomeKey Unit:=wdStory
Aller à la fin du document
Selection.EndKey Unit:=wdStory
Sélectionner une ligne
Selection.EndKey Unit:=wdLine, Extend:=wdExtend
Sélectionner le troisième paragraphe
objDoc.Paragraphs(3).Range.Select

Que représente la collection Sentences ?
auteur : bidou
Sentences est une collection renvoyant les "phrases" de son conteneur (document, paragraphe ...). Par phrase on entend tout ce qui est compris entre des points et/ou des retours chariots.

'Notez que c'est donc différent des lignes word
Dim objDoc As Document, Phrase As Range

Set objDoc = Application.Documents.Open("D:\tuto.doc")
MsgBox objDoc.Sentences.Count & vbCrLf & objDoc.BuiltInDocumentProperties(wdPropertyLines)
For Each Phrase In objDoc.Sentences
    Phrase.Select
    MsgBox "suite"
Next


Comment mettre en place un moyen d'ouvrir un document à l'endroit de la dernière édition ?
auteur : Lebeau Olivier
Alors que les versions précedentes de Word permettaient une recherche rapide du dernier point d'insertion dans le document, la version 2007 ne possède plus cette fonctionnalité. Le code fournit ci-dessous permet de palier ce manque.

Vous devez utiliser deux codes, l'un sur l'ouverture et l'autre sur la fermeture du document. Sur l'ouverture, pour atteindre un signet et le supprimer. Sur la fermeture, pour ajouter un signet à l'endroit de la dernière édition.

Sub Document_Open()
ActiveDocument.Bookmarks("ICI").Select
ActiveDocument.Bookmarks("ICI").Delete
End Sub

Sub Document_Close()
With Selection
    .Bookmarks.Add "ICI"
End With

End Sub
Vous pouvez placer ce code dans le document que vous éditez, auquel cas il ne fonctionnera que pour ce document, ou dans le Normal.dotm, et il sera utilisé pour tous vos documents.


Je reçois un message d'erreur me signalant que le type de données utilisateur est non défini, pourquoi ?
auteur : Lebeau Olivier
Lors de l'appel en VBA d'une application autre que l'application hôte, il est impératif d'ajouter la bibliothèque de cette application à votre projet.

Ne pas ajouter cette référence, revient à utiliser des types de données qui sont inconnus.

On ajoute ces références par le menu "Outils" "Références" de l'éditeur VBE. La boîte de dialogue contient la liste des bibliothèques disponibles.


Comment appeler une macro se trouvant dans un autre document ?
auteur : Lebeau Olivier
Il est possible d'utiliser une macro se trouvant dans un autre document. Il faut pour cela que le document contenant la procédure soit ouvert.

Documents("MonDocument.docm").MaRoutine
Avec "MaRoutine" le nom de la macro située dans l'autre document.


Comment déclarer mes variables en VBA ?
auteur : Maxence Hubiche


Comment connaitre les valeurs des twips en VBA ?
auteur : nico-pyright(c)
L'objet Screen n'existant pas en VBA, on peut retrouver ces valeurs en utilisant les fonctions de l'API Win32 :


Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long

Private Const HWND_DESKTOP As Long = 0
Private Const LOGPIXELSX As Long = 88
Private Const LOGPIXELSY As Long = 90

Function TwipsPerPixelX() As Single
Dim lngDC As Long
    lngDC = GetDC(HWND_DESKTOP)
    TwipsPerPixelX = 1440 & / GetDeviceCaps(lngDC, LOGPIXELSX)
    ReleaseDC HWND_DESKTOP, lngDC
End Function

Function TwipsPerPixelY() As Single
Dim lngDC As Long
    lngDC = GetDC(HWND_DESKTOP)
    TwipsPerPixelY = 1440 & / GetDeviceCaps(lngDC, LOGPIXELSY)
    ReleaseDC HWND_DESKTOP, lngDC
End Function

Comment vider le presse-papier en VBA ?
auteur : rp
L'objet ClipBoard n'existant pas en VBA, il faut utiliser les fonctions de l'API Windows :
vba

'-- Déclaration des fonctions API
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long

Private Sub Commande0_Click()
    OpenClipboard 0 
    EmptyClipboard
    CloseClipboard
End Sub

Comment atteindre une plage comprise entre deux signets ?
auteurs : Maxence Hubiche, bidou
On utilise la décomposition du range en Start et End

ActiveDocument.Range(ActiveDocument..Bookmarks("sig1").Range.Start, _
ActiveDocument..Bookmarks("sig2").Range.End).Select 

Pourquoi travailler avec l'objet Range et l'objet Selection ?
auteur : bidou
Cela permet de gérer des opérations sur une plage sans modifier l'emplacement du point d'insertion. Supposons que je veuille insérer deux signets, l'un sur un mot, l'autre sur le point d'insertion, je peux faire :
Selection.TypeText Text:="Monsieur "
Set objRange = Selection.Words.First.Previous(wdWord)
objRange.Bookmarks.Add "genre"
With ActiveDocument.Bookmarks
    .Add Range:=Selection.Range, Name:="Nom"
    .DefaultSorting = wdSortByName
    .ShowHidden = True
End With

Comment faire pour changer l'imprimante par défaut en Word ?
auteur : Lebeau Olivier
Pour changer l'imprimante par défaut en Word, c'est n'est pas sur la collection documents qu'il faut agir mais sur l'objet application.

Sub printPDF()

Dim oldprint
oldprint = Application.ActivePrinter
Application.ActivePrinter = "PDFCreator"
ActiveDocument.PrintOut
Application.ActivePrinter = oldprint
End Sub
Le code ci-dessus permet de changer l'imprimante par défaut en activant PDFCreator et après l'impression, change de nouveau l'imprimante par défaut en reprenant l'imprimante du départ.


Comment tester le type de données dans mon code ?
auteur : Lebeau Olivier
Dans le déroulement d'un code, il est parfois intéressant de connaître le type de variable utilisée.

VarType(MaVariable)
Les résultats renvoyés sont sous la forme d'un entier.

Type de donnée Valeur renvoyée Description
vbEmpty 0 Empty (non initialisée)
vbNull 1 Null (aucune donnée valide)
vbInteger 2 Entier
vbLong 3 Entier long
vbSingle 4 Nombre à virgule flottante en simple précision
vbDouble 5 Nombre à virgule flottante en double précision
vbCurrency 6 Valeur monétaire
vbDate 7 Valeur de date
vbString 8 Chaîne
vbObject 9 Objet
vbError 10 Valeur d'erreur
vbBoolean 11 Valeur booléenne
vbVariant 12 Variant (utilisée seulement avec des tableaux de variants)
vbDataObject 13 Objet d'accès aux données
vbDecimal 14 Valeur décimale
vbByte 17 Octet
vbUserDefinedType 36 Variant contenant des types définis par l'utilisateur
vbArray 8192 Tableau

Comment déclarer un objet application dans mon code ?
auteur : Lebeau Olivier
Il existe deux grand principe pour la déclaration de vos objets en VBA :
- Le EarlyBinding
- Le LateBinding

EarlyBinding
On pourrait traduire par liaison précoce. Ce mode de déclaration signifie que l'on a ajouté la bibliothèque l'application dans les références du projet. L'avantage est la possibilité d'utiliser l'IntelliSense ou Auto-Completion lors de l'écriture de votre code.

L'avantage est que vous éliminez des erreur de frappe ou de syntaxe lors de l'écriture votre code.
L'inconvenient est que si vous distribuez votre projet, les bibliothèques doivent aussi se trouver sur les autres PC.
EarlyBinding


Sub ConnexionDBAccess()
'Déclaration des variables
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim sql As String
'Affectation de la sentence SQL
sql = "SELECT * From T_Adresses"
'Affectation des Objets d'access aux données
Set db = DBEngine.OpenDatabase( _
   "C:\Documents and Settings\Olivier\Mes documents\Mes sources de données\DB_Publipostage.mdb")
Set rs = db.OpenRecordset(sql)
'Boucle pour la récupération des données
While Not rs.EOF
Debug.Print rs.Fields(2)
rs.MoveNext
Wend
'Libération des objets
rs.Close
db.Close

Set rs = Nothing
Set db = Nothing

End Sub
LateBinding
On pourrais traduire pas liaison tardive. Dans l'explication précédente, la bibliothèque etéit ajoutée au projet dès le début. Dans ce mode, la bibliothèque est appelée dans le code.
L'avantage principal, c'est que votre code peut être distibué sans avoir à tenir compte de la version disponible de l'application.
L'inconvenient, ce mode ne permet pas l'utilisation de l'IntelliSense.

Sub OuvrirFichierXL()
Dim xlApp As Object
Dim xlWb As Object

Set xlApp = CreateObject("Excel.Apllication")
Set xlWb = xlApp.WoorkBooks.Add

xlApp.Visible = True
End Sub
lien : faq Comment ajouter une référence à mon projet ?
lien : faq Pourquoi lorsque je tape mon code, la liste me proposant la suite du code n'apparaît pas ?

Pourquoi ai-je toujours un texte sélectionné ?
auteur : bidou
Il y a beaucoup de confusion possible entre range et selection or les deux objets sont différents. Pour pouvoir basculer facilement de l'un à l'autre il faut utiliser une variable Range. Prenons un exemple
Dim objDoc As Document

Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
objDoc.Paragraphs(3).Range.Select
objDoc.Paragraphs(3).Range.EndOf wdWord, wdMove
Là, malgré le EndOf, le paragraphe est encore selectionné
Dim objDoc As Document, objRange As Range

Set objDoc = Application.Documents.Open("c:\jmarc\tuto.doc")
objDoc.Paragraphs(3).Range.Words(objDoc.Paragraphs(3).Range.Words.Count - 2).Select
Set objRange = objDoc.Paragraphs(3).Range
objRange.EndOf wdWord, wdMove
objRange.Select
Place le point d'insertion après le troisième paragraphe


Comment insérer la date du jour dans un signet Word ?
auteur : SilkyRoad
Nécessite d'activer la référence "Microsoft Word xx.x Object Library" :

Dans l'exemple ci-dessous le signet à renseigner doit être nommé "SignetDate"
vba

Dim WordApp As Word.Application
Dim WordDoc As Word.document

    Set WordApp = New Word.Application
    WordApp.Visible = True
    Set WordDoc = WordApp.Documents.Open("monDocument.doc")

    WordDoc.Bookmarks("SignetDate").Range.Text = Format(Now, "dd/mm/yyyy")

Comment créer un certificat local pour les macros VBA ?
auteur : ThierryAim
Lorsque le niveau de sécurité intrinsèque des documents Office est réglé sur moyen ou élevé, il est alors impossible d'activer automatiquement les macros d'un document.

La première solution consiste à régler le niveau de sécurité sur faible (Menu Outils Macros Sécurité...), mais n'est pas très recommandée.

L'autre solution consiste à auto-certifier les macros d'un document.
Un certificat local, valable uniquement sur la machine sur laquelle il est installé, va vous permettre d'éviter le désagrément d'avoir à confirmer l'activation des macros à l'ouverture d'un document, ou pire, la désactivation systématique des macros.

Comment procéder :
  • Rechercher dans le répertoire d'installation de Microsoft Office (généralement C:\Program Files\Microsoft Office\OfficeXX) le programme SelCert.exe
  • Exécuter SelfCert.exe
  • Renseigner le nom du certificat dans la zone de texte et valider
  • Fermer SelfCert.exe
  • Ouvrir le document Office dont les macros doivent être certifiées
  • Dans l'éditeur VBA (Alt-F11), menu Outils Signature électronique ...
  • Cliquer sur "Choisir..." et sélectionner le certificat précédemment créé
  • Enregistrer le document
A la prochaine ouverture du document, une alerte de sécurité va apparaître, cocher alors la case "Toujours faire confiance aux macros provenant de... ".

Pour supprimer un certificat existant :
  • Panneau de configuration Options Internet
  • Onglet Contenu, cliquer sur Certificats...
  • Sélectionner le certificat et cliquer sur Supprimer


Comment changer le répertoire par défaut de Word ?
auteur : Lebeau Olivier
Deux méthodes pour changer le répertoire par défaut de Word.
La première est permanente

Application.Options.DefaultFilePath(wdDocumentsPath) = "c:\temp"
La seconde n'est valable que pour la session Word en cours, si vous fermez Word, ce paramètre disparaît.

Application.ChangeFileOpenDirectory "C:\temp"

Est-il possible d'obtenir plusieurs résultats d'une fonction ?
auteur : Lebeau Olivier
En principe, une fonction ne peut renvoyer qu'une seule variable. Partant de là, il est possible d'utiliser une variable de type utilisateur.

Type MyVar
    IntA As Integer
    IntB As Integer
End Type
Voilà un type de donnée défini par l'utilisateur.

Sub MaProc()
Dim MyData As MyVar

With MyData
    .IntA = 10
    .IntB = 20
End With
MyData = monCalcul(MyData)
Debug.Print MyData.IntA, MyData.IntB

End Sub
Voilà un procédure qui va faire appel à une fonction et passer en paramètre une variable qui contient 2 valeurs.

Public Function monCalcul(MyDt As MyVar) As MyVar
monCalcul.IntA = MyDt.IntA * 2
monCalcul.IntB = MyDt.IntB / 4

End Function
Notre fonction renvoie bien deux résultats


Comment récupérer les fautes d'orthographe contenues dans un document et les sauvegarder dans un fichier texte ?
auteur : Lebeau Olivier
Pour récupérer les fautes d'un document, il faut faire appel à la collection SpellingErrors. Nous allons parcourir les membres ce cette collection, les ajouter à une variable et ensuite, insérer la variable dans un nouveau document qui sera sauvegardé au format texte.

Sub Fautes()
Dim mesFotes
Dim toutesmesfotes

For Each mesFotes In ActiveDocument.SpellingErrors
mesFotes.Select
toutesmesfotes = toutesmesfotes & vbCrLf & Selection
Next mesFotes
Application.Documents.Add
ActiveDocument.Content.InsertAfter toutesmesfotes
ActiveDocument.SaveAs FileName:="c:\temp\mesftes.txt", FileFormat:=wdFormatText
ActiveDocument.Close


End Sub

Peut-on ajouter des raccourcis-clavier par le code ?
auteur : bidou
C'est assez facile. L'exemple suivant affecte la mise en exposant à CTRL+MAJ+E


   CustomizationContext = NormalTemplate
    KeyBindings.Add KeyCode:=BuildKeyCode(wdKeyE, _
	  wdKeyControl, wdKeyShift), KeyCategory:=wdKeyCategoryCommand, Command:="Superscript"

Peut-on générer les statistiques par le code ?
auteur : bidou
Oui, il faut par contre demander le calcul pour une statistique


Dim objDoc As Word.Document, msg As String

Set objDoc = Application.Documents.Open("d:\tuto.doc")
MsgBox "Le documents contient " & objDoc.ComputeStatistics(wdStatisticPages) & _
" pages et " & objDoc.ComputeStatistics(wdStatisticWords) & " mots"
Vous pouvez obtenir les statistiques pour
  • wdStatisticCharacters : nombre de caractères
  • wdStatisticCharactersWithSpaces : nombre de caractères avec les espaces
  • wdStatisticLines : nombre de lignes
  • wdStatisticPages : nombre de pages
  • wdStatisticParagraphs : nombre de paragraphes (retour chariot)
  • wdStatisticWords : nombre de mots


Comment remplacer une macro dans tous fichiers DOT d'un répertoire ?
auteur : SilkyRoad

Sub remplacement_Macro_WordDot() 
Dim Debut As Integer, Lignes As Integer, X As Integer 
Dim Fichier As String, Direction As String 
Dim Doc As Document   
Application.ScreenUpdating = False   'boucle sur tous les fichiers .dot du repertoire 
Direction = "C:\Documents and Settings\michel\dossier" 
Fichier = Dir(Direction & "\*.dot") 
Do While Fichier <> ""   
Set Doc = Documents.Open(Direction &amp; "\" &amp; Fichier)   
'suppression macro nommée "essai" dans module1  
With Doc.VBProject.VBComponents("Module1").CodeModule 
Debut = .ProcStartLine("essai", 0) 
Lignes = .ProcCountLines("essai", 0) 
.DeleteLines Debut, Lignes 
End With 

'ajout macro nommée "MaNouvelleMacro" dans Module1  
With Doc.VBProject.VBComponents("Module1").CodeModule 
X = .CountOfLines 
.InsertLines X + 1, "Sub MaNouvelleMacro()" 
.InsertLines X + 2, "MsgBox ""Coucou"",VBinformation " 
.InsertLines X + 3, "End Sub" 
End With 

DoEvents 
Doc.Close True 
Set Doc = Nothing   
Fichier = Dir 
Loop 
Application.ScreenUpdating = True   
End Sub

Comment obtenir l'affichage de certaines boîtes de dialogue prédéfinies ?
auteur : Lebeau Olivier
Pour faire appel à une boîte de dialogue :


Dialogs(wdDialogFileOpen).Show

Je vous conseille de consulter l'aide pour obtenir la liste de toutes les boîtes de dialogue disponibles.


Pourquoi lorsque je tape mon code, la liste me proposant la suite du code n'apparaît pas ?
auteur : Lebeau Olivier
L'éditeur VBA (VBE) possède une fonction qui ouvre une liste déroulante lorsuqe l'on écrit du code.
Si cette fonction n'est pas disponible, c'est que la bibliothèque associée au code que vous utilisez n'a pas été ajoutée à votre projet.

La liste déroulante
lien : faq Comment ajouter une référence à mon projet ?

Pourquoi les arguments passés à une méthode ou une propriété sont-ils précédés du nom de l'argument et de := ?
auteur : Lebeau Olivier
Cette notation n'est pas obligatoire, mais elle rend la saisie et la compréhension du code plus facile.
Ainsi les deux lignes suivantes sont équivalentes :

Set oTbl = ActiveDocument.Tables.Add(Range:=Selection.Range, NumRows:=11, Numcolumns:=11)

Set oTbl = ActiveDocument.Tables.Add(Selection.Range, 11, 11)
Si certains arguments sont optionnels et ne sont pas renseignés, si vous n'utilisez pas la notation avec le nom et le :=, vous devrez utiliser des espaces entre les séparateurs. Il est beaucoup plus facile d'utiliser le nom des arguments, même si la saisie du code est un peu plus longue.

Set oDoc = Documents.Add(Visible:=yes)

Set oDoc = Documents.Add(, , , yes)
Le premier des deux code est plus explicite !



Consultez les autres F.A.Q.


  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.