Accueil
Accueil Le Club Delphi Kylix C C++ Java J2EE DotNET & C# Visual Basic Access Pascal Dev Web PHP ASP XML UML SQLSGBD Windows Linux Autres
logo
Sommaire > Les macros VBA > Les UserForm et les contrôles > Les contrôles
        Comment utiliser les contrôles dans les UserForm ?
        Comment gérer les évènements dans un WebBrowser ?
        Comment créer une page html dynamiquement dans un WebBrowser et y ajouter une fonction JavaScript ?
        Comment faire défiler un texte dans un UserForm ?
        Comment visualiser un graphique dans un UserForm ?
        Comment afficher le contenu d'une feuille de calcul dans un DataGrid ?
        Comment utiliser l'objet OWC PivotTable dans un UserForm Excel ?
        Comment rendre un Frame transparent afin de voir l'image située en arrière plan ?
        Comment sauvegarder les paramètres des contrôles ?
        Comment ajouter des contrôles dynamiquement dans un Frame ?
        Comment remplir une ComboBox sans doublon et trié par ordre croissant ?
        Comment alimenter rapidement une ComboBox à partir de données contenues sur une ligne de la feuille de calcul ?
        Comment contrôler un format personnalisé lors de la saisie dans un TextBox ?
        A quoi correspond la valeur -1 de la propriété ListIndex, pour les ComboBox et ListBox ?
        Comment créer une boucle directement sur quelques contrôles prédéfinis ?
        Comment alimenter des ComboBox de manière conditionnelle et en cascade ?
        Comment adapter automatiquement les colonnes d'une ListBox au contenu d'une plage de cellules ?
        Comment forcer l'affichage d'un en-tête pour une listBox alimentée à partir de la propriété List() ou AddItem ?
        Comment spécifier des polices type Symbole par macro ?
        Comment vérifier si le contenu de deux contrôles Image sont identiques ?

precedent    sommaire    suivant   


Comment gérer les évènements dans un WebBrowser ?
auteur : SilkyRoad
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

'--------------------------------------
'A placer dans un module standard
Option Explicit
  
Public Collect As Collection
'--------------------------------------
Vba

'--- 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

'--------------------------------------
'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
'--------------------------------------

Comment créer une page html dynamiquement dans un WebBrowser et y ajouter une fonction JavaScript ?
auteur : SilkyRoad
Vba

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 = "http://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

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

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

Comment faire défiler un texte dans un UserForm ?
auteur : SilkyRoad
Un exemple en utilisant un WebBrowser ("Navigateur Web Microsoft" dans la liste des contrôles supplémentaires).

Vba

' --- 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

'---

Comment visualiser un graphique dans un UserForm ?
auteur : SilkyRoad
Voici trois possibilités:

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

Vba

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.

Téléchargez la démo


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

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.



Comment afficher le contenu d'une feuille de calcul dans un DataGrid ?
auteur : 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.




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

Vba

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

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
lien : Consultez le tutoriel pour lire et écrire dans des classeurs fermés

Comment sauvegarder les paramètres des contrôles ?
auteur : SilkyRoad
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
 
'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

'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

DeleteSetting "Mes parametres", "TextBox2"			




Comment ajouter des contrôles dynamiquement dans un Frame ?
auteur : SilkyRoad
Cet exemple ajoute 5 Textbox dans un Frame nommé Frame1:

Vba

    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

Comment remplir une ComboBox sans doublon et trié par ordre croissant ?
auteur : SilkyRoad
Cette syntaxe fonctionne aussi pour les ListBox.

Vba

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

Comment alimenter rapidement une ComboBox à partir de données contenues sur une ligne de la feuille de calcul ?
auteur : Ouskelnor
Vba

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

Comment contrôler un format personnalisé lors de la saisie dans un TextBox ?
auteur : SilkyRoad
Cet exemple permet de forcer un format de type 00/00:0000

Vba

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

A quoi correspond la valeur -1 de la propriété ListIndex, pour les ComboBox et ListBox ?
auteur : SilkyRoad
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

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

Comment créer une boucle directement sur quelques contrôles prédéfinis ?
auteur : SilkyRoad
Il est possible d'indiquer les contrôles dans une fonction Array, puis de boucler sur les éléments du tableau:

Vba

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

Comment alimenter des ComboBox de manière conditionnelle et en cascade ?
auteur : 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

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


Comment adapter automatiquement les colonnes d'une ListBox au contenu d'une plage de cellules ?
auteur : 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

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

Comment forcer l'affichage d'un en-tête pour une listBox alimentée à partir de la propriété List() ou AddItem ?
auteur : 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

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

Comment spécifier des polices type Symbole par macro ?
auteur : 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
 
NomObject.Font.Name ="Wingdings"
NomObject.Font.Charset = 2

Comment vérifier si le contenu de deux contrôles Image sont identiques ?
auteur : SilkyRoad
Un exemple en utilisant la bibliothèque Windows Image Acquisition.
Les deux contrôles Images sont supposés de même dimension.

Vba

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

precedent    sommaire    suivant   

Consultez les autres F.A.Q's


Les sources présentés sur cette pages sont libre de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2008  Developpez LLC. Tout droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérets. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com