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

FAQ Excel

FAQ ExcelConsultez toutes les FAQ

Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022 

 
OuvrirSommaireLes macros VBALes UserForm et les contrôlesLes contrôles

Cet exemple montre comment gérer l'évènement Clic sur toutes les images contenues dans un WebBrowser, en passant par un module de classe.

La procédure permet de renvoyer des informations sur chaque image :
*URL
*Nom
*Dates de création et de modification
*Type
*Dimensions
*Taille

La procédure nécessite d'activer la référence "Microsoft HTML Object Library".

Vba
Sélectionnez
'--------------------------------------
'A placer dans un module standard
Option Explicit
 
Public Collect As Collection
'--------------------------------------
Vba
Sélectionnez
'--- A placer dans un UserForm ---
 
'---
'Nécessite d'activer la référence "Microsoft HTML Object Library".
'---
 
Option Explicit
 
Dim maPageHtml As HTMLDocument
 
 
Private Sub UserForm_Initialize()
    WebBrowser1.Navigate "http://www.developpez.com"
End Sub
 
 
 
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    Dim Cl As Classe1
    Dim i As Integer
    Dim imgHtml As HTMLImg
 
    Set Collect = New Collection
    Set maPageHtml = WebBrowser1.Document
 
    'Boucle sur les liens contenus dans le WebBrowser
    For i = 0 To maPageHtml.images.Length - 1
        Set imgHtml = maPageHtml.images.Item(i)
 
        'ajoute l'objet dans la classe
        Set Cl = New Classe1
        Set Cl.Img = imgHtml
        Collect.Add Cl
    Next i
 
End Sub
 
 
 
Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, _
    URL As Variant, Flags As Variant, TargetFrameName As Variant, _
    PostData As Variant, Headers As Variant, Cancel As Boolean)
 
    'Fait le ménage avant de charger une nouvelle page
    Set Collect = Nothing
    Set maPageHtml = Nothing
 
End Sub
 
 
 
Private Sub WebBrowser1_NewWindow2(ppDisp As Object, Cancel As Boolean)
    'Empèche d'ouvrir le lien dans une nouvelle fenêtre
    Cancel = True
End Sub
'---------
Vba
Sélectionnez
'--------------------------------------
'A placer dans un module de classe nommé "Classe1"
'
Option Explicit
 
'Nécessite d'activer la référence "Microsoft HTML Object Library"
Public WithEvents Img As MSHTML.HTMLImg
 
 
'Exemple pour gérer l'évènement clic sur les objets
'type MSHTML.HTMLImg (images) dans le WebBrowser.
Private Function Img_onclick() As Boolean
 
    MsgBox "Adresse (URL): " & Img.src & vbCrLf & vbCrLf & _
        "Nom: " & Img.nameProp & vbCrLf & _
        "Créé le: " & Img.fileCreatedDate & vbCrLf & _
        "Modifié: " & Img.fileModifiedDate & vbCrLf & _
        "Type: " & Img.mimeType & vbCrLf & _
        "Dimensions: " & Img.Width & " x " & Img.Height & " pixels" & vbCrLf & _
        "Taille: " & Img.fileSize & " octets."
 
End Function
'--------------------------------------
Créé le 11 avril 2007  par SilkyRoad
Vba
Sélectionnez
Private Sub UserForm_Initialize()
'-------
'Cette procédure permet de créer une page dynamiquement
'dans un WebBrowser :
'   *Un texte
'   *Une image de fond
'   *Une fonction JavaScript
'   *Un bouton qui permet de déclencher la fonction
'
'-------
 
    Dim AjoutFonction As String
    Dim Fichier As String
 
    'Définit l'image de fond
    Fichier = "https://vb.developpez.com/cours/images/cours_vb.gif"
 
    'Création d'une page vierge qui va servir de support
    WebBrowser1.Navigate "about:<html><body></body></html>"
 
 
    '--- texte ---
    AjoutFonction = "<html><body><B>Bienvenue sur cette page.</B>" & vbCrLf
 
    '--- image de fond ---
    AjoutFonction = AjoutFonction & "<BODY background='" & Fichier & "'</BODY>"
    '---------------------
 
    '--- bouton ---
    AjoutFonction = AjoutFonction & "<FORM>" & _
    "<INPUT type=button name='Bouton1' value='Cliquez ici.' " & _
        "onClick=(alert('Bonjour!'))></FORM>"
    '--------------
 
    '--- fonction javascript ---
    AjoutFonction = _
        AjoutFonction & "<script language=""javascript"">" & vbCrLf
    AjoutFonction = AjoutFonction & "function maFonction(){" & vbCrLf
    AjoutFonction = AjoutFonction & "alert(""Coucou"");" & vbCrLf
    AjoutFonction = AjoutFonction & "}" & vbCrLf
    AjoutFonction = AjoutFonction & "</script></body></html>"
    '---------------------------
 
    'Insertion de la fonction JavaScript dans le WebBrowser
    WebBrowser1.Document.writeln AjoutFonction
End Sub

Si vous souhaitez ajouter un bouton qui déclenche la fonction JavaScript par macro, utilisez :

Vba
Sélectionnez
Private Sub CommandButton1_Click()
'
'Cette procédure montre comment déclencher, par macro VB/VBA, la fonction
'JavaScript contenue dans la page html précédemment créée.
'
 
    Dim s As String
    Dim maPageHtml As HTMLDocument
 
    Set maPageHtml = WebBrowser1.Document
    'Déclenchement de la fonction JavaScript par macro
    maPageHtml.parentWindow.execScript "maFonction();", "javascript"
End Sub

Utilisez la synthaxe suivante si la fonction JavaScript contient des arguments :

Vba
Sélectionnez
Private Sub CommandButton1_Click()
'
'Cette procédure montre comment déclencher, par macro VBA, une fonction
'JavaScript contenant un argument.
'
    Dim s As String
    Dim maPageHtml As MSHTML.HTMLDocument
 
    Set maPageHtml = WebBrowser1.Document
    'Déclenchement de la fonction JavaScript par macro
    maPageHtml.parentWindow.execScript _
        "ChangeBackGround('http://NomDuSite.com/NouvelleImage.gif');", "javascript"
 
