Excel - Power Query - Power Pivot - VBA

Office Scripts pour Excel : Comparaison avec VBA

Introduction

Ce support de cours présente les concepts fondamentaux d’Office Scripts pour Excel, en établissant des parallèles avec VBA (Visual Basic for Applications). Ce document est conçu pour faciliter la transition des utilisateurs familiers avec VBA vers Office Scripts, la nouvelle solution d’automatisation pour Excel dans le cloud.

Table des matières

  1. Présentation générale
  2. Configuration de l’environnement
  3. Structure de base d’un script
  4. Variables et types de données
  5. Opérateurs
  6. Structures conditionnelles
  7. Boucles
  8. Fonctions
  9. Manipulation des feuilles et classeurs
  10. Manipulation des cellules et plages
  11. Cas pratiques
  12. Ressources complémentaires

1. Présentation générale

Office Scripts

Office Scripts est une technologie d’automatisation moderne pour Excel basée sur TypeScript (sur-ensemble de JavaScript). Elle permet de créer et exécuter des scripts dans Excel Online et est particulièrement adaptée à l’environnement Microsoft 365.

VBA

Visual Basic for Applications (VBA) est le langage de script traditionnel pour les applications Office, utilisé principalement dans les versions bureautiques d’Excel. Il est basé sur Visual Basic et est intégré dans les applications Office depuis des décennies.

2. Configuration de l’environnement

Office Scripts

// Aucune configuration préalable requise
// Accessible via l'onglet Automatiser dans Excel Online

Étapes d’accès :

  1. Ouvrir Excel Online via Microsoft 365
  2. Cliquer sur l’onglet “Automatiser”
  3. Sélectionner “Nouveau script”

VBA

' Nécessite l'activation du développeur
' Sub EnableDeveloper()
'     MsgBox "Activer l'onglet Développeur via Fichier > Options > Personnaliser le ruban"
' End Sub

Étapes d’accès :

  1. Activer l’onglet Développeur (Fichier > Options > Personnaliser le ruban)
  2. Cliquer sur “Visual Basic” ou utiliser Alt+F11

3. Structure de base d’un script

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    // Le point d'entrée principal de votre script
    // workbook représente le classeur actif
    let sheet = workbook.getActiveWorksheet();
    
    // Votre code ici
    sheet.getRange("A1").setValue("Hello from Office Scripts");
    
    // Pas besoin de sauvegarder explicitement
}

VBA

Sub Main()
    ' Le point d'entrée principal de votre macro
    ' ThisWorkbook représente le classeur actif
    Dim sheet As Worksheet
    Set sheet = ActiveSheet
    
    ' Votre code ici
    sheet.Range("A1").Value = "Hello from VBA"
    
    ' Pas besoin de sauvegarder explicitement
End Sub

4. Variables et types de données

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    // Déclaration avec typage explicite
    let age: number = 30;
    let nom: string = "Jean";
    let estActif: boolean = true;
    
    // Déclaration avec inférence de type
    let salaire = 50000;  // TypeScript infère le type number
    
    // Constantes
    const TAUX_TVA = 20;  // Ne peut pas être modifiée
    
    // Tableaux
    let nombres: number[] = [1, 2, 3, 4, 5];
    let noms: string[] = ["Jean", "Marie", "Paul"];
    
    // Objet
    let employe = {
        id: 101,
        nom: "Dupont",
        departement: "Marketing"
    };
    
    // Type any (similaire à Variant en VBA)
    let donnees: any = "texte";
    donnees = 42;  // Valide car type any
}

VBA

Sub Variables()
    ' Déclaration explicite (recommandée)
    Dim age As Integer
    Dim nom As String
    Dim estActif As Boolean
    
    age = 30
    nom = "Jean"
    estActif = True
    
    ' Constantes
    Const TAUX_TVA As Integer = 20  ' Ne peut pas être modifiée
    
    ' Tableaux
    Dim nombres(1 To 5) As Integer
    nombres(1) = 1
    nombres(2) = 2
    
    ' Collection
    Dim noms As New Collection
    noms.Add "Jean"
    noms.Add "Marie"
    
    ' Type Variant (par défaut si non spécifié)
    Dim donnees As Variant
    donnees = "texte"
    donnees = 42  ' Valide car type Variant
