– support colonization

Présentation

Le langage de programmation VBA créé en 1993 par Microsoft est disponible dans tous les logiciels Office, il existe toutefois des instructions spécifiques à certains logiciels.

Avantages :

  • disponible dans toute la suite Office
  • accessible et intuitif
  • automatiser des tâches

Inconvénients :

  • limité à Microsoft
  • basé sur la version de l’application développée (2016 etc)

 

Installation

Il faut ajouter l’onglet Développeur pour disposer des commandes (fichier>option>ruban>developeur)

Macro

Les Macro permettent d’enregistrer une série d’action sans écrire de code. Le VBA est généré automatiquement.

 

Les variables

Un souci primordial lors de l’écriture d’un algorithme est sa lisibilité. Il sera lu et corrigé par différentes personnes, c’est pourquoi il est important de respecter la syntaxe et d’y ajouter le maximum de commentaires possibles. Chaque donnée d’un programme a un nom que l’on appelle un identificateur. Il faut respecter certaines règles pour ce nom soit valide :

  • il est formé d’un seul mot ;
  • il ne peut contenir que des chiffres, des lettres non accentuées (syntaxe anglo-saxonne des compilateurs) et le caractère souligné ( _ ) ;
  • le premier caractère ne peut pas être un chiffre ;
  • il doit être explicite, très utile pour l’humain (ex : prix_ht plutôt que k) ;
  • il doit être unique.

L’espace est un séparateur de mot, il ne peut donc pas être utilisé dans l’identificateur. Le compilateur travaille mot après mot, il considère qu’un identificateur est terminé lorsqu’il rencontre un espace. Une variable contient une valeur qui peut changer. Chaque variable doit avoir un nom (identifiant) et un type définissant les valeurs qu’elle peut prendre.

Les types de données

Le type d’une donnée détermine les valeurs qu’elle peut prendre. Les principaux types sont entier, réel, caractère, chaîne de caractère (ou chaîne) et booléen. Il en existe d’autres.

Byte Numérique Nombre entier de 0 à 255.
Integer Numérique Nombre entier de -32’768 à 32’767. %
Long Numérique Nombre entier de – 2’147’483’648 à 2’147’483’647. &
Currency Numérique Nombre à décimale fixe de -922’337’203’685’477.5808 à 922’337’203’685’477.5807. @
Single Numérique Nombre à virgule flottante de -3.402823E38 à 3.402823E38. !
Double Numérique Nombre à virgule flottante de -1.79769313486232D308 à 1.79769313486232D308. #
String Texte Texte. $
Date Date Date et heure.
Boolean Boolean True (vrai) ou False (faux).

 

Dim maVariable As Integer
maVariable = 12345

Dim v2 As Integer
Dim v2%

Ajouter l’obligation de déclarer les variables (Developeur ->outils->option->déclarer variable)

Dim prenom As String, nom As String
prenom = "Jo"

L’affichage et la saisie

MsgBox ("tu es" & prenom & nom)

nom = inputBox("saisir le nom")

Seules les variables de type de base (entier, réel, caractère, chaîne, booléen) peuvent être initialisées par l’utilisateur.

Écrire le programme qui affiche le prix total ttc en fonction du prix ht, du taux de tva et de la quantité achetée ( on prendra des valeurs au hasard).
Écrire un programme qui initialise deux variables entières et qui affiche directement la somme de ces deux nombres. N’oubliez pas d’afficher un message à l’utilisateur pour qu’il sache quoi saisir.

Sélection de feuille ou cellule

Sheets("nom feuille ").select
Range("cellule ").select  (rendre active une cellule)
Range("cellule,cellule").select (cellule non contigue)
Range("cel debut :cell fin").select
Cells(ligne,colonne).select ->1,1
activeCells.offset(ligne,colone).select ->decalage
Sub position()
'sélection d'une feuille
    Sheets("Feuil3").Select

    'aller sur la cellule A1
    'Range("a1").Select

    'sélection de la cellule d3,c4,b8
    'Range("d3,c4,b8").Select

    'sélection de la cellule c3 à la cellule c18
   'Range("c3:c18").Select

   'selection de la cellule d3
   'Cells(3, 4).Select

   'selection de la cellule a droite de la cellule active 2 ligne en dessous
   ActiveCell.Offset(-2, -2).Select

End Sub

Les structures conditionnelles

La conditionnelle

Le booléen est la condition de l’instruction si. C’est généralement une expression booléenne.

Sub a()
  t = InputBox("Quelle est la temperature ?")
 
  If t > 200 Then
    MsgBox ("extrêmement chaud")
  ElseIf 200 > t And t > 40 Then
    MsgBox ("élevé")
  ElseIf 40 > t And t > 20 Then
    MsgBox ("correct")
  ElseIf 20 >= t And t > 0 Then
    MsgBox ("correct")
  Else
    MsgBox ("Beaucoup trop froid")
  End If
End Sub

Indiquer si un nombre est supérieur à 30.
L’entreprise accorde une remise de 10 % sur le prix ttc pour tout achat de plus de 100 pièces ; écrire le programme calculant le prix ttc en fonction de la quantité, du prix ht et du taux de tva.