End Sub
Créé le 14 mai 2007  par SilkyRoad

Un exemple en utilisant un WebBrowser ("Navigateur Web Microsoft" dans la liste des contrôles supplémentaires).

Vba
Sélectionnez
' --- A placer dans le module objet du UserForm :
Option Explicit
 
Private Sub UserForm_Initialize()
    ParametresHtml "Le forum DVP: Un texte qui défile.", "#000099"
End Sub
 
 
'scrollAmount définit la vitesse de défilement.
Private Sub ParametresHtml(LeTexte As String, LaCouleur As String)
    Me.WebBrowser1.Navigate _
        "about:<html><body BGCOLOR ='#CCCCCC' scroll='no'><font color= " _
        & LaCouleur & " size='5' face='Arial'>" & _
        "<marquee scrollAmount=3>" & LeTexte & "</marquee></font></body></html>"
End Sub
 
'---
Créé le 5 décembre 2007  par SilkyRoad

Lorsque vous parcourez des pages html depuis un WebBrowser, certains liens ouvrent les pages dans des nouvelles fenêtres, hors du navigateur web Microsoft.
Le code suivant permet de forcer l'affichage en permanence dans le WebBrowser.

Vba
Sélectionnez
Option Explicit
 
Dim WithEvents cible As SHDocVw.WebBrowser_V1
 
Private Sub cible_NewWindow(ByVal URL As String, _
    ByVal Flags As Long, ByVal TargetFrameName As String, _
    PostData As Variant, ByVal Headers As String, Processed As Boolean)
 
    Processed = True
    WebBrowser1.Navigate URL
End Sub
 
Private Sub UserForm_Initialize()
    Set cible = WebBrowser1
    WebBrowser1.Navigate2 "https://www.developpez.net/forums/search.php?searchid=2795245"
End Sub
Créé le 26 mai 2008  par SilkyRoad

Voici trois possibilités :

1er exemple
Sauvegardez le graphique sur le disque au format image, puis chargez cette image dans l'UserForm :

Vba
Sélectionnez
Option Explicit
 
Private Const Fichier As String = "C:\ImageTemp.gif"
 
Private Sub UserForm_Initialize()
 
   'Supprime l'image temportaire si elle existe
   If Dir(Fichier) <> "" Then Kill Fichier
 
    'Définit le 1er graphique de la Feuil1
    'exporte le graphique au format image
    Worksheets("Feuil1").ChartObjects(1). _
        Chart.Export Filename:=Fichier, filtername:="GIF"
    'Affiche l'image dans l'UserForm
    Image1.Picture = LoadPicture(Fichier)
End Sub
 
Private Sub UserForm_Terminate()
   'Supprime l'image temporaire si elle existe
   If Dir(Fichier) <> "" Then Kill Fichier
End Sub

2eme exemple
Utilisez la méthode PastePicture de Stephen Bullen.

3eme exemple
Utilisez un contrôle ChartSpace dans l'UserForm, afin de créer le graphique dynamiquement et d'interagir avec celui-ci.
Le complément Microsoft Office Web Components (Composants Web) est une collection de contrôles pour modèles d'objets composants (Component Object Model ou COM) permettant de publier sur le Web des feuilles de calcul, des graphiques et des bases de données. Ces contrôles peuvent aussi être utilisés dans vos classeurs Excel.

Complément d'Office 2003: composants Web Office.

Office XP Tool: Web Components.

Un exemple simple de création :
Ajoutez un contrôle Microsoft Office Chart et un CommandButton dans l'UserForm :

Vba
Sélectionnez
Private Sub CommandButton1_Click() 
    Dim i As Integer 
    Dim S1 As Object 
    Dim TabX(10), TabY(10) 
    'Utilisez l'objet WCChart pour la bibliothèque OWC9.
    'Dim Cht As WCChart
    'Utilisez l'objet ChChart dans les bibliothèques OWC10(Office 2002) et OWC11(Office 2003). 
    Dim Cht As ChChart 
    Dim C As Object 
 
    Randomize 
 
    'Remplissage des tableaux qui serviront à créer le graphique 
    For i = 0 To 9 
        TabX(i) = i 
        TabY(i) = Int((50 * Rnd) + 1) 
    Next i 
 
    Set C = ChartSpace1.Constants 
    Set Cht = ChartSpace1.Charts.Add 
 
    With Cht 
        'Type de graphique 
        .Type = C.chChartTypeScatterLineMarkers 
        .HasLegend = True 
        .Legend.Position = C.chLegendPositionBottom 
    End With 
 
     Set S1 = Cht.SeriesCollection.Add 
         With S1 
              .Caption = "Nom de la série" 
              .Type = C.chChartTypeLine 
              .SetData C.chDimCategories, C.chDataLiteral, TabX 
                  .SetData C.chDimValues, C.chDataLiteral, TabY 
         End With 
 
End Sub

Un autre exemple. Téléchargez le zip :
Visualiser et interagir avec un graphique dans un UserForm.

Créé le 14 mai 2007  par SilkyRoad

Les contrôles Spreadsheet et ChartSpace font partie du complément Microsoft Office Web Components (Composants Web) qui est une collection de contrôles pour modèles d'objets composants (Component Object Model ou COM) permettant de publier sur le Web des feuilles de calcul, des graphiques et des bases de données. Ces contrôles peuvent aussi être utilisés dans vos classeurs Excel.

Complément d'Office 2003: composants Web Office.

Office XP Tool: Web Components.

Cet exemple récupère les données du SpreadSheet (Sheet1!A1:B5) pour alimenter le ChartSpace.

Vba
Sélectionnez
Option Explicit
Option Base 1
 
'Nota :
'Utilisez l'objet WCChart pour la bibliothèque OWC9.
'Dim Cht As WCChart
 
'Bibliothèques OWC10 et OWC11
Dim Cht As ChChart
Dim C
 
 
Private Sub UserForm_Initialize()
 
    'Spécifie la source de données pour le graphique
    ChartSpace1.DataSource = Spreadsheet1
 
    Set C = ChartSpace1.Constants
    'Ajoute le graphique
    Set Cht = ChartSpace1.Charts.Add
 
    'Définit le type de graphiUE
    Cht.Type = C.chChartTypeLine