End Sub

Comparaison des types de donnéesOffice Scripts (TypeScript)VBAnumberInteger, Long, Double, SinglestringStringbooleanBooleananyVariantarray[]Array, CollectionobjectType, Class, Dictionaryundefined/nullNothing

5. Opérateurs

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    // Opérateurs arithmétiques
    let a = 10;
    let b = 3;
    
    let somme = a + b;      // 13
    let difference = a - b;  // 7
    let produit = a * b;     // 30
    let quotient = a / b;    // 3.333...
    let modulo = a % b;      // 1
    let puissance = a ** b;  // 1000 (10^3)
    
    // Opérateurs d'affectation
    let x = 5;
    x += 3;  // x = x + 3
    x -= 2;  // x = x - 2
    
    // Opérateurs de comparaison
    let estEgal = (a == b);            // false
    let estStrictementEgal = (a === b); // false (vérifie type et valeur)
    let estPlusGrand = (a > b);        // true
    
    // Opérateurs logiques
    let et = (a > 5 && b < 5);  // true (les deux conditions sont vraies)
    let ou = (a > 20 || b < 5);  // true (au moins une condition est vraie)
    let non = !(a > b);          // false (inverse de true)
}

VBA

Sub Operateurs()
    ' Opérateurs arithmétiques
    Dim a As Integer, b As Integer
    a = 10
    b = 3
    
    Dim somme As Integer
    somme = a + b      ' 13
    Dim difference As Integer
    difference = a - b  ' 7
    Dim produit As Integer
    produit = a * b     ' 30
    Dim quotient As Double
    quotient = a / b    ' 3.333...
    Dim modulo As Integer
    modulo = a Mod b    ' 1
    Dim puissance As Double
    puissance = a ^ b   ' 1000 (10^3)
    
    ' Opérateurs d'affectation
    Dim x As Integer
    x = 5
    x = x + 3  ' x += 3 n'existe pas en VBA
    x = x - 2  ' x -= 2 n'existe pas en VBA
    
    ' Opérateurs de comparaison
    Dim estEgal As Boolean
    estEgal = (a = b)            ' False
    Dim estPlusGrand As Boolean
    estPlusGrand = (a > b)        ' True
    
    ' Opérateurs logiques
    Dim et As Boolean
    et = (a > 5 And b < 5)  ' True (les deux conditions sont vraies)
    Dim ou As Boolean
    ou = (a > 20 Or b < 5)  ' True (au moins une condition est vraie)
    Dim non As Boolean
    non = Not (a > b)          ' False (inverse de True)
End Sub

6. Structures conditionnelles

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    let valeur = 75;
    
    // Structure if simple
    if (valeur > 50) {
        console.log("La valeur est supérieure à 50");
    }
    
    // Structure if...else
    if (valeur > 80) {
        console.log("La valeur est supérieure à 80");
    } else {
        console.log("La valeur est inférieure ou égale à 80");
    }
    
    // Structure if...else if...else
    if (valeur > 90) {
        console.log("Excellent");
    } else if (valeur > 75) {
        console.log("Très bien");
    } else if (valeur > 60) {
        console.log("Bien");
    } else {
        console.log("À améliorer");
    }
    
    // Opérateur ternaire (if sur une ligne)
    let message = (valeur >= 60) ? "Réussite" : "Échec";
    
    // Switch
    let grade = "B";
    switch (grade) {
        case "A":
            console.log("Excellent");
            break;
        case "B":
            console.log("Très bien");
            break;
        case "C":
            console.log("Bien");
            break;
        default:
            console.log("Non classé");
            break;
    }
}

VBA