L’alternative

Sub a()
  nombre= 1 
  Select Case nombre 
    Case 1 
      MsgBox "un" 
    Case 2 
      MsgBox "deux" 
    Case 3 
      MsgBox "trois" 
    Case Else 
      MsgBox "autre" 
  End Select
End Sub

Une agence de voyage propose des réductions sur les billets d’avion de 50€ selon la catégorie de chacun de ses clients. Si les personnes sont dans la catégorie senior, ils ont 50% de réductions. Dans la catégorie nourrisson, le prix du billet est forfaitaire, il sera de 20 euros. Pour les enfants, le prix sera de 30% de celui d’origine.
Écrire le programme qui affiche le prix final pour un client.

Les bloucles

Tant que

La boucle de type « Tant que » permet la répétition d’un bloc d’instruction tant que la condition testée est vérifiée.

Sub a()
  Dim compteur As Integer
  compteur = 0
  While compteur < 5
    compteur = compteur + 1
  Wend
  MsgBox (compteur)
End Sub

 Répéter … Tant que

Sub a()
  Dim compteur As Integer
  compteur = 0
  Do
    compteur = compteur + 1
  Loop While compteur < 5
  MsgBox (compteur)
End Sub

Pour

On doit utiliser pour lorsque le nombre d’itérations est connu.

Sub a()
  Dim compteur As Integer
  For compteur = 1 To 4 Step 1
    Msgbox(compteur)
  Next
  MsgBox (compteur)
End Sub
  •  Le pas (incrément) de la boucle est un entier quelconque, mais il est fixe.
  • Le pas de 1 est optionnel.
  • Le pour étant une instruction comme une autre, le corps d’un pour peut très bien contenir un autre pour (ou toute autre boucle).

Écrire un programme qui saisit deux entiers et qui incrémente de 1 le premier tant qu’il n’est pas supérieur au deuxième.
Afficher les nombres de 0 à 10 dans l’ordre décroissant

Afficher les nombres pairs de 0 à 20 dans l’ordre décroissant
Afficher pour chaque nombre de 1 à 10 les nombres qui lui précédent .

Écrire un programme qui saisit un entier positif.
Écrire un programme qui affiche n fois ‘coucou’, l’entier n sera saisi par l’utilisateur.
Écrire un programme qui saisit un nombre tant qu’il n’est pas égal à 10.
Écrire un programme qui saisit un nombre tant qu’il n’est pas égal à 10 et affiche un message du style ‘ce nombre n’est pas bon’.

Les méthodes

Lorsqu’un programme devient complexe, on le décompose en plusieurs méthodes.

Intérêts

– Réutilisation de la même procédure plusieurs fois au cours d’un programme en faisant un simple appel.
– Résoudre un programme long et complexe en plusieurs procédures plus simples.
– Obtenir des procédures totalement indépendantes du programme principal.

Sub age(datee As Date)
Dim a As Integer
 age = DateDiff("yyyy", datee, Date)
 MsgBox age
End Sub

Une procédure ne peut pas renvoyer de résultat contrairement à une fonction.

Function age(datee As Date) as Integer
  Dim a As Integer
  age = DateDiff("yyyy", datee, Date)
End Function

Écrire une procédure qui affiche cinq fois bonjour
Écrire une fonction qui renvoie bonjour. On testera sa fonction avec une procédure qui affiche le résultat de celle-ci.

Écrire une fonction qui renvoie la somme des nombres de 8 à 20
Écrire la fonction puissance qui renvoie un nombre x à la puissance y (x et y sont connus dans le programme principal).

Écrire une fonction qui prend en paramètre deux chaine de caractère et renvoie la concaténation de ces chaines
Écrire une méthode afficherPersonne qui prend en paramètre le prénom et affiche le nom et le prénom de la personne. Le nom est déclaré en variable globale.
Écrire une fonction qui utilise votre méthode
Écrire une fonction qui affiche la somme de trois nombres passés en paramètre.
Écrire une fonction qui renvoie la soustraction de deux nombres
Écrire une fonction qui ajoute 7 nombres saisis par l’utilisateur à un nombre passé en paramètre et le renvoie.

Variables locales et variables globales :

Si les instructions constituant la procédure utilisent des variables (indice de boucle par exemple), ce sont des variables locales à la procédure (c’est-à-dire qui ne sont connues, et qui ne peuvent donc être utilisées que dans la méthode). Les variables du programme principal sont dites variables globales au programme. Elles sont lisibles par l’ensemble du programme contrairement aux variables locales.

Public globale As Integer

Function find_results_idle()
  Dim locale as Integer    
  globale = 1
  locale= 2
End Function

 

Les structures de données

Les tableaux à une dimension

Qu’est-ce qu’un tableau ?

Un tableau est dit à une dimension lorsqu’un seul indice suffit à adresser les éléments du tableau. Le tableau informatique n’a rien d’original par rapport au tableau de tous les jours. On le représente souvent comme une suite de cases contenant chacune une valeur.