End Sub
 
 
 
Private Sub CommandButton1_Click()
    'Intègre les données du SpreadSheet dans le controle ChartSpace
    Cht.SetSpreadsheetData "Sheet1!A1:B5", False
End Sub
Créé le 20 septembre 2008  par SilkyRoad

Vous pouvez placer le contenu de la feuille dans un tableau puis le transférer dans le contrôle SpreadSheet.
Les mises en formes ne sont pas appliquées dans la forme et les éventuelles formules de la feuille de calcul sont remplacées par leurs valeurs brutes.

Vba
Sélectionnez
Private Sub UserForm_Initialize()
    'Testé avec Excel 2007 & OWC11
    Dim Tableau() As Variant
    Dim x As String
 
    x = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Address
 
    Tableau = Range("A1:" & x)
    Spreadsheet1.ActiveSheet.Range("A1:" & x) = Tableau
End Sub
Créé le 22 mars 2009  par SilkyRoad

Consultez le tutoriel et les classeurs démo

Excel 2007/Excel 2003 et OWC 11
Excel 2002 et OWC 10

Créé le 20 août 2007  par SilkyRoad

Le contrôle DataGrid permet d'afficher le résultat de requêtes effectuées dans des bases de données. L'ocx MSDATGRD.ocx doit être installé sur votre poste pour que vous puissiez l'utiliser.

Vous pouvez utiliser cet objet pour afficher le contenu de feuilles de calcul Excel. Dans ce cas il est préférable (mais pas obligatoire) que celles-ci soient structurées comme une base de données : La première ligne servant à indiquer le nom des champs, à partir de la première.

Image non disponible

Ce premier exemple effectue une requête dans la Feuil1 d'un classeur fermé et transfert le résultat dans le DataGrid.

Vba
Sélectionnez
Private Sub CommandButton1_Click()
 
    'Nécessite d'activer la référence "Microsoft ActiveX Data Objects x.x Library".
 
    Dim Cn As ADODB.Connection
    Dim Rs As ADODB.Recordset
 
    'Connexion au classeur fermé "C:\monClasseurBase.xls"
    Set Cn = New ADODB.Connection
    With Cn
        .Provider = "MSDASQL"
        .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
            "DBQ=C:\monClasseurBase.xls; ReadOnly=False;"
        .Open
    End With
 
 
    Set Rs = New ADODB.Recordset
    'Requête sur le feuille nommé Feuil1, dans le classeur fermé.
    'Ne pas oublier le symbole $ à la suite du nom de la feuille.
    Rs.Open "SELECT * FROM [Feuil1$]", Cn, adOpenKeyset, adLockOptimistic
    'Affichage du résultat de la requête dans le DataGrid
    Set DataGrid1.DataSource = Rs
End Sub

Cette deuxième procédure effectue la requête dans un classeur ouvert (dans la Feuil1 du classeur contenant la macro).
Remarque : Le classeur doit être préalablement sauvegardé sur le disque dur.

Vba
Sélectionnez
Private Sub CommandButton1_Click()
    Dim Cn As ADODB.Connection
    Dim Rs As ADODB.Recordset
 
    Set Cn = New ADODB.Connection
    With Cn
        .Provider = "MSDASQL"
        'Le classeur doit être préalablement sauvegardé
        .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
            "DBQ=" & ThisWorkbook.FullName & "; ReadOnly=False;"
        .Open
    End With
 
    Set Rs = New ADODB.Recordset
    'Ne pas oublier le symbole $ à la suite du nom de la feuille.
    Rs.Open "SELECT * FROM [Feuil1$]", Cn, adOpenKeyset, adLockOptimistic
    Set DataGrid1.DataSource = Rs
End Sub
Créé le 10 juin 2007  par SilkyRoad

Lien : Consultez le tutoriel pour lire et écrire dans des classeurs fermés

Lorsque vous fermez un UserForm, il est parfois utile de sauvegarder les paramètres d'un contrôle (par exemple le dernier contenu d'un TextBox) afin de réutiliser ces informations ultérieurement, lors de la prochaine ouverture de la boîte de dialogue.
Le moyen le plus simple consiste à enregistrer ces données dans les cellules d'une feuille masquée.
Il est aussi possible d'utiliser l'instruction SaveSetting pour sauvegarder les paramètres des contrôles (contenu, position ...) en créant une entrée dans la base de registres et ensuite d'utiliser GetSetting pour lire la valeur de la clé dans la base de registres.

Dans cet exemple, la procédure sauvegarde automatiquement le contenu des TextBox1 et 2 lors de la fermeture du UserForm.
Fermez votre classeur puis ré-ouvrez le. Les dernières données des TextBox apparaissent.

Vba
Sélectionnez
'Sauvegarde le contenu des TextBox lors de la fermeture du UserForm 
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    SaveSetting "Mes parametres", "TextBox1", "Valeur TextBox1", TextBox1.Value
    SaveSetting "Mes parametres", "Textbox2", "Valeur TextBox2", TextBox2.Value
End Sub
Vba
Sélectionnez
'Récupère la valeur de la clé lors de l'ouverture du UserForm
Private Sub UserForm_Initialize()
    TextBox1.Value = GetSetting("Mes parametres", "TextBox1", "Valeur TextBox1")
    TextBox2.Value = GetSetting("Mes parametres", "TextBox2", "Valeur TextBox2")
End Sub

Pour supprimer une entrée, utilisez :

Vba
Sélectionnez
DeleteSetting "Mes parametres", "TextBox2"
Créé le 20 août 2007  par SilkyRoad

Cet exemple ajoute 5 Textbox dans un Frame nommé Frame1 :

Vba
Sélectionnez
    Dim i As Integer
    Dim TxtB As Control
 
    'boucle pour créer 5 Textbox dans le controle Frame1
    For i = 1 To 5
        Set TxtB = Frame1.Add("forms.Textbox.1")
 
        With TxtB
            .Left = 5
            .Top = 10 + ((i - 1) * 30)
            .Width = 75
            .Height = 20
        End With
    Next i