Sub StructuresConditionnelles()
    Dim valeur As Integer
    valeur = 75
    
    ' Structure If simple
    If valeur > 50 Then
        Debug.Print "La valeur est supérieure à 50"
    End If
    
    ' Structure If...Else
    If valeur > 80 Then
        Debug.Print "La valeur est supérieure à 80"
    Else
        Debug.Print "La valeur est inférieure ou égale à 80"
    End If
    
    ' Structure If...ElseIf...Else
    If valeur > 90 Then
        Debug.Print "Excellent"
    ElseIf valeur > 75 Then
        Debug.Print "Très bien"
    ElseIf valeur > 60 Then
        Debug.Print "Bien"
    Else
        Debug.Print "À améliorer"
    End If
    
    ' If sur une ligne (forme simplifiée)
    Dim message As String
    If valeur >= 60 Then message = "Réussite" Else message = "Échec"
    
    ' Select Case (équivalent du Switch)
    Dim grade As String
    grade = "B"
    
    Select Case grade
        Case "A"
            Debug.Print "Excellent"
        Case "B"
            Debug.Print "Très bien"
        Case "C"
            Debug.Print "Bien"
        Case Else
            Debug.Print "Non classé"
    End Select
End Sub

7. Boucles

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    // Boucle for (itération avec compteur)
    for (let i = 0; i < 5; i++) {
        console.log("Itération " + i);
    }
    
    // Boucle while (tant que condition vraie)
    let compteur = 0;
    while (compteur < 5) {
        console.log("Compteur: " + compteur);
        compteur++;
    }
    
    // Boucle do...while (exécute au moins une fois)
    let j = 0;
    do {
        console.log("Valeur de j: " + j);
        j++;
    } while (j < 5);
    
    // Parcourir un tableau avec for
    let fruits = ["Pomme", "Banane", "Orange"];
    for (let i = 0; i < fruits.length; i++) {
        console.log(fruits[i]);
    }
    
    // Parcourir un tableau avec for...of
    for (let fruit of fruits) {
        console.log(fruit);
    }
    
    // Parcourir un objet avec for...in
    let personne = { nom: "Dupont", age: 35, ville: "Paris" };
    for (let propriete in personne) {
        console.log(propriete + ": " + personne[propriete]);
    }
    
    // Contrôle de boucle
    for (let i = 0; i < 10; i++) {
        if (i === 3) {
            continue;  // Passe à l'itération suivante
        }
        if (i === 7) {
            break;     // Sort de la boucle
        }
        console.log(i);
    }
}

VBA

Sub Boucles()
    ' Boucle For...Next (itération avec compteur)
    Dim i As Integer
    For i = 0 To 4
        Debug.Print "Itération " & i
    Next i
    
    ' Boucle avec pas spécifique
    For i = 0 To 10 Step 2
        Debug.Print "Valeur: " & i
    Next i
    
    ' Boucle Do While (tant que condition vraie)
    Dim compteur As Integer
    compteur = 0
    Do While compteur < 5
        Debug.Print "Compteur: " & compteur
        compteur = compteur + 1
    Loop
    
    ' Boucle Do...Loop Until (jusqu'à ce que condition vraie)
    Dim j As Integer
    j = 0
    Do
        Debug.Print "Valeur de j: " & j
        j = j + 1
    Loop Until j >= 5
    
    ' Parcourir une collection
    Dim fruits As New Collection
    fruits.Add "Pomme"
    fruits.Add "Banane"
    fruits.Add "Orange"
    
    Dim fruit As Variant
    For Each fruit In fruits
        Debug.Print fruit
    Next fruit
    
    ' Parcourir une plage de cellules
    Dim cellule As Range
    For Each cellule In Range("A1:D10")
        Debug.Print cellule.Address
    Next cellule
    
    ' Contrôle de boucle
    For i = 0 To 9
        If i = 3 Then
            ' Passe à l'itération suivante
            GoTo ContinueBoucle
        End If
        
        If i = 7 Then
            ' Sort de la boucle
            Exit For
        End If
        
        Debug.Print i
ContinueBoucle:
    Next i
End Sub