1ière case 2ième case 3ième case nième case
58 12 27 0 -5 78

Variables complexes et variables simples :

La notion de « case contenant une valeur » doit faire penser à celle de variable. Et, en effet, les cases sont des variables. Il est indispensable de comprendre que le tableau est lui-même une variable. C’est une variable complexe (par opposition aux variables simples) car il est constitué de variables ; en effet, ce que l’on représente par des cases correspond à des variables.

Déclaration d’un tableau

Dim tableau(2) As Double
tableau(1)=8

'Initialisation d'une liste :
Dim tableau As String
tableau= Array("a", "b", "c")


Écrire un programme demandant à l’utilisateur d’entrer 10 entiers, puis, ensuite, afficher ces 10 entiers à l’envers.
Écrire les déclarations nécessaires à l’utilisation d’un tableau contenant les 12 mois de l’année.

Écrire un programme qui saisit 100 nombres et les affiche.
Écrire un programme qui saisit un nombre entre 1 et 12 et indique en toutes lettres à quel mois cela correspond. Vous devez conserver les mois dans un tableau.
Écrire un programme qui saisit une suite de notes dans un tableau et qui en calcule la moyenne.
Écrire un programme qui saisit un certain nombre d’entiers. La fin de la saisie sera reconnue par la saisie du nombre –1. Dans un deuxième temps, afficher le nombre de 0 saisis.

Tableaux à deux dimensions

Quelle(s) variable(s) utiliser pour représenter les notes de A, étudiant de BTS SIO? (français, maths, éco, anglais, S1 à S4). Nous allons utiliser un tableau qui contiendra les 8 notes.

Dim tbNotes(8) As Double

La classe compte 18 élèves (A à R). Comment faire pour gérer toutes les notes de tous les élèves de la classe ? Une solution serait de déclarer 18 tableaux de notes (un par élève).

Dim tbNotes1(8) As Double
Dim tbNotes2(8) As Double

On retombe exactement sur les problèmes rencontrés en début de chapitre : on définit un grand nombre de variables qui sont homogènes et interchangeables. La seule différence est que ces variables sont des tableaux, et non plus des variables simples.
Comment avait-on réglé la situation ? En regroupant les variables dans un tableau. Et bien, on va faire pareil, en regroupant les tableaux dans un tableau. Cela donne un tableau de tableaux, soit un tableau à deux dimensions.

Dim VarTab(1 To 18, 1 To 8) As Integer

Il faut bien comprendre que cela correspond au tableau suivant :

Éco Fr Ang Maths S1 S2 S3 S4
A [1,1] [1,8]
B
C
R [18,1] [18,8]

Les étudiants sont identifiés par un numéro.

Comment peut-on stocker leur nom ? Ne pas oublier que les cases doivent toutes contenir des valeurs de même type. On ne peut donc pas rajouter une colonne où l’on aurait le nom de chaque étudiant (car on aurait un mélange de chaînes et de réels). La seule solution consiste à définir un tableau à une dimension, de longueur NbEtud, dont la case i contient le nom de l’étudiant i. Pour stocker des données de types différents, il faut des tableaux différents (même si ces données correspondent sémantiquement à la même entité).

Donner la déclaration du tableau qui permettrait de manipuler pour chaque pays (environ 250) le nombre d’habitants, le PIB, et la valeur de la monnaie par rapport au dollar.
Comment peut-on accéder à la valeur de la monnaie du pays numéro 20 ?
Comment pourrait-on avoir en clair le nom de chaque pays ?
Écrire un programme qui saisit toutes les notes de tous les étudiants, puis qui calcule la moyenne de l’étudiant F, ainsi que la moyenne de la classe en S3.

 

 

Formulaire

Le formulaire se retrouve dans la partie Feuilles (Insertion->userForm)

Private Sub btn_annuler_Click()
    ficheSalarie.Hide
End Sub
 
Private Sub btn_ok_Click()
    If Len(champ_nom) = 0 Then
        MsgBox "vous devez obligatoirement saisir un nom"
    Else
        If Len(champ_prenom) = 0 Then
            MsgBox "vous devez saisir un prénom"
        Else
            If Len(champ_dte) = 0 Then
                MsgBox "vous devez saisir une date"
            Else
                If Len(champ_point) = 0 Then
                    MsgBox "vous devez saisir des points"
                Else
                    ficheSalarie.Hide
                End If
            End If
        End If
    End If
End Sub

Private Sub UserForm_Initialize()
    'remplir le controle date avec la date du système
    champ_dte.Text = Day(Now()) & "/" & Month(Now()) & "/" & Year(Now())
End Sub

Appel d’un formulaire

On réalise un bouton puis on appelle une procédure ajoutPersonnel
La procédure se retrouve dans Modules

Sub ajoutPersonnel()
    'initialise les valeurs de la boite de dialogue
    ficheSalarie.champ_nom = ""
    ficheSalarie.champ_prenom = ""
    'ficheSalarie.champ_dte = ""
    ficheSalarie.champ_point = ""
    
'ouverture de la boite de dialogue ficheSalarié
    ficheSalarie.Show 

End Sub