Créé le 20 août 2007  par SilkyRoad

Cette syntaxe fonctionne aussi pour les ListBox.

Vba
Sélectionnez
Private Sub UserForm_Initialize()
    Dim Cell As Range
    Dim Tableau()
    Dim TempTab As Variant
    Dim i As Integer, j As Integer
    Dim boolVerif As Boolean
 
    ReDim Tableau(1 To 1)
    Tableau(1) = Cells(1, 1)
 
    'Boucle sur les données de la colonne A, dans la Feuil1
    For Each Cell In Worksheets("Feuil1").Range("A1:A" & _
                        Worksheets("Feuil1").Range("A65536").End(xlUp).Row)
        boolVerif = False
 
        'Vérifie si le contenu de la cellule existe déjà dans le tableau
        For i = 1 To UBound(Tableau)
            'Si la donnée existe déjà dans le tableau
            If Tableau(i) = Cell Then
                boolVerif = True
                Exit For
            End If
        Next i
 
        'Si la donnée n'existe pas dans le tableau, on augmente la taille du tableau
        'et on ajoute la donnée.
        If boolVerif = False Then
            ReDim Preserve Tableau(1 To UBound(Tableau) + 1)
            Tableau(UBound(Tableau)) = Cell
        End If
 
        'Tri le contenu du tableau par ordre croissant.
        For i = 1 To UBound(Tableau)
            For j = 1 To UBound(Tableau)
                If Tableau(i) < Tableau(j) Then
                    TempTab = Tableau(i)
                    Tableau(i) = Tableau(j)
                    Tableau(j) = TempTab
                End If
            Next j
        Next i
    Next Cell
 
    'Alimente le ComboBox
    ComboBox1.List = Tableau
 
End Sub
Créé le 2 octobre 2007  par SilkyRoad
Vba
Sélectionnez
Private Sub UserForm_Initialize()
    Dim Tableau As Variant
 
    Tableau = Range("A1:Z1").Value
    ComboBox1.Column() = Tableau
 
    'Autre possiblité
    'ComboBox1.List() = Application.Transpose(Tableau)
End Sub
Créé le 19 février 2008  par Ouskelnor

Utilisez la propriété DropDown dans l'évènement DblClick :

Vba
Sélectionnez
Private Sub ComboBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    ComboBox1.DropDown
End Sub
Créé le 26 mai 2008  par Emmanuel Tissot

Cet exemple permet de forcer un format de type 00/00:0000

Vba
Sélectionnez
Private Sub TextBox1_Change()
    Dim strFormat As String
    Dim x As Integer
 
    x = Len(TextBox1)
 
    strFormat = "##/##:####"
    strFormat = Left(strFormat, x)
 
    If Not TextBox1 Like strFormat Then _
        TextBox1 = Left(TextBox1, x - 1)
 
End Sub
Créé le 2 octobre 2007  par SilkyRoad

Le problème de la saisie d'une date dans un formulaire étant régulièrement posé je vous propose de le résoudre avec un module de classe autorisant plusieurs formats de saisie tout en intégrant des règles de validation et de mise en forme conditionnelle.

Les avantages de cette approche pour le développeur sont la souplesse et la facilité d'utilisation puisqu'il manipule non plus une valeur de type String mais directement une valeur de type Date. Pour l'utilisateur final le masque de saisie, l'infobulle et la mise en forme conditionnelle lui permettent d'identifier facilement ce qu'on attend de lui.

1 Fonctionnalités :

Les formats disponibles:
- Style européen(Jour Mois Année), anglais(Mois Jour Année) ou américain(Année Mois Jour)
- Affichage de l'année sur deux ou quatre chiffres
- Libre choix du séparateur parmi /-.,' et espace

Les règles de validation :
- Un intervalle de date programmable
- Valider la saisie des jours fériés
- Valider les jours de la semaine

Le format conditionnel:
- La couleur du texte et du fond peuvent être personnalisés selon l'état de la saisie.

Deux évènements permettent une interaction avec l'utilisateur final:
- Lorsque la valeur change
- Lorsque l'état change

Divers:
- L'infobulle du TextBox affiche le format attendu.
- Accepte le collage de valeur de type Date.
- Des fonctions intégrées permettent d'obtenir des informations supplémentaires tel que le numéro de semaine (norme ISO) ou le jour julien.

2 Limites: - Pas d'évènements Enter ou Exit.
- L'amplitude de l'intervalle est fixée à cent ans afin de permettre un affichage de l'année sur deux chiffres.
- L'année de base de l'intervalle est déterminée au moment de l'initialisation. Si elle n'est pas précisée elle est égale à l'année en cours - 70 arrondi a la dizaine inférieure (Soit actuellement 2008-70=1938, 1938->1930).
- Seuls les jours fériés en France sont pris en compte, pour les autres pays une petite adaptation serait donc nécessaire.

3 Compatibilité : - Excel 2000 et postérieur
- Testé avec Excel Xp et Excel 2003

Téléchargez la démo.

Créé le 20 septembre 2008  par Emmanuel Tissot

ListBox1.ListIndex = -1 est utilisé pour désélectionner une ligne de la ListBox ou pour vérifier si une ligne est sélectionnée.

ListBox1.ListIndex renvoie 0 si la 1ere ligne est sélectionnée.
ListBox1.ListIndex renvoie 1 si la deuxieme ligne est sélectionnée.
ListBox1.ListIndex renvoie 2 si la troisième ligne est sélectionnée.
etc.

ListBox1.ListIndex renvoie -1 si aucune ligne n'est sélectionnée.

Cette option peut par exemple être utilisée pour éviter les doublons lors de l'alimentation d'un ComboBox:
Cette procédure boucle sur les cellules de la colonne A.
Chaque donnée est placée dans la zone d'édition du contrôle.
Si la donnée n'existe pas encore dans la liste, la valeur -1 est renvoyée.
Dans ce cas on peut alimenter le ComboBox en utilisant la méthode AddItem.