8. Fonctions

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    // Appel de fonctions
    let resultat = additionner(5, 3);
    console.log("Résultat: " + resultat);
    
    // Appel de fonction avec valeur par défaut
    let message = saluer("Jean");  // Utilise "Bonjour" par défaut
    console.log(message);
    
    let autreMessage = saluer("Marie", "Bonsoir");
    console.log(autreMessage);
    
    // Fonction avec retour d'objet
    let employe = creerEmploye("Dupont", "Jean", 35);
    console.log(employe.nomComplet);
}


// Fonction simple avec retour
function additionner(a: number, b: number): number {
    return a + b;
}


// Fonction avec paramètre optionnel et valeur par défaut
function saluer(nom: string, prefixe: string = "Bonjour"): string {
    return `${prefixe} ${nom}`;
}


// Fonction retournant un objet
function creerEmploye(nom: string, prenom: string, age: number) {
    return {
        nom: nom,
        prenom: prenom,
        age: age,
        nomComplet: `${prenom} ${nom}`
    };
}

VBA

Sub Main()
    ' Appel de fonctions
    Dim resultat As Integer
    resultat = Additionner(5, 3)
    Debug.Print "Résultat: " & resultat
    
    ' Appel de fonction avec paramètre optionnel
    Dim message As String
    message = Saluer("Jean")  ' Utilise "Bonjour" par défaut
    Debug.Print message
    
    Dim autreMessage As String
    autreMessage = Saluer("Marie", "Bonsoir")
    Debug.Print autreMessage
    
    ' Utilisation de fonction avec Type personnalisé
    Dim emp As Employe
    emp = CreerEmploye("Dupont", "Jean", 35)
    Debug.Print emp.NomComplet
End Sub


' Fonction simple avec retour
Function Additionner(a As Integer, b As Integer) As Integer
    Additionner = a + b
End Function


' Fonction avec paramètre optionnel
Function Saluer(nom As String, Optional prefixe As String = "Bonjour") As String
    Saluer = prefixe & " " & nom
End Function


' Type personnalisé (équivalent à un objet)
Type Employe
    Nom As String
    Prenom As String
    Age As Integer
    NomComplet As String
End Type


' Fonction retournant un Type personnalisé
Function CreerEmploye(nom As String, prenom As String, age As Integer) As Employe
    Dim emp As Employe
    emp.Nom = nom
    emp.Prenom = prenom
    emp.Age = age
    emp.NomComplet = prenom & " " & nom
    CreerEmploye = emp
End Function

9. Manipulation des feuilles et classeurs

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    // Accéder à une feuille par nom
    let sheet1 = workbook.getWorksheet("Feuil1");
    
    // Accéder à la feuille active
    let activeSheet = workbook.getActiveWorksheet();
    
    // Vérifier si une feuille existe
    if (workbook.getWorksheet("Rapport") !== undefined) {
        console.log("La feuille Rapport existe");
    }
    
    // Créer une nouvelle feuille
    let newSheet = workbook.addWorksheet("NouvelleFeuilleOfficeScripts");
    
    // Renommer une feuille
    newSheet.setName("RapportMensuel");
    
    // Supprimer une feuille
    // Décommenter pour utiliser
    // workbook.getWorksheet("FeuilleÀSupprimer").delete();
    
    // Copier une feuille
    // Note: Office Scripts ne prend pas directement en charge la copie de feuilles
    // Il faut recréer une nouvelle feuille et copier le contenu
    
    // Déplacer une feuille (changer position)
    newSheet.setPosition(0);  // Premier onglet
    
    // Couleur d'onglet
    newSheet.setTabColor("#FF0000");  // Rouge
    
    // Parcourir toutes les feuilles
    let sheets = workbook.getWorksheets();
    for (let sheet of sheets) {
        console.log("Nom de la feuille: " + sheet.getName());
    }
}

VBA

