
| 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 |
Option Explicit
Public Collect As Collection
|
Vba |
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
For i = 0 To maPageHtml. images . Length - 1
Set imgHtml = maPageHtml. images . Item (i)
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)
Set Collect = Nothing
Set maPageHtml = Nothing
End Sub
Private Sub WebBrowser1_NewWindow2 (ppDisp As Object, Cancel As Boolean)
Cancel = True
End Sub
|
Vba |
Option Explicit
Public WithEvents Img As MSHTML. HTMLImg
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
|
|
| auteur : SilkyRoad | Vba |
Private Sub UserForm_Initialize ()
Dim AjoutFonction As String
Dim Fichier As String
Fichier = " http://vb.developpez.com/cours/images/cours_vb.gif "
WebBrowser1. Navigate " about:<html><body></body></html> "
AjoutFonction = " <html><body><B>Bienvenue sur cette page.</B> " & vbCrLf
AjoutFonction = AjoutFonction & " <BODY background=' " & Fichier & " '</BODY> "
AjoutFonction = AjoutFonction & " <FORM> " & _
" <INPUT type=button name='Bouton1' value='Cliquez ici.' " & _
" onClick=(alert('Bonjour!'))></FORM> "
AjoutFonction = _
AjoutFonction & " <script language= " " javascript " " > " & vbCrLf
AjoutFonction = AjoutFonction & " function maFonction(){ " & vbCrLf
AjoutFonction = AjoutFonction & " alert( " " Coucou " " ); " & vbCrLf
AjoutFonction = AjoutFonction & " } " & vbCrLf
AjoutFonction = AjoutFonction & " </script></body></html> "
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 ()
Dim s As String
Dim maPageHtml As HTMLDocument
Set maPageHtml = WebBrowser1. Document
maPageHtml. parentWindow . execScript " maFonction(); " , " javascript "
End Sub
|
Utilisez la synthaxe suivante si la fonction JavaScript contient des arguments:
Vba |
Private Sub CommandButton1_Click ()
Dim s As String
Dim maPageHtml As MSHTML. HTMLDocument
Set maPageHtml = WebBrowser1. Document
maPageHtml. parentWindow . execScript _
" ChangeBackGround('http://NomDuSite.com/NouvelleImage.gif'); " , " javascript "
End Sub
|
|
| auteur : SilkyRoad |
Un exemple en utilisant un WebBrowser ("Navigateur Web Microsoft" dans la liste des contrôles supplémentaires).
Vba |
Option Explicit
Private Sub UserForm_Initialize ()
ParametresHtml " Le forum DVP: Un texte qui défile. " , " #000099 "
End Sub
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
|
|
| 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 ()
Dim Cn As ADODB. Connection
Dim Rs As ADODB. Recordset
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
Rs. Open " SELECT * FROM [Feuil1$] " , Cn, adOpenKeyset , adLockOptimistic
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 "
. ConnectionString = " Driver={Microsoft Excel Driver (*.xls)}; " & _
" DBQ= " & ThisWorkbook. FullName & " ; ReadOnly=False; "
. Open
End With
Set Rs = New ADODB. Recordset
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
|
| 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 |
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 |
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 "
|
|
| auteur : SilkyRoad |
Cet exemple ajoute 5 Textbox dans un Frame nommé Frame1:
Vba |
Dim i As Integer
Dim TxtB As Control
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
|
|
| 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 )
For Each Cell In Worksheets (" Feuil1 " ). Range (" A1:A " & _
Worksheets (" Feuil1 " ). Range (" A65536 " ). End (xlUp). Row )
boolVerif = False
For i = 1 To UBound (Tableau)
If Tableau (i) = Cell Then
boolVerif = True
Exit For
End If
Next i
If boolVerif = False Then
ReDim Preserve Tableau (1 To UBound (Tableau) + 1 )
Tableau (UBound (Tableau)) = Cell
End If
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
ComboBox1. List = Tableau
End Sub
|
|
| auteur : Ouskelnor | Vba |
Private Sub UserForm_Initialize ()
Dim Tableau As Variant
Tableau = Range (" A1:Z1 " ). Value
ComboBox1. Column () = Tableau
End Sub
|
|
| 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
|
|
| 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
For j = 1 To Range (" A65536 " ). End (xlUp). Row
ComboBox1 = Range (" A " & j)
If ComboBox1. ListIndex = - 1 Then ComboBox1. AddItem Range (" A " & j)
Next j
End Sub
|
|
| 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
|
|
| 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 ()
Set Ws = Worksheets (" Base " )
NbLignes = Ws. Range (" A65536 " ). End (xlUp). Row
Alim_Combo 1
End Sub
Private Sub ComboBox1_Change ()
Alim_Combo 2 , ComboBox1. Value
End Sub
Private Sub ComboBox2_Change ()
Alim_Combo 3 , ComboBox2. Value
End Sub
Private Sub ComboBox3_Change ()
Alim_Combo 4 , ComboBox3. Value
End Sub
Private Sub Alim_Combo (CbxIndex As Integer, Optional Cible As Variant)
Dim j As Integer
Dim Obj As Control
Set Obj = Me. Controls (" ComboBox " & CbxIndex)
Obj. Clear
If CbxIndex = 1 Then
For j = 2 To NbLignes
Obj = Ws. Range (" A " & j)
If Obj. ListIndex = - 1 Then Obj. AddItem Ws. Range (" A " & j)
Next j
Else
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
Obj. ListIndex = - 1
End Sub
|
|
| 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
|
|
| 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
Set Plage = Range (" A1:C10 " )
Tableau = ScindePlage (Plage)
With ListBox1
. ColumnCount = UBound (Tableau, 2 )
. 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
|
|
| 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
|
|
| auteur : SilkyRoad | 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
Set iPic = Me. Image1 . Picture
OpenClipboard 0 & : EmptyClipboard
hCopy = SetClipboardData (2 , iPic. Handle )
CloseClipboard
If hCopy Then SavePicture iPic, ImgTemp1
DestroyIcon iPic. Handle
Set iPic = Me. Image2 . Picture
OpenClipboard 0 & : EmptyClipboard
hCopy = SetClipboardData (2 , iPic. Handle )
CloseClipboard
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
|
|
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.
|