Vba
Sélectionnez
Private Sub UserForm_Initialize()
    Dim j As Integer
 
    'Récupère les données de la colonne A...
    For j = 1 To Range("A65536").End(xlUp).Row
        ComboBox1 = Range("A" & j)
        '...et filtre les doublons
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem Range("A" & j)
    Next j
End Sub
Créé le 2 octobre 2007  par SilkyRoad

Il est possible d'indiquer les contrôles dans une fonction Array, puis de boucler sur les éléments du tableau :

Vba
Sélectionnez
Private Sub CommandButton1_Click()
    Dim Ctrl As Variant
    Dim j As Byte
 
    For Each Ctrl In Array(TextBox1, TextBox3, TextBox5)
        j = j + 1
        Ctrl.Object.Value = "Champ" & j
    Next
End Sub
Créé le 2 octobre 2007  par SilkyRoad

Les données sont dans les colonnes A à D, d'un onglet nommé "Base".
La procédure effectue un remplissage conditionnel des ComboBox en fonction de ce qui est sélectionné dans le contrôle précédent :
La sélection du ComboBox1 (données colonne A) définit le contenu du ComboBox2 (données colonne B), la sélection dans ComboBox2 définit le contenu du ComboBox3 (données colonne C) ?etc...

Vba
Sélectionnez
Option Explicit
 
Dim Ws As Worksheet
Dim NbLignes As Integer
 
 
Private Sub UserForm_Initialize()
    'Définit la feuille contenant les données
    Set Ws = Worksheets("Base")
    'Définit le nombre de lignes dans la colonne A
    NbLignes = Ws.Range("A65536").End(xlUp).Row
 
    'Remplissage du ComboBox1
    Alim_Combo 1
 
End Sub
 
 
Private Sub ComboBox1_Change()
    'Remplissage Combo2
    Alim_Combo 2, ComboBox1.Value
End Sub
 
 
Private Sub ComboBox2_Change()
    'Remplissage Combo3
    Alim_Combo 3, ComboBox2.Value
End Sub
 
 
Private Sub ComboBox3_Change()
    'Remplissage Combo4
    Alim_Combo 4, ComboBox3.Value
End Sub
 
 
 
'Procédure pour alimenter les ComboBox
Private Sub Alim_Combo(CbxIndex As Integer, Optional Cible As Variant)
    Dim j As Integer
    Dim Obj As Control
 
    'Définit le ComboBox à remplir
    Set Obj = Me.Controls("ComboBox" & CbxIndex)
    'Supprime les anciennes données
    Obj.Clear
 
    'alimente le Combobox initial (Combobox1)
    If CbxIndex = 1 Then
        'Boucle sur les lignes de la colonne A (à partir de la 2eme ligne)
        For j = 2 To NbLignes
            Obj = Ws.Range("A" & j)
            'Remplit le ComboBox sans doublons
            If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j)
        Next j
    Else
        'Alimentation conditionnelle des autres Combobox en fonction de
        'ce qui est sélectionnée dans le contrôle précédent :
        '(La sélection du ComboBox1 définit le contenu du ComboBox2,
        'La sélection du ComboBox2 définit le contenu du ComboBox3 ?etc...)
        For j = 2 To NbLignes
            If Ws.Range("A" & j).Offset(0, CbxIndex - 2) = Cible Then
                Obj = Ws.Range("A" & j).Offset(0, CbxIndex - 1)
                If Obj.ListIndex = -1 Then Obj.AddItem Ws.Range("A" & j).Offset(0, CbxIndex - 1)
            End If
        Next j
   End If
 
   'Enlève la sélection dans le ComboBox
   Obj.ListIndex = -1
End Sub

Téléchargez le classeur démo.

Créé le 2 octobre 2007  par SilkyRoad

La largeur de la ListBox et la largeur de chaque colonne s'ajustent en fonction du contenu des cellules à afficher dans l'UserForm.

Vba
Sélectionnez
Private Sub UserForm_Initialize()
    Dim Plage As Range
    Dim Largeur As String
    Dim i As Integer
 
    Set Plage = Range("A1:C10")
    Plage.Columns.AutoFit
 
    With ListBox1
        .Width = Plage.Width + 20
        .ColumnCount = Plage.Columns.Count
        .List() = Plage.Value
            For i = 1 To .ColumnCount
                Largeur = Largeur & Plage.Columns(i).Width & ";"
            Next
        .ColumnWidths = Largeur
    End With
 
End Sub
Créé le 5 décembre 2007  par SilkyRoad

Normalement, il n'y a que la propriété RowSource qui permet d'afficher des étiquette mais il est possible de tricher en plaçant des Labels au dessus de chaque colonne du contrôle ListBox.
Cet exemple redimensionne et repositionne la listbox afin d'ajouter des labels au dessus de chaque colonne. Vous pourrez bien entendu adapter la procédure en fonction de votre projet.

Vba
Sélectionnez
Option Explicit
Option Base 1
 
Private Sub UserForm_Initialize()
    Dim Plage As Range
    Dim Tableau As Variant
    Dim i As Integer
    Dim Lbl As Control
 
    'Plage de cellules contenant les données :
    'Le contenu de la première ligne (A1:C1) va servir d'en-tête.
    Set Plage = Range("A1:C10")
    Tableau = ScindePlage(Plage)
 
    With ListBox1
        .ColumnCount = UBound(Tableau, 2)
        'En option (à adapter)
        .Top = 20
        .Width = 92 * UBound(Tableau, 2)
        DoEvents
        .List() = Tableau
    End With
 
 
    For i = 1 To UBound(Tableau, 2)
        Set Lbl = Me.Controls.Add("Forms.Label.1")
        With Lbl
            .Left = ListBox1.Left + 7 + ((i - 1) * 92)
            .Top = ListBox1.Top - 10
            .Width = 92
            .Height = 10
            .Caption = Plage.Cells(1, i)
        End With
    Next i
 
End Sub
 
Function ScindePlage(Cible As Range) As Variant
    Dim Pl As Range
 
    Set Pl = Cible.Offset(1, 0).Resize(Cible.Rows.Count - 1)
    ScindePlage = Pl.Value