Sub ManipulationFeuillesClasseurs()
    ' Accéder à une feuille par nom
    Dim sheet1 As Worksheet
    Set sheet1 = ThisWorkbook.Worksheets("Feuil1")
    
    ' Accéder à la feuille active
    Dim activeSheet As Worksheet
    Set activeSheet = ActiveSheet
    
    ' Vérifier si une feuille existe
    Dim sheetExists As Boolean
    On Error Resume Next
    sheetExists = Not (ThisWorkbook.Worksheets("Rapport") Is Nothing)
    On Error GoTo 0
    
    If sheetExists Then
        Debug.Print "La feuille Rapport existe"
    End If
    
    ' Créer une nouvelle feuille
    Dim newSheet As Worksheet
    Set newSheet = ThisWorkbook.Worksheets.Add
    
    ' Renommer une feuille
    newSheet.Name = "RapportMensuel"
    
    ' Supprimer une feuille
    ' Application.DisplayAlerts = False
    ' ThisWorkbook.Worksheets("FeuilleÀSupprimer").Delete
    ' Application.DisplayAlerts = True
    
    ' Copier une feuille
    ' ThisWorkbook.Worksheets("Feuil1").Copy After:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
    
    ' Déplacer une feuille (changer position)
    newSheet.Move Before:=ThisWorkbook.Worksheets(1)  ' Premier onglet
    
    ' Couleur d'onglet
    newSheet.Tab.Color = RGB(255, 0, 0)  ' Rouge
    
    ' Parcourir toutes les feuilles
    Dim sheet As Worksheet
    For Each sheet In ThisWorkbook.Worksheets
        Debug.Print "Nom de la feuille: " & sheet.Name
    Next sheet
End Sub

10. Manipulation des cellules et plages

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    let sheet = workbook.getActiveWorksheet();
    
    // Accéder à une cellule et définir une valeur
    let cell = sheet.getRange("A1");
    cell.setValue("Bonjour");
    
    // Accéder à une plage et définir plusieurs valeurs
    let range = sheet.getRange("B1:D3");
    range.setValues([
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ]);
    
    // Lire une valeur
    let valeur = sheet.getRange("A1").getValue();
    console.log("Valeur en A1: " + valeur);
    
    // Lire plusieurs valeurs
    let valeurs = sheet.getRange("B1:D3").getValues();
    console.log("Valeur en B1: " + valeurs[0][0]);
    
    // Formater une cellule
    let cellFormat = sheet.getRange("A1");
    cellFormat.getFormat().getFill().setColor("yellow");
    cellFormat.getFormat().getFont().setBold(true);
    cellFormat.getFormat().getFont().setColor("red");
    
    // Ajouter une formule
    sheet.getRange("E1").setFormula("=SUM(B1:D1)");
    
    // Formater comme tableau
    let tableRange = sheet.getRange("A5:D10");
    let table = workbook.addTable(tableRange, true);
    table.setName("MesDonn\u00E9es");
    
    // Trier des données
    let sortRange = sheet.getRange("A5:D10");
    sortRange.getSort().apply([
        { key: 0, ascending: true }  // Trier par la première colonne (A)
    ]);
    
    // Filtrer des données (via tableau)
    let filterColumn = table.getColumnByName("Prix");  // Nom de la colonne
    filterColumn.getFilter().applyCustomFilter(">100");
    
    // Fusionner des cellules
    sheet.getRange("A15:D15").merge();
    
    // Insérer une ligne
    sheet.getRange("5:5").insert("Down");
    
    // Supprimer une colonne
    sheet.getRange("E:E").delete("Left");
    
    // Ajuster la largeur des colonnes
    sheet.getRange("A:A").getFormat().setColumnWidth(120);
    
    // Ajuster la hauteur des lignes
    sheet.getRange("1:1").getFormat().setRowHeight(30);
}

VBA

Sub ManipulationCellulesPlages()
    Dim sheet As Worksheet
    Set sheet = ActiveSheet
    
    ' Accéder à une cellule et définir une valeur
    sheet.Range("A1").Value = "Bonjour"
    
    ' Accéder à une plage et définir plusieurs valeurs
    Dim data(1 To 3, 1 To 3) As Variant
    data(1, 1) = 1: data(1, 2) = 2: data(1, 3) = 3
    data(2, 1) = 4: data(2, 2) = 5: data(2, 3) = 6
    data(3, 1) = 7: data(3, 2) = 8: data(3, 3) = 9
    
    sheet.Range("B1:D3").Value = data
    
    ' Lire une valeur
    Dim valeur As Variant
    valeur = sheet.Range("A1").Value
    Debug.Print "Valeur en A1: " & valeur
    
    ' Lire plusieurs valeurs
    Dim valeurs As Variant
    valeurs = sheet.Range("B1:D3").Value
    Debug.Print "Valeur en B1: " & valeurs(1, 1)
    
    ' Formater une cellule
    With sheet.Range("A1")
        .Interior.Color = RGB(255, 255, 0)  ' Jaune
        .Font.Bold = True
        .Font.Color = RGB(255, 0, 0)  ' Rouge
    End With
    
    ' Ajouter une formule
    sheet.Range("E1").Formula = "=SUM(B1:D1)"
    
    ' Formater comme tableau
    Dim tableObj As ListObject
    Set tableObj = sheet.ListObjects.Add(xlSrcRange, sheet.Range("A5:D10"), , xlYes)
    tableObj.Name = "MesDonnées"
    
    ' Trier des données
    sheet.Range("A5:D10").Sort Key1:=sheet.Range("A5"), Order1:=xlAscending
    
    ' Filtrer des données
    sheet.Range("A5:D10").AutoFilter Field:=2, Criteria1:=">100"  ' Filtre colonne B
    
    ' Fusionner des cellules
    sheet.Range("A15:D15").Merge
    
    ' Insérer une ligne
    sheet.Rows("5:5").Insert Shift:=xlDown
    
    ' Supprimer une colonne
    sheet.Columns("E:E").Delete Shift:=xlToLeft
    
    ' Ajuster la largeur des colonnes
    sheet.Columns("A:A").ColumnWidth = 15
    
    ' Ajuster la hauteur des lignes
    sheet.Rows("1:1").RowHeight = 30
End Sub

11. Cas pratiques

Exemple 1: Mise en forme conditionnelle

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    // Appliquer une mise en forme conditionnelle sur une plage
    let sheet = workbook.getActiveWorksheet();
    let dataRange = sheet.getRange("B2:B10");
    
    // Valeurs supérieures à 70 en vert
    dataRange.conditionalFormats.add(
        ExcelScript.ConditionalFormatType.cellValue
    ).getCellValueOrRule().setRule({
        formula1: "70",
        operator: ExcelScript.ConditionalCellValueOperator.greaterThan
    }).getFormat().getFill().setColor("green");
    
    // Valeurs inférieures à 40 en rouge
    dataRange.conditionalFormats.add(
        ExcelScript.ConditionalFormatType.cellValue
    ).getCellValueOrRule().setRule({
        formula1: "40",
        operator: ExcelScript.ConditionalCellValueOperator.lessThan
    }).getFormat().getFill().setColor("red");
}

VBA

Sub MiseEnFormeConditionnelle()
    Dim sheet As Worksheet
    Set sheet = ActiveSheet
    Dim dataRange As Range
    Set dataRange = sheet.Range("B2:B10")
    
    ' Supprimer les formats existants
    dataRange.FormatConditions.Delete
    
    ' Valeurs supérieures à 70 en vert
    dataRange.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, Formula1:="70"
    dataRange.FormatConditions(1).Interior.Color = RGB(0, 255, 0)  ' Vert
    
    ' Valeurs inférieures à 40 en rouge
    dataRange.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, Formula1:="40"
    dataRange.FormatConditions(2).Interior.Color = RGB(255, 0, 0)  ' Rouge
End Sub

Exemple 2: Rapport automatisé

Office Scripts

function main(workbook: ExcelScript.Workbook) {
    // Créer un rapport simple à partir de données
    
    // Accéder aux feuilles
    let dataSheet = workbook.getWorksheet("Données");
    
    // Créer une feuille de rapport si elle n'existe pas
    let reportSheet = workbook.getWorksheet("Rapport");
    if (!reportSheet) {
        reportSheet = workbook.addWorksheet("Rapport");
    } else {