Introduction complet à la Programmation Visual basic


Télécharger Introduction complet à la Programmation Visual basic

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


Introduction complet à la Programmation Visual basic

...

Les Form ou feuilles

‰ ControlBox False cache les contrôles (de fermeture, agrandissement ...) de la feuille

(Form)

‰ Sub Form_load est utilisé pour le code avant chargement de la feuille.

‰ WindowStade => Maximized affiche la feuille plein écran

‰ caption = texte qui sera affiché dans la barre des titres.

Les TextBox

Propriétés modifiables non (?) dans le code :  

‰ Multiline => True, pour afficher les sauts de lignes

‰ ScrollBars (0 - none => aucunes ; 1 - Horizontal ; 2 - Vertical ; 3 - Both => les 2),

pour les ascenseurs

Propriétés modifiables dans le code :

SelStart sélection position début

‰ .SelLen sélection longueur

Combo/List Box

ListBox

Il existe des objets similaire : DriveListBox, DirListBox, FileListBox Evènements (le focus : l'objet est en court, sélectionné) :

_KeyPress

appuie d'1 touche lorsque l'utilisateur enfonce (_KeyDown) ou relâche (_KeyUp) une touche

tandis qu'un objet à le L'objet reçoit _GoFocus ou pert (_LostFocus) le focus _DropDown la liste va se dérouler _Change

focus.

_Validate(KeepFocus As Boolean)

...

Note :

on peut tester si .Listlndex <> -1 pour savoir s'il y a un élément sélectionné (au lieu de .selected(index)). De même on peut mettre .Listlndex = -1 au lieu .selected(index) = False . Cela, bien sûr n'est pas tout à fait valable en cas de multi-sélection.

.ItemData (long) = associe un tableau de nombres au tableau list (espèce de fichier index). Ex:

Lst.AddItem "Lucie Gombaud" prénom & nom

Lst.ItemData(Lst.NewIndex) = 42 310 matricule

Remarque :

  • pour trier, vous pouvez affectez la valeur True à la propriété Sorted du contrôle ListBox (ne fonctionne qu'à l'initialisation de la feuille).
  • si on affecte la valeur True à la propriété Sorted du contrôle ListBox, cela la trie (ne fonctionne pas dans le code même en form_load). Il faut parfois actualiser (F5).

ComboBox

Même propriétés et évènements que les ListBox, plus quelques uns spécifique : Style => DropDown List

Valeur des touches clavier  

vbKeyBack = Touche RET.ARR (8) vbKeyReturn = Touche ENTRÉE (13)

 l'aide VB "Constantes de code de touches".

Les Tableaux

ex : Dim Tbl(100) As Integer Redim

Déclarer le tableau sans taille Dim Tbl() As Integer, faire un redim de l'estimé Redim Tbl(100),

puis un redim après comptage Redim Tbl(x)

Dim Rep As string * 1

Les Variables

...

Option Explicit

Cette ligne en début de programme vous obligera à déclarer vos variables avant de les utiliser.

Vous pouvez généraliser cela pour tous vos programmes automatiquement :

Outils/Options/Editeur cocher "Déclaration des variables obligatoire" (dans Paramètres du code)

Un petit truc pour formater une ligne : Right(" " + Str(zone_ de_3_chif fres), 3) A quoi çà sert, ben, pour sauvegard er/charger des nombres à partir d'un fichier texte.

Toujours pas compris ? Vous voulez gérer le nombre de billes des élèves d'une classe sans passer par un base de donnée. Donc vous avez : Paul 10 billes, Jacques 5....

Mais, vous ne pouvez pas sauvegarder additionner du texte ni avoir un texte+zone numérique dans le fichier.

Donc vous faites un fichier texte du style 25 caractères pour le prénom + 3 caractères pour le nombre de billes. Puis en jouant avec les Val et Str, les Mid, vous avez tout.

...

Contrôle de saisie  

Il existe un composant qui peut créer des masque de saisie (Miscrosoft Masked Edit Control). Il fonction un peu comme une TextBox avec des propriétés supplémentaires (Format, Mask, MaxLength, PromptChar...)

MsgBox

MsgBox(prompt[, buttons] [, title] [, helpfile, context])

Dim rep

rep = MsgBox("Fin d'application", vbOKOnly + vbExclamation) rep = MsgBox("Fin d'application", 48) idem ci-dessus prompt Expression de chaîne affichée comme message dans la boîte de dialogue. La longueur maximale de l'argument prompt est d'environ 1 024 caractères selon la largeur des caractères utilisés. Si l'argument prompt occupe plus d'une ligne, n'oubliez pas d'insérer un retour chariot (Chr(13)) ou un saut de ligne (Chr(10)) entre les lignes, ou une combinaison de caractères retour chariot-saut de ligne (Chr(13) & Chr(10)).

buttons Facultatif.Expression numérique qui représente la somme des valeurs indiquant le nombre et le type de boutons à afficher, le style d'icône à utiliser, l'identité du bouton par défaut, ainsi que la modalité du message. Si l'argument buttons est omis, sa valeur par défaut est 0.

title Facultatif. Expression de chaîne affichée dans la barre de titre de la boîte de dialogue. Si l'argument title est omis, le nom de l'application est placé dans la barre de titre.

Valeurs buttons Valeurs renvoyées

Fichier Texte

Lecture d'un fichier texte

Texte entier mis dans la variable Texte : Dim CheminFichier' Texte As String Dim a As Long

CheminFichier = "c:\Autoexec.bat"

a = FreeFile() pour obtenir le No de fichier disponible

.pen CheminFichier For Input As #a

Texte = Input(L.F(a)' a) Close #a

Lecture ligne par ligne et mis dans le tableau iteme() :

Dim lg As String fichier à ouvrir

Dim x As Integer compteur

Dim iteme() As String tableau

x = 1

lg = ""

Open "h:\mes documents\item\ListInvent.txt" For Input As # 1

Line Input #1' lg

Do While Not EOF(1)

Line Input #1' lg

x = x + 1

Loop

Close #1

Redim iteme(x) on pourrait mettre (x -1) mais en cas de fichier

vide ?

A la place du nom du fichier avec son chemin, on peut mettre une variable.

La procédure ci-dessus compte et dimensionne un tableau (dans le but de le remplir). Cela évite d'allouer trop de mémoire à un tableau (ou pas assez ) si on n'en connaît pas trop le nb d'éléments .

Fichier à accès direct

Mettre dans un module (au début, après option explicit)

Type EnrItem

Num As String * 5

Lib As String * 40

End Type

Puis dans la feuille

Dim Item As EnrItem

Open "ItemFich.txt" For Random Access Write As # 1

Put #1' num_enr' Item écrit

..

Get #1' [num_enr]' Item Se positionne et lit

..

Seek #1 num_enr Se positionne

Pour les fichiers binaires :

Open "ItemFich.txt" For Binary Access Write As # 1

Get #1' [No_octet]' variable

ou

Seek #1' No_enr

x = Input$(1'8)

...

Put #1' No_enr' variable

Les Boucles

Do

...

[Exit Do] ... Do Vhile condition ...

[Exit Do] Do Until condition ...

[Exit Do] Do

...

[Exit Do] ... ~hile condition ...

vend

Loop ... ... Loop Until

 Loop Loop condition

CommandButton

Vous pouvez remplacer le texte par une image :

~ Le nom externe (= Caption) peut être effacé. ~ Propriété Picture choisir l'image

~ Propriété Style choisir 1 - Graphical

Option Bouton

  Sur une feuille, les boutons d'option constituent un seul groupe. Pour créer des groupes de boutons d'option, vous devez les placer dans des contrôles Frame ou PictureBox. Ainsi, ils peuvent être sélectionnés et déplacés comme une seule unité (maintenez enfoncée la touche CTRL pendant que vous dessinez un cadre autour).

Exemple: Private Sub NomProcedure_Click(Index As Integer)

Select Case Index

Case Is = 1

~~~

Case Is = 2

~~~

End Select

Création de touches de raccourci. Vous pouvez utiliser la propriété Caption pour créer des touches d'accès rapide pour vos boutons d'option en ajoutant le signe & devant la lettre que vous souhaitez utiliser comme touche d'accès rapide.

Ex : If Optionl(0).Value = True Then Label5.Caption = ~~~

Afficher une aide simple  

Vous pouvez créer une autre feuille et y créer des boîtes Label et un bouton (CommandButton) pour sortir.

Mais si vous avez plusieurs lignes de commentaires, cela est un peu tristounet.

Vous avez la possibilité de créer un fichier .RTF avec les avantages qu'il procure (police, couleurs ...)

 Créer un fichier .HLP (voir Help WorkShop) puis, au début de votre feuille sous Option Explicit créez la ligne suivante :

Private Declare Function WinHelp% Lib "user32" Alias "WinHelpA" _

(ByVal hwnd&' ByVal HelpFile$' ByVal wCommand%' dwData As Any)

Et dans le Sub concerné ce qui suit:

Dim nRet

If Len(App.HelpFile) = 0 Then

MsgBox "Impossible d'affichiez le sommaire de l'aide. Il n 'y a pas d'aide associée à ce projet."' vbInformation' Me.Caption

Else

.n Error Resume Next

nRet = WinHelp(Me.hwnd' App.HelpFile' 3' 0)

If Err Then

MsgBox Err.Description

End If

End If

Dans l'Explorateur de projets (Menu/Affichage/Explorateur de projets, s'il n'est pas affiché), clic droit le le projet en court, Propriété, mettez le chemin+nom de votre fichier .HLP.

Ne me demandez pas plus d'explications, je n'ai pas très bien compris, mais çà marche.

...

Les boites de dialogues communes

Les boites de dialogues communes Il existe 5 boîtes de dialogue communes en Visual Basic :

  • d'ouverture
  • d'enregistrement
  • de couleur
  • de police de caractères
  • d'impression

Pour cela il faut d'abord ajouter le contrôle CommonDialog dans votre boîte à outils (clic droit sur boite à outil, composants, cochez la case du contrôle Microsoft Common Dialog Control 6.0 (SP3) puis Appliquer).

  1. La boîte de dialogue Ouvrir

Cet la boîte de dialogue "Ouvrir" standard de Windows. On fait appel à la méthode

ShowOpen. Cependant, il est aussi nécessaire de renseigner plusieurs propriétés de la boîte de dialogue :

Propriété Utilisation

CancelError ~nitialisée à True, elle renvoie le code d'erreur 32755 (CDERR~CANCEL) lorsque le bouton Annuler a été pressé.

DefaultExt définit l'extension par défaut du nom du fichier à ouvrir.

DialogTitle définit le titre de la boîte de dialogue situé sur la barre de titre.

FileName définit le chemin d'accès et le nom du fichier sélectionné par défaut.

Filter définit le(s) filtre(s) qui sert à spécifier quel type de fichier pouvant être ouvert en lecture. Par exemple, avec l'instruction " CMD.Filter =" DLL (*.DLL)*.DLLIExécutables (*.EXE)j*.EXEITous (*.*)J*.*1 ", vous pouvez choisir de n'ouvrir que les fichiers DLL ou Exécutables ou bien d'ouvrir tous les fichiers.

FilterIndex spécifie le filtre à utiliser par défaut dans la boîte de dialogue. Reprenons l'instruction précédente : avec l'instruction suivante "CMD.Filterindex = 2", le filtre utilisé par défaut sera donc Exécutables (*.EXE)I*.EXEI.

Flags définit les options de la boîte de dialogue. La syntaxe de l'instruction est : "Objet.Flags = valeur" où "valeur" peut valoir "&HI&", "&H2&", "&H3&" ou bien "&H2& + &HI&".

InitDir définit le répertoire des fichiers affichés à l'ouverture de la boîte de dialogue.

  1. La boîte de dialogue Sauvegarder sous.

La boîte de dialogue "Enregistrer sous" permet de sauvegarder un fichier ouvert. Pour l'afficher, on fait appel à la méthode ShowSave. Pour ce qui est des propriétés à modifier, reportez-vous à ceux de la boîte de dialogue "Ouvrir".

  1. La boîte de dialogue Couleur.

Cette boîte de dialogue "Couleur" standard permet une couleur parmi d'autres. Pour l'afficher, on fait appel à la méthode ShowColor. Vous devrez renseigner les propriétés du contrôle suivantes.

Propriété Utilisation

CancelError Initialisée à True, elle renvoie le code d'erreur 32755 (CDERR~CANCEL) lorsque le bouton Annuler a été pressé.

Flags Elle définit les options de la boîte de dialogue. La syntaxe de l'instruction est : "Objet.Flags = valeur" où "valeur" peut valoir "&H1&", "&H2&", "&H3&" ou bien "&H2& + &H1&".

Color Elle sélectionne une couleur par défaut. La syntaxe de l'instruction est: "Objet.Color = QBColor(valeur)".

  1. La boîte de dialogue Police de caractères

Boîte de dialogue "Police de caractères" standard, permet de sélectionner une police et ses attributs. Pour l'afficher, on fait appel à la méthode ShowFont. Ensuite, renseignez les propriétés suivantes:.

Propriété Utilisation

CancelError Initialisée à True, elle renvoie le code d'erreur 32755 (CDERR~CANCEL) lorsque le bouton Annuler a été pressé

Flags Options de la boîte de dialogue. La syntaxe de l'instruction est: "Objet.Flags = valeur" où "valeur" peut valoir "&H1&", "&H2&", "&H3&" ou bien "&H2& + &H1&".

FontBold style Gras par défaut.

FontItalic style Italique par défaut.

FontName police par défaut.

FontSize taille par défaut.

FontStrikethru style Barré par défaut.

FontUnderline style Souligné par défaut.

Max taille maximale des polices affichés.

Min taille minimale des polices affichés.

  1. La boîte de dialogue Imprimer

La boîte de dialogue "Imprimer" sert à définir les paramètres de l'impression. Pour l'afficher, on fait appel à la méthode ShowPrinter. Ensuite, renseignez les propriétés suivantes:

Propriété Utilisation



CancelError Initialisée à True, elle renvoie le code d'erreur 32755 (CDERR~CANCEL)

  lorsque le bouton Annuler a été pressé.

Copies Nombre d'exemplaires à imprimer.

Flags Options de la boîte de dialogue. La syntaxe de l'instruction est: "Objet.Flags = valeur" où "valeur" peut valoir "&Hl&", "&H2&", "&H3&" ou bien "&H2& + &Hl&".

FromPage Numéro de la première page à imprimer.

PrinterDefault Indiquer si les paramètres entrés doivent devenir les nouveaux paramètres par défaut.

ToPage Numéro de la dernière page à imprimer.

Menus et inenus contextuels

Un menu peut inclure des commandes, des titres de sous-menus (jusqu'à quatre niveaux)et des barres de séparation. Il doit être associé à une feuille (Form)

Sélectionnez une feuille dans la fenêtre projet, puis son objet .

Maintenant vous pouvez accéder à la création de menu (Outils/Créateur de menus) ou par l'icône (3ème à partir de la droite).

Caption : Nom qui apparaîtra à l'utilisateur. Le trait d'union (-) crée une barre séparatrice, & pour la touche Alt.

Naine : nom identificateur pour le programme. Il n'apparaît pas à l'utilisateur.

Index : pour affecter une valeur numérique qui détermine la position du contrôle à l'intérieur d'un groupe de contrôles. Cette position n'a aucun rapport avec la position à l'écran.

ShortCut : raccourci clavier pour chaque commande.

HelpContextID : Vous permet d'affecter une valeur numérique unique pour l'identificateur de contexte. Cette valeur est utilisée pour trouver la rubrique appropriée dans le fichier d'aide identifié par la propriété HelpFile.

NegotiatePosition : Vous permet de sélectionner la propriété NegotiatePosition du menu. Cette propriété détermine si le menu apparaît dans une feuille conteneur, et, si oui, à quel emplacement.

 Checked : Vous permet d'ajouter une coche à la gauche d'un élément de menu. Celle-ci est généralement utilisée pour signaler si une option à bascule est validée ou non.

Enabled : Vous permet de décider si l'élément de menu doit répondre à des événements, ou doit être grisé si vous voulez qu'il soit indisponible.

Visible : Vous permet de rendre l'élément visible dans le menu.

WindowList : Détermine si le contrôle Menu contient une liste des feuilles MDI fille ouvertes dans une application MDI (càd afficher les derniers fichiers ouverts par l'application concernée).

Le menu contextuel

Dans une quelconque application de Microsoft, lorsque vous cliquez sur le bouton droit de votre souris, une série de commande apparaît: c'est le menu contextuel (ou Popup menu en anglais).

La création d'un popup menu se fait presque comme un système de menu. Pour cela, faites exactement comme si vous créez un système de menu. Définissez ensuite, une action pour chaque commande du menu contextuel. Par la suite, il faut définir dans quelles conditions doit apparaître le menu contextuel. Double-cliquez sur la feuille où est créé le système de menu et dans la liste déroulante "événement", sélectionnez l'événement "MouseDown". Entrez les instructions suivantes :

Private Sub Form_MouseDown(Button As Integer' Shift As Integer' X As Single)' Y As Single

If (Button = 2) Then

PopupMenu X

end if End Sub Interprétation: Lorsque le bouton droit de la souris a été cliqué, le menu contextuel X apparaît.

Vous pouvez remplacer la valeur de la variable "Button" si vous voulez que le menu contextuel apparaisse à une autre action de l'utilisateur :

  • Pour que le menu contextuel apparaisse en cliquant sur le bouton gauche de la souris, remplacez 2 par 1 dans la condition (Button = 1);
  • Pour que le menu contextuel apparaisse en cliquant sur le bouton central de la souris, remplacez 2 par 4 dans la condition (Button = 4);

Enfin, revenez dans la boîte de dialogue "créateur de menu" et décochez la case "Visible" du

menu que vous désirez rendre contextuel. Ne le faites pas avant car si vous le faites, vous ne

pourrez pas définir une action pour chaque commande du menu contextuel.

Private Sub RTextl_MouseUp(Button As Integer' Shift As Integer' X As

Single' Y As Single)

If Button = vbRightButton Then

PopupMenu mnuEdit

End If

End Sub

Le presse-papier est indispensable pour toute opération de copie et de collage. Ces opérations s'effectuent grâce à l'objet ClipBoard.

Remarque :

  • Si vous utilisez le contrôle TextBox, vous n'avez pas besoin de définir des procédures pour le presse-papier (il est déjà intégré dans le contrôle).
  • Si vous utilisez le contrôle RichtextBox, alors il vous faudra définir vous-même le presse-papier.

La différence entre ces 2 contrôles de saisie est que le contrôle RichTextBox possède quelques fonctions supplémentaires comme la possibilité de définir des marges autour du texte et surtout il peut supporter des fichiers Txt > 60Ko.

Méthodes utilisées pour définir le presse-papier :

  • ClipBoard.GetText : lire le contenu du presse-papier(uniquement avec des données textuelles).
  • ClipBoard.SetText : écrire dans le presse-papier(uniquement avec des données textuelles).
  • ClipBoard.Clear : effacer le contenu du presse-papier.
  • ClipBoard.GetFormat(type) : indique le type de données présent dans le presse-papier. Les valeurs retournée sont :

o (vbCFText) : données de type texte.

o (vbCFBitmap) : image en mode point(bitmap).

o (vbCFMetafile) : métafichier vectoriel(wmf).

o vbCFDib) : image bitmap indépendante du périphérique.

o (vbCFPalette) : palette de couleur.

o (vbCFEMetafile) : métafichier amélioré(emf).

o (vbCFFile) : noms de fichiers copiés depuis l'Explorateur de Windows.

o &FFFFBF00 (vbCFLink) : liaisonDDE(valeur exprimée sous forme hexadécimale).

o &FFFFBF01 (vbCFRTF) : texte au format RTF.

o ClipBoard.GetData permet de lire le contenu du presse-papier(uniquement avec des données graphiques).

o ClipBoard.SetData permet d'écrire dans le presse-papier(uniquement avec des données graphiques).

La barre d'outils et la barre d'état

Il faut que soit présent le contrôle Microsoft Windows Common Controls 6.0.  

  1. La barre d'outils

Créez en une, elle se placera automatiquement sur le haut de votre feuille. Sélectionnez le contrôle ImageList et placez-le à son tour sur la feuille. (Notez que l'emplacement de ce contrôle n'a aucune importance.)

 Clic droit sur le contrôle ImageList sur la feuille, puis Propriétés/onglet "Général". Vous avez la possibilité de modifier la taille de vos images présentes dans la barre d'outils. C'est dans l'onglet "Images" que vous allez pouvoir choisir les images qui y seront placées. Appuyez sur le bouton "Insérer une image" ( celles fournies avec Visual Basic sont situés dans C:\Program Files\Microsoft Visual Studio\Common\Graphics\Bitmaps), sélectionnez les images que désirez mettre sur votre barre d'outils. Attribuez à chacune de ces images un nom dans la propriété "Key". Validez ensuite en appuyant sur le bouton "Appliquer".

Clic droit sur le contrôle ToolBar et sélectionnez "propriétés". Dans l'onglet "Général", sélectionnez "ImageList1" dans les propriétés "ImageList", "DisabledImageList" et "HotImageList". sélectionnez aussi "1-TbrFlat" dans la propriété "Style".

Passons à présent à l'onglet "Boutons". Renseignez les principales propriétés :

~ Key: le nom des images que vous avez choisi dans le contrôle ImagaList.

~ ToolTipText : vous permet d'afficher une bulle lorsque vous survolez l'image.

~ Image: les numéros correspondants aux images contenues dans le contrôle ImagaList.

Noubliez pas que ce dernier permet d'afficher des images sur votre barre d'outils. Ok, maintenant, revenez à la feuille principale. Vous avez vu, votre barre d'outils est à présent visible.

  1. La barre d'état

Choisissez le contrôle StatusBar et placez-le n'importe où. cela n'a pas d'importance car au bout du compte, il s'affichera automatiquement tout en bas de votre feuille. Faites un clic droit sur ce dernier qui est à présent placé sur la feuille et allez dans l'onglet "Propriétés". Paramétrez les différentes propriétés qui s'y trouvent.

Les imprimantes

For I = 0 To Printers.Count - 1

Txt.Text = Txt.Text & " ------ Imprimante " & (I + 1) & " ------" &

vbNewLine

Txt.Text = Txt.Text & "Device Name =" & Printers(I).DeviceName &

vbNewLine

Txt.Text = Txt.Text & "Driver Name =" & Printers(I).DriverName &

vbNewLine

Txt.Text = Txt.Text & "Port =" & Printers(I).Port & vbNewLine

Next

Set Printer = Printer (0)

Appel de base sous SQL Server

  • Si dans la boite à outils l'objet Data (Data Environnement) n'existe pas : clic droit sur la boite à outils, composant, onglet concepteurs, cocher Data Environnement.
  • Puis clic droit sur le nom du projet, ajouter, Data Environnement (fig.1)
  • Double clic sur Data Environnement
  • dans la grande fenêtre clic droit sur connection1, propriétés (fig.2) :

o Onglet Fournisseur choisir Microsoft OLE DB Provider For SQL Server (pour SQL sever 2000)

o Onglet connection

n choisir sa connection (ex M102) dans la liste déroulante

n sélectionner Utiliser la sécurité intégrée de Windows NT (option Bouton)

n sélectionner sélectionner la base de donnée sur le serveur (option Bouton)

n Choisir la base sur laquelle vous voulez travailler dans la liste déroulante

n Cliquer sur le bouton tester la connection pour vérifier

n Cliquer sur le bouton "OK"

Dans la fenêtre principale (celle du data environnement, si besoin aller dans le menu principal, fenêtre) :

  • clic droit sur la connection et choisir ajouter une commande.
  • clic droit sur ce dernier, puis propriété là, vous pouvez

o soit choisir directement l'Objet de base de donnée (table par ex.) et le nom de l'objet dans listes déroulantes (fig.4)

o soit choisir instructions SQL, cliquez sur le bouton Générateur SQL pour créer votre propre vue.

  Votre table est prête à l'emploie. Il vous ne reste plus qu'à transporter les champs sur la feuille (form) VB.

  • Mettez côte à côte les fenêtres Form et DataEnvironnement
  • Faites un cliquer-glisser de la commande (ou du détail, +) de la feuille DataEnvironnement à la Form.

Note : pour vous aider, dans le menu, affichage, sélectionner "Fenêtre Données". Dans cette dernière dérouler la connection (+) pour avoir accès aux tables.

Appel d'une base Access

  • Si dans la boite à outils l'objet Data (Data Environnement) n'existe pas : clic droit sur la boite à outils, composant, onglet concepteurs, cocher Data Environnement.
  • Puis clic droit sur le nom du projet, ajouter, Data Environnement (idem SQL fig.l)
  • Double clic sur Data Environnement
  • dans la grande fenêtre clic droit sur connectionl, propriétés :

o Onglet Fournisseur choisir Microsoft OLE DB Provider for ODBC Drivers

o Onglet connection

n choisir utiliser la chaîne de connection

n Cliquer sur le bouton

n Onglet

Source de données machine : Choisir MS Access Database

n Sous la nouvelle fenêtre cliquer sur Base de donnée, et choisir sa base Access, valider

n Cliquer sur le bouton tester la connection pour vérifier

n Cliquer sur le bouton "OK"

Dans la fenêtre principale (celle du data environnement, si besoin aller dans le menu principal, fenêtre) :

  • clic droit sur la connection et choisir ajouter une commande.
  • clic droit sur ce dernier, puis propriété, puis :

o Cliquez sur l'onglet relation (un message apparaîtra, n'en tenez pas compte), choisir votre base de donnée Access.

o Ne sortez pas de la fenêtre, cliquez sur l'onglet général et choississez votre objet base de donnée (ex : table) ou créez-en un Instruction SQL.

o Cliquez sur Appliquer, puis sur OK.

o Faire un cliquer-glisser de la commande ou des champs sur la Form (idem que pour SQL Server)

ADO Data Control : l'objet

 Dans la boîte à outils choisir le composant Microsoft ADO Data control (différent suivant

Clic droit sur cet objet, propriété :

‰ Onglet général: cliquez sur le bouton céer (une chaîne de connexion) choissisez le fournisseur et la connection (voir accès au base SQL ou accès aux bases Access).

‰ Onglet ressource, fenêtre type de commande:

o Soit AdCmdUnknown pour créer votre propre requête

o Soit AdCmdTable pour choisir la Table

o soit ....

Pour afficher les champs, créez une TexBox, puis dans ses propriétés :

‰ DataSource choisir dans la liste votre AdOdc ‰ DataField choisir dans la liste un champ

ADO Data Control : l'objet

‰ Connection (source de données)

‰ Command (permet des requêtes et envoyer des enregistrements) ‰ Recordset (gère les enregistrements, Fields = champs)

Provider :

‰ SQLOLEDB pour SQL Server

‰ MSDASQL pour 1 source ODBC

‰ Microsoft.jet.OLEDB.3.51 (ou 4.0) pour le moteur Jet ‰ MSIDXS pour Index Server

‰ ADSDSOObjet pour Active Directory Service ‰ MSDAORA pour Oracle

Ex :

Dim Cnx As AD.DB.Connection

Set Cnx = New Connection

With Cnx

.Provider = "SQL.LEDB"

.ConnectionString = "User ID=toto;Data Source = SQL~SCR~1;Initial

Catalog=Mabase"

.open

End With

Dim Cmd As AD.DB.Command

Set Cmd = New Command

With Cmd

.ActiveConnection = Cnx

.CommandText = "Update Vente SET px = px * 0.1 "

.Execute

End Wit

ou

Dim Rs As New Recordset ...

Private Sub Form_Load()

Rs..pen "SELECT * FR.M " & nom_table' ma_connexion' ad.penDynamic' adLock.ptimistic

ou bien sans définir de connection

Dim Cmd As AD.DB.Command

Set Cmd = New Command

With Cmd

.ActiveConnection = "Provider = "SQL.LEDB;User ID=toto;Data Source =

SQL_SCR_l;Initial Catalog=Mabase"

...

End With

SetFocus : bug

On ne peut pas modifier le focus d'une zone dans la form.load, utilisez Tableindex = 0

Appel prog. ext. : Shell Help WorkShop

Locking bound controls

It is very easy to overwrite data accidentally in Access. Setting a form'sAllowEdits property prevents that, but also locks any unbound controls you want to use for filtering or navigation. This solution locks only the bound controls on a form and handles its subforms as well.

 First, the code saves any edits in progress, so the user is not stuck with a half-edited form. Next it loops through all controls on the form, setting the Locked property of each one unless the control:



  • is an unsuitable type (lines, labels, ...);
  • has no Control Source property (buttons in an option group);
  • is bound to an expression (Control Source starts with ~~~);
  • is unbound (Control Source is blank);
  • is named in the exception list. (You can specify controls you do not want unlocked.)

If it finds a subform, the function calls itself recursively. Nested subforms are therefore handled to any depth. If you do not want your subform locked, name it in the exception list.

The form's AllowDeletions property is toggled as well. The code changes the text on the command button to indicate whether clicking again will lock or unlock.

To help the user remember they must unlock the form to edit, add a rectangle named rctLock around the edge of your form. The code shows this rectangle when the form is locked, and hides it when unlocked.

Using with your forms To use the code:

  1. Open a new module. In Access 9 5 - 2003, click the Modules tab of the Database window, and click New. In Access 2007 and later, click Module (rightmost icon) on the Create ribbon. Access opens a code module.
  2. Paste in the code from the end of this article. Save the module with a name such as ajbLockBound.
  3. (Optional) Add a red rectangle to your form to indicate it is locked. Name it rctLock.
  4. To initiali2e the form so it comes up locked, set the On Load property of your form to: =LockBoundControls([Form]'True)
  5. Add a command button to your form. Name it cmdLock. Set its On Click propertyto [Event Procedure]. Click the Build button (...) beside this.

Set up the code like this:

  1. Private Sub cmdLock_Click()
  2. Dim bLock As Boolean
  3. bLock = IIf(Me.cmdLock.Caption = "&Lock"' True' False)
  4. Call LockBoundControls(Me' bLock) End Sub
  5. (Optional) Add the names of any controls you do not want unlocked at steps 3 and 4. For example, to avoid unlocking controls EnteredOn and EnteredBy in the screenshot above, you would use:

Call LockBoundControls(Me' bLock' "Entered.n"' "EnteredBy")

Note that if your form has any disabled controls, changing theirLocked property affects the way they look. To avoid this, add them to the exception list.

The code

Public Function LockBoundControls(frm As Form' bLock As Boolean' ParamArray avarExceptionList())

.n Error GoTo Err_Handler

'Purpose: Lock the bound controls and preve nt deletes on the form any

its subforms.

'Arguments frm = the form to be locked

' bLock = True to lock' False to unlock.

' avarExceptionList: Names of the controls N.T to lock

(variant array of strings).

'Usage: Cal l LockBoundControls(Me. True)

Dim ctl As Control 'Each control on the form

Dim lngI As Long 'Loop controller.

Dim bSkip As Boolean

'Save any edits.

If frm.Dirty Then

frm.Dirty = False

End If

'Block delet ions.

frm.AllowDeletions = Not bLock

For Each ctl In frm.Controls

Select Case ctl.ControlType

Case acTextBox' acComboBox' acListBox' ac.ptionGroup' acCheckBox'

ac.ptionButton' acToggleButton

'Lock/unlock these controls if bound to fields.

bSkip = False

For lngI = LBound(avarExceptionList) To

UBound(avarExceptionList)

If avarExceptionList(lngI) = ctl.Name Then

bSkip = True

Exit For

End If

Next

If Not bSkip Then

If HasProperty(ctl' "ControlSource") Then

If Len(ctl.ControlSource) > 0 And Not ctl.ControlSource

Like "=*" Then

If ctl.Locked <> bLock Then

ctl.Locked = bLock

End If

End If

End If

End If

Case acSubform

'Recursive call to handle all subforms.

bSkip = False

For lngI = LBound(avarExceptionList) To

UBound(avarExceptionList)

If avarExceptionList(lngI) = ctl.Name Then

bSkip = True

Exit For

End If

Next

If Not bSkip Then

If Len(Nz(ctl.Source.bject' vbNullString)) > 0 Then

ctl.Form.AllowDeletions = Not bLock

ctl.Form.AllowAdditions = Not bLock

Call LockBoundControls(ctl.Form' bLock)

End If

End If

Case acLabel' acLine' acRectangle' acCommandButton' acTabCtl' acPage' acPageBreak' acImage' ac.bjectFrame 'Do nothing

 Case Else

'Includes acBound.bjectFrame' acCustomControl Debug.Print ctl.Name & " not handled " & Now() End Select

Next

'Set the visual indicators on the form.

.n Error Resume Next

frm.cmdLock.Caption = IIf(bLock' "Un&lock"' "&Lock") frm!rctLock.Visible = bLock

Exit_Handler:

Set ctl = Nothing Exit Function

Err_Handler:

MsgBox "Error " & Err.Number & " - " & Err.Description

Resume Exit_Handler

End Function

Public Function HasProperty(obj As .bject' strPropName As String) As Boolean

'Purpose: Return true if the object has the property.

Dim varDummy As Variant

.n Error Resume Next

varDummy = obj.Properties(strPropName)

HasProperty = (Err. Number = 0)

End Function

Using a Combo Box to Find Records

Warning: In Access 97 or earlier, this tip can trigger the Bookmark Bug.

If you receive an error in Access 2000 or later, see Solving problems with References.

It is possible to use an unbound combo box in the header of a form as a means of record navigation. The idea is to select an entry from the drop-down list, and have Access take you

to that record.

Assume you have a table called "tblCustomers" with the following structure:

CustomerID AutoNumber (indexed as Primary Key).

Company Text

ContactPerson Text

A form displays data from this table in Single Form view. Add a combo box to the form's header, with the following properties:

Name cboMoveTo

Control Source [leave this blank]

Row Source Type Table/Query

Row Source tblCustomers

Column Count 3

Column Widths 0.6 in; 1.2 in; 1.2 in

 Bound Column 1

List Width 3.2 in

Limit to List Yes

Now attach this code to the AfterUpdate property of the Combo Box:

Sub CboMoveTo_AfterUpdate () Dim rs As DA..Recordset

If Not IsNull(Me.cboMoveTo) Then

'Save before move.

If Me.Dirty Then

Me.Dirty = False

End If

'Search in the clone set.

Set rs = Me.RecordsetClone

rs.FindFirst "[CustomerID] = " & Me.cboMoveTo

If rs.NoMatch Then

MsgBox "Not found: filtered?"

Else

'Display the found record in the form.

Me.Bookmark = rs.Bookmark

End If

Set rs = Nothing

End If

End Sub

The steps this procedure takes are:

  • Save the record. (This prevents a bug if the record is dirty and can't be saved, e.g. a required field is missing.)
  • Refer to RecordsetClone - a duplicate set of pointers to the records behind this form ("Me").
  • Use FindFirst to match the field to be searched with the contents of the combo box.
  • Display the record, by matching the form's BookMark to the record found in the clone recordset.

Note: If CustomerID is a Text type field in your table, you need extra quotes, i.e.: rs.FindFirst "[CustomerID] = """ & Me.cboMoveTo & """"

For an explanation, see Quotation marks within quotes.

If you want to create a search form, not merely a navigation combo, see the Search Criteria database.

Archive: Move Records to Another Table

A move consists of two action queries: Append and Delete. A transaction blocks the Delete if the Append did not succeed. Transactions are not difficult, but there are several pitfalls.

Should I archive?

Probably not. If possible, keep the old records in the same table with the current ones, and use a field to distinguish their status. This makes it much easier to query the data, compare current with old values, etc. It~s possible to get the data from different tables back together again with

 UNION statements, but it's slower, can't be displayed as a graphic query, and the results are read-only.

Archiving is best reserved for cases where you won't ever need the old data, or there are overriding considerations e.g. hundreds of thousands of records, with new ones being added constantly. The archive table will probably be in a separate database.

The Steps

The procedure below consists of these steps:

  1. Start a transaction.
  2. Execute the append query.
  3. Execute the delete query.
  4. Get user confirmation to commit the change.
  5. If anything went wrong at any step, roll back the transaction.

The Traps

Watch out for these serious traps when working with transactions:

  1. Use dbFailOnError with the Execute method. Otherwise you are not notified of any errors, and the results could be incomplete.
  2. dbFailOnError without a transaction is not enough. In Access 9 5 and earlier, dbFailOnError rolled the entire operation back, and the Access 97 help file wrongly claims that is still the case. (There is a correction in the readme.) FromAccess 97 onwards, dbFailOnError stops further processing when an error occurs, but everything up to the point where the error occurred is committed.
  3. Don't close the default workspace! The default workspace--dbEngine(0)--is always open. You will set a reference to it, but you are not opening it. Access will allow you to close it, but later you will receive unrelated errors about objects that are no longer set or have gone out of scope. Remember: Close only what you open; set all objects to nothing.
  4. CommitTrans or Rollback, even after an error. The default workspace is always open, so an unterminated transaction remains active even after your procedure ends! And since Access supports multiple transactions, you can dig yourself in further and further. Error handling is essential, with the rollback in the error recovery section. A flag indicating whether you have a transaction open is a practical way to manage this.

The Code

This example selects the records from MyTable where the field MyYesNoField is Yes, and moves them into a table named MyArchiveTable in a different database file - C:)My Documents)MyArchive.mdb.

Note: Requires a reference to the DAO library.

 Dim ws As DA..Workspace 'Current workspace (for transaction).

Dim db As DA..Database 'Inside the transaction.

Dim bInTrans As Boolean 'Flag that transaction is active.

Dim strSgl As String 'Action quer y statements.

Dim strMsg As String 'MsgBox message.

'Step l: Initialize database object inside a transaction.

Set ws = DBEngine(0)

ws.BeginTrans

bInTrans = True

Set db = ws(0)

'Step 2: Execute the append.

strSgl = "INSERT INT. MyArch iveTable ( MyField' AnotherField' Field3 ) "

& _

"IN ""C:\My Documents\MyArchive.mdb"" " & _

"SELECT SomeField' Field2' Field3 FR.M MyTable WHERE (MyYesNoField =

True);"

db.Execute strSgl' dbFail.nError

'Step 3: Execute the delete.

strSgl = "DELETE FR.M MyTable WHERE (MyYesNoField = True);" db.Execute strSgl' dbFail.nError

'Step 4: Get user confirmation to commit the change.

strMsg = "Archive " & db.RecordsAffected & " record(s)?"

If MsgBox(strMsg' vb.KCancel + vbQuestion' "Confir m") = vb.K Then

ws.CommitTrans

bInTrans = False

End If

Exit_DoArchive:

'Step 5: Clean up

.n Error Resume Next Set db = Nothing

If bInTrans Then 'Rollback if the transaction is active.

ws.Rollback

End If

Set ws = Nothing

Exit Sub

Err_DoArchive:

MsgBox Err.Description' vbExclamation' "Archiving failed: Error " &

Err.number

Resume Exit_DoArchive

End Sub

DAO Programming Code Examples

This page is a reference for developers, demonstrating how to use the DAO library to programmatically create, delete, modify, and list the objects in Access- the tables, fields, indexes, and relations, queries, and databases - and read or set their properties.

DAO (Data Access Objects) is the native library Microsoft designed to expose the object in Access. All versions have this library set by default, except Access 2000 and 2002, so make sure you have the DAO library reference set if you use those versions.

For more information on why you need to use DAO, see Michael Kaplan's blog posting of July 13 2007: What does DAO have that ADO/ADOx/JRO do not?

For an introduction to DAO, see DAO Object Model. If you are more familiar with ADO or DDL, this comparison of field names may help.



281