End Function
Créé le 19 février 2008  par SilkyRoad

Cet exemple crée une requête dans une table Access et importe le résultat dans une Listbox d'un UserForm.

Vba
Sélectionnez
Private Sub CommandButton1_Click()
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim i As Integer, N As Integer
Dim Fichier As String
Dim Tbl() As Variant
 
Fichier = "C:\Documents and Settings\mimi\dossier\dataBase.mdb"
 
Set Cn = New ADODB.Connection
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
    Fichier & ";"
Set Rs = New ADODB.Recordset
 
With Rs
    .ActiveConnection = Cn
    .Open "SELECT * FROM MaNouvelleTable" _
        , , adOpenStatic, adLockOptimistic, adCmdText
End With
 
ListBox1.Clear
ListBox1.ColumnCount = Rs.Fields.Count
 
ReDim Tbl(Rs.RecordCount - 1, Rs.Fields.Count)
 
Do While Not Rs.EOF
    For i = 0 To Rs.Fields.Count - 1
        If IsNull(Rs.Fields(i).Value) = True Then
            Tbl(N, i) = ""
            Else
            Tbl(N, i) = CStr(Rs.Fields(i).Value)
        End If
    Next i
 
    N = N + 1
    Rs.MoveNext
Loop
 
ListBox1.List() = Tbl
 
 
Rs.Close
Set Rs = Nothing
Cn.Close
Set Cn = Nothing
End Sub

si vous êtes sur que les enregistrements ne contiennent pas de valeurs nulles, vous pouvez également utiliser :

Vba
Sélectionnez
With Rs
    .ActiveConnection = Cn
    .Open "SELECT * FROM MaNouvelleTable" _
        , , adOpenStatic, adLockOptimistic, adCmdText
End With
Tbl = Rs.GetRows
 
 
With Me.ListBox1
    .Clear
    .ColumnCount = Rs.Fields.Count
    .List = Application.Transpose(Tbl)
    .ListIndex = -1
End With
Créé le 19 février 2009  par SilkyRoad

Vous utilisez habituellement la syntaxe NomObject.Font.Name ="Arial" pour définir une police classique.
Ajoutez Font.Charset pour valider les polices type Symbole (Wingdings, Webdings ...).

Vba
Sélectionnez
NomObject.Font.Name ="Wingdings"
NomObject.Font.Charset = 2
Créé le 19 février 2008  par SilkyRoad

Un exemple en utilisant la bibliothèque Windows Image Acquisition.
Les deux contrôles Images sont supposés de même dimension.

Vba
Sélectionnez
Option Explicit
Option Base 1
 
 
Private Declare Function OpenClipboard& Lib "user32" (ByVal hwnd As Long)
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function SetClipboardData& Lib "user32" (ByVal wFormat&, ByVal hMem&)
Private Declare Function CloseClipboard& Lib "user32" ()
Private Declare Function DestroyIcon& Lib "user32" (ByVal hIcon&)
 
 
Private Const ImgTemp1 As String = "C:\ImgTemp1.jpg"
Private Const ImgTemp2 As String = "C:\ImgTemp2.jpg"
 
 
 
Private Sub CommandButton1_Click()
    Dim iPic As StdPicture
    Dim hCopy&
    Dim Img As ImageFile
    Dim Tableau1 As Variant, Tableau2 As Variant
 
 
    'Place l'image dans le presse papier
    Set iPic = Me.Image1.Picture
    OpenClipboard 0&: EmptyClipboard
    hCopy = SetClipboardData(2, iPic.Handle)
    CloseClipboard
 
    'Enregistre l'image sur le disque dur
    If hCopy Then SavePicture iPic, ImgTemp1
    DestroyIcon iPic.Handle
 
    'Place l'image dans le presse papier
    Set iPic = Me.Image2.Picture
    OpenClipboard 0&: EmptyClipboard
    hCopy = SetClipboardData(2, iPic.Handle)
    CloseClipboard
 
    'Enregistre l'image sur le disque dur
    If hCopy Then SavePicture iPic, ImgTemp2
    DestroyIcon iPic.Handle
 
 
    Set Img = New ImageFile
    Img.LoadFile "C:\ImgTemp1.jpg"
    Tableau1 = Img.FileData.BinaryData
    Set Img = Nothing
 
    Set Img = New ImageFile
    Img.LoadFile "C:\ImgTemp2.jpg"
    Tableau2 = Img.FileData.BinaryData
    Set Img = Nothing
 
    MsgBox "Identiques: " & TableauxIdentiques(Tableau1, Tableau2)
 
    Kill ImgTemp1
    Kill ImgTemp2
End Sub
 
 
 
Function TableauxIdentiques(Tab1, Tab2) As Boolean
    Dim i As Double
 
    If UBound(Tab1) <> UBound(Tab2) Then
            TableauxIdentiques = False
            Exit Function
        Else
            For i = 1 To UBound(Tab1)
                If Tab1(i) <> Tab2(i) Then
                    TableauxIdentiques = False
                    Exit Function
                End If
            Next i
    End If
 
    TableauxIdentiques = True
End Function
Créé le 19 février 2008  par SilkyRoad

Pour vous simplifier la tâche et pour éviter de créer x fois la même macro, passez par un module de classe afin d'attribuer une même procédure à plusieurs contrôles de même type.

Par exemple, créez un UserForm et ajoutez y plusieurs contrôles Images.
Le code suivant permet ensuite d'identifier quel contrôle Image a été cliqué :

Vba
Sélectionnez
'--------------------------------------
'à placer dans le module objet du UserForm
Option Explicit
 
Private Sub UserForm_Initialize()
    Dim Obj As Control
    Dim Cl As Classe1
 
    Set Collect = New Collection
 
    'boucle sur les objets du UserForm
    For Each Obj In Me.Controls
        'verifie s'il s'agit d'un controle Image
        If TypeOf Obj Is MSForms.Image Then
            Set Cl = New Classe1
            Set Cl.Img = Obj
            Collect.Add Cl
        End If
    Next Obj
End Sub
'--------------------------------------
Vba
Sélectionnez
'--------------------------------------
'dans un module de classe nommé "Classe1"
Option Explicit
 
