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
- Présentation générale
- Configuration de l’environnement
- Structure de base d’un script
- Variables et types de données
- Opérateurs
- Structures conditionnelles
- Boucles
- Fonctions
- Manipulation des feuilles et classeurs
- Manipulation des cellules et plages
- Cas pratiques
- 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 :
- Ouvrir Excel Online via Microsoft 365
- Cliquer sur l’onglet “Automatiser”
- 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 :
- Activer l’onglet Développeur (Fichier > Options > Personnaliser le ruban)
- 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 Sub4. 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 SubComparaison 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 Sub6. 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 Sub7. 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 Sub8. 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 Function9. 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 Sub10. 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 Sub11. 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 SubExemple 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 {