Public WithEvents Img As MSForms.Image
 
'exemple pour gérer l'evenement clic de l'objet Image
Private Sub Img_Click()
    MsgBox Img.Name
End Sub
'--------------------------------------
Vba
Sélectionnez
'--------------------------------------
'dans un module standard
Option Explicit
 
Public Collect As Collection
'--------------------------------------
Créé le 26 mai 2008  par SilkyRoad

Lorsque vous cochez un élément du TreeView, tous les éléments enfants sont également cochés grâce à cette procédure.

Vba
Sélectionnez
Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node) 
    CocheDecoche Node.Child, Node.Children, Node.Checked 
End Sub 
 
 
Private Sub CocheDecoche(Noeud As MSComctlLib.Node, _ 
        NbEnfants As Integer, boolNd As Boolean) 
    Dim i As Integer 
    Dim xNoeud As Node 
 
    If NbEnfants = 0 Then Exit Sub 
    Set xNoeud = Noeud 
 
    For i = 1 To NbEnfants 
        If xNoeud.Children > 0 Then _ 
            CocheDecoche xNoeud.Child, xNoeud.Children, boolNd 
 
        xNoeud.Checked = boolNd 
        If i < NbEnfants Then Set xNoeud = xNoeud.Next 
    Next 
 
End Sub
Créé le 26 mai 2008  par SilkyRoad

Dans un module standard :

Vba
Sélectionnez
Option Explicit
 
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As _
    Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
 
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd _
    As Long, ByVal nIndex As Long) As Long
 
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd _
    As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Dans le module objet du userform :

Vba
Sélectionnez
Option Explicit
 
'Source :
'http://www.devx.com/vb2themax/Tip/19099
'
 
Const GWL_STYLE = -16&
Const TVM_SETBKCOLOR = 4381&
Const TVS_HASLINES = 2&
 
 
Private Sub UserForm_Activate()
    SetTreeViewBackColor TreeView1, RGB(255, 0, 0)
End Sub
 
 
Sub SetTreeViewBackColor(TV As TreeView, ByVal BackColor As Long)
    Dim lStyle As Long
    Dim TVNode As Node
 
    ' set the BackColor for every node
    For Each TVNode In TV.Nodes
        TVNode.BackColor = BackColor
    Next
 
    ' set the BackColor for the TreeView's window
    SendMessage TV.hwnd, TVM_SETBKCOLOR, 0, ByVal BackColor
    ' get the current style
    lStyle = GetWindowLong(TV.hwnd, GWL_STYLE)
    ' temporary hide lines
    SetWindowLong TV.hwnd, GWL_STYLE, lStyle And (Not TVS_HASLINES)
    ' redraw lines
    SetWindowLong TV.hwnd, GWL_STYLE, lStyle
End Sub
Créé le 26 mai 2008  par Kiki29

Dans cet exemple l'userform contient deux contrôles nommés ListView1 et ListView2.
La procédure permet d'effectuer un Glisser Déposer (Drag and Drop) du ListView1 vers le ListView2.

Vba
Sélectionnez
Option Explicit 
 
Private objDrag As Object 
Private boolDrag As Boolean 
 
 
Private Sub UserForm_Initialize() 
 
    '----- remplissage ListView------------------------ 
    With ListView1 
        'Définit le nombre de colonnes et Entêtes 
        With .ColumnHeaders 
            'Supprime les anciens entêtes 
            .Clear 
            'Ajoute 1 colonne en spécifiant le nom de l'entête 
            'et la largeur de la colonne 
            .Add , , "Nom", 80 
        End With 
 
        'Remplissage de la 1ere colonne (création de 3 lignes) 
        With .ListItems 
           .Add , , "Riri" 
           .Add , , "Fifi" 
           .Add , , "Loulou" 
         End With 
 
        'Spécifie l'affichage 
        .View = lvwReport 
        '.OLEDragMode = ccOLEDragAutomatic 
    End With 
    '-------------------------------------------------- 
 
 
    With ListView2.ColumnHeaders 
        'Supprime les anciens entêtes 
        .Clear 
        'Ajoute 1 colonne en spécifiant le nom de l'entête 
        'et la largeur de la colonne 
        .Add , , "Nom", 80 
    End With 
 
    ListView2.View = lvwReport 
    'ListView2.OLEDragMode = ccOLEDragAutomatic 
 
End Sub 
 
 
Private Sub ListView1_MouseDown(ByVal Button As Integer, _ 
    ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, _ 
    ByVal y As stdole.OLE_YPOS_PIXELS) 
 
    'Si le bouton de gauche est cliqué 
    If Button = 1 Then boolDrag = True 
End Sub 
 
 
Private Sub ListView1_MouseMove(ByVal Button As Integer, _ 
    ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, _ 
    ByVal y As stdole.OLE_YPOS_PIXELS) 
 
     If Button = 1 And boolDrag Then 
          ListView1.OLEDrag 
          ListView1.MousePointer = ccSize 
          Set objDrag = ListView1.SelectedItem 
     End If 
 
End Sub 
 
 
Private Sub ListView2_MouseMove(ByVal Button As Integer, _ 
    ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, _ 
    ByVal y As stdole.OLE_YPOS_PIXELS) 
 
    If boolDrag And Not objDrag Is Nothing Then 
        'Ajoute un élément de ListView1 vers ListView2 
        ListView2.ListItems.Add , , objDrag.Text 
        boolDrag = False 
 
        ListView1.MousePointer = ccDefault 
        'Supprime l'élément dans la ListView1 
        ListView1.ListItems.Remove (ListView1.SelectedItem.Index) 
 
        'Désélectionne l'élément dans la listView1 
       If ListView1.ListItems.Count > 0 Then 
            ListView1.ListItems(1).Selected = False 
            Set ListView1.SelectedItem = Nothing 
       End If 
    End If 
End Sub
Créé le 20 septembre 2008  par SilkyRoad

Vous devez pour cela disposer de l'ocx MSCOMCT2.OCX.
S'il n'existe pas sur votre PC, vous pouvez le récupérer sur le site de Microsoft :

Téléchargez le fichier.
Décompressez le fichier cab.
Placez le ficher MSCOMCT2.OCX dans le répertoire C:\windows\System32
puis utilisez le menu Démarrer/Exécuter.
Saisissez ou collez: regsvr32 c:\windows\System32\MSCOMCT2.OCX
Cliquez sur le bouton Ok
Le Message "DllRegisterServer dans c:\windows\System32\MSCOMCT2.OCX réussi" confirme l'installation correcte du composant.
Sous VBE Excel [Alt+F11], pour l'ajouter dans la Boite à outils :
Créez un UserForm
Menu Affichage/Boite à outils
Clic Droit sur Boite à outils ou Menu Outils/Contrôles supplémentaires
Cochez "Microsoft MonthView Control version 6.0 (SP6)" et/ou "Microsoft Date and Time Picker Control 6.0 (SP6)"
Cliquez sur le bouton OK pour valider.

Créé le 20 septembre 2008  par JackOuYA, Kiki29

Elle permet d'attribuer un état Null (Le contrôle apparaitra en grisé), si vous indiquez la valeur TripleState = True.

Vba
Sélectionnez
Option Explicit
 
Private Sub UserForm_Initialize()
    CheckBox1.TripleState = True
    CheckBox1.Value = Null
End Sub
 
 
Private Sub CheckBox1_Change()
    If IsNull(CheckBox1.Value) Then
        CheckBox1.Caption = "Null"
    ElseIf CheckBox1.Value = False Then
        CheckBox1.Caption = "False"
    ElseIf CheckBox1.Value = True Then
        CheckBox1.Caption = "True"
    End If
End Sub
 
 
Private Sub CheckBox1_Click()
    'La valeur Nulle ne génère par cet événement.
    MsgBox CheckBox1.Value
End Sub
Créé le 20 septembre 2008  par SilkyRoad

Vous pouvez utiliser les FaceId comme image dans vos UserForm. L'avantage réside dans le stockage de ces icônes dans l'application et ne nécessite donc pas de gestion particulière des images lorsque vous transférez le classeur sur d'autres postes utilisateurs.
L'inconvénient : une dimension trop importante du conteneur (un contrôle Image par exemple) nuit à la qualité d'affichage.

La procédure suivante affiche un FaceID dans un contrôle Image, nommé Image1.

Vba
Sélectionnez
Private Sub UserForm_Initialize()
    Dim Cmb As CommandBarControl
    Dim cBar As CommandBar
 
    Set cBar = CommandBars.Add(Position:=msoBarFloating, MenuBar:=False, Temporary:=True)
    Set Cmb = cBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
 
    '964 = point d'exclamation
    Cmb.FaceId = 964
 
    Image1.PictureSizeMode = fmPictureSizeModeStretch
    Image1.Picture = Cmb.Picture
 
    cBar.Delete
End Sub

Consultez la liste des FaceId.

Créé le 19 février 2009  par SilkyRoad

Pour compenser cette anomalie qui survient parfois, activez l'éditeur de macros :
Menu Affichage.
Barres d'outils.
Personnaliser.
Sélectionnez l'onglet Commandes.
Cliquez sur la catégorie "Outils" (colonne de gauche).

Si vous voyez "Contrôles supplémentaires" dans la liste des commandes (colonne de droite), faites un clic gauche sur la ligne "Contrôles supplémentaires" et gardez enfoncée la touche (l'icône de la souris change de forme).
Faites glisser la souris jusque dans la barre de menus de l'éditeur de macros.

Désormais la transaction "Contrôles supplémentaires" est disponible depuis la barre de menu VBE (la boîte à outils doit être préalablement affichée).

Créé le 19 février 2009  par SilkyRoad

Voici un exemple d'auto-complétion sur un textbox, à placer dans le module de code du formulaire.
L'UserForm doit contenir un textbox nommé txtInput.

Vba
Sélectionnez
' rentrez ici la plage des données en autocomplétion
Private Const r As String = "A1:A11"
Private sInput As String
' variable de blocage de la procédure Change
Dim blnStop As Boolean
 
 
Private Sub txtInput_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
' gestion des touches d'effacement
    If (KeyCode = vbKeyBack) Or (KeyCode = vbKeyDelete) Then
        blnStop = True
    Else
        blnStop = False
    End If
 
End Sub
 
 
Private Sub txtInput_Change()
    Dim sWord As String
 
    If blnStop Then
        blnStop = False
    Else
        sInput = Left(Me.txtInput, Me.txtInput.SelStart)
        sWord = GetFirstCloserWord(sInput)
        If sWord &amp;amp;amp; "" <> "" Then
            blnStop = True
            Me.txtInput.Text = sWord
            Me.txtInput.SelStart = Len(sInput)
            Me.txtInput.SelLength = 999999
        End If
    End If
 
End Sub
 
 
Private Function GetFirstCloserWord(ByVal Word As String) As String
 
    Dim c As Range
    For Each c In ActiveSheet.Range(r).Cells
        If c.Value Like Word & "*" Then
            GetFirstCloserWord = c.Value
            Exit Function
        End If
    Next c
    Set c = Nothing
 
End Function

Vous pouvez modifier une ligne dans la fonction GetFirstCloserWord pour rendre la procédure insensible à la casse.

Vba
Sélectionnez
If LCase(c.Value) Like LCase(Word & "*") Then
Créé le 19 février 2009  par Cafeine, Fred65200

Placez ce code dans un UserForm contenant 3 TextBox et un CommandButton.
La variable tableau 'TextboxArray' récupère les contrôles TextBox lors de l'initialisation du UserForm :

Vba
Sélectionnez
Option Explicit
 
Dim TextboxArray(1 To 3) As msforms.TextBox
 
Private Sub UserForm_Initialize()
    Set TextboxArray(1) = UserForm1.TextBox1
    Set TextboxArray(2) = UserForm1.TextBox2
    Set TextboxArray(3) = UserForm1.TextBox3
End Sub
 
Private Sub CommandButton1_Click()
    MsgBox TextboxArray(1).Value
End Sub
Créé le 22 mars 2009  par SilkyRoad

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.