Vba vers Python
RésoluBruno83200_6929 Messages postés 570 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 16 août 2025 -
2 réponses
1 juil. 2025 à 13:28
Implémentation de CLEAR_Click avec openpyxl :
Oui, vous pouvez recréer la fonctionnalité de votre bouton CLEAR_Click en Python avec une bibliothèque comme openpyxl. Le code VBA que vous avez fourni pour CLEAR_Click efface le contenu de certaines plages de cellules dans Excel. Ce comportement peut être reproduit en Python, et je vais vous montrer comment ci-dessous.
Cependant, contrairement à VBA où le bouton et le code sont directement intégrés dans Excel, avec Python, vous devrez soit exécuter le script manuellement (via un terminal ou un IDE), soit utiliser un outil comme xlwings pour lier un bouton Excel à un script Python.
En Python, un bouton dans Excel n'est pas directement un "objet" manipulé par le script, sauf si vous utilisez une bibliothèque comme xlwings pour interagir avec l'interface Excel. Avec openpyxl, vous ne créez pas de bouton dans Excel ; vous exécutez simplement un script qui modifie le fichier. Avec xlwings, vous pouvez associer un bouton Excel à une fonction Python, comme en VBA. La déclaration de la fonction Python est différente de VBA (def au lieu de Private Sub), mais la logique reste similaire.
Voici un code Python qui combine l'équivalent de BoutonExport_Click et CLEAR_Click dans un seul fichier, en utilisant openpyxl. Ce code peut être exécuté manuellement pour modifier votre fichier Excel.
Installez Python et openpyxl si ce n'est pas déjà fait.
Remplacez "votre_fichier.xlsx" par le chemin réel de votre fichier Excel.
import openpyxl from openpyxl.utils import get_column_letter def export_data(): # Charger le fichier Excel file_path = "votre_fichier.xlsx" # Remplacez par le chemin de votre fichier wb = openpyxl.load_workbook(file_path) # Sélectionner les feuilles ws = wb.active # Feuille active (ou spécifiez wb["NomFeuille"]) ws_archive = wb["Archive"] # Paramètres équivalents à ceux du VBA plilr = 15 # Première ligne delr = 30 # Dernière ligne pco = 3 # Première colonne st = 3 # Pas pour les colonnes dat = ws["L6"].value # Valeur de la cellule L6 # Trouver la dernière ligne occupée dans la feuille Archive liar = ws_archive.max_row + 1 ok = False # Boucle sur les colonnes et lignes for c in range(pco, 13, st): # De la colonne 3 à 12 avec un pas de 3 for li in range(plilr, delr + 1): # De la ligne 15 à 30 cell_value = ws[f"{get_column_letter(c)}{li}"].value if cell_value is not None and cell_value != "": ws_archive[f"A{liar}"].value = dat ws_archive[f"B{liar}"].value = cell_value liar += 1 ok = True # Si des données ont été archivées, appeler clear_data if ok: clear_data(ws) print("Les données sont archivées") else: print("Il n'y a pas de données à archiver!") # Sauvegarder les modifications wb.save(file_path) def clear_data(ws): # Effacer les plages spécifiées (équivalent à CLEAR_Click) ranges = ["C15:C30", "F15:F30", "I15:I30", "L15:L30", "I9"] for cell_range in ranges: if ":" in cell_range: # Plage de cellules start_cell, end_cell = cell_range.split(":") start_col, start_row = openpyxl.utils.coordinate_to_tuple(start_cell) end_col, end_row = openpyxl.utils.coordinate_to_tuple(end_cell) for row in range(start_row, end_row + 1): for col in range(start_col, end_col + 1): ws[f"{get_column_letter(col)}{row}"].value = None else: # Cellule unique (ex. I9) ws[cell_range].value = None if __name__ == "__main__": export_data()
Enregistrez le code dans un fichier nommé archive_and_clear.py.
Fermez votre fichier Excel.
Exécutez le script depuis un terminal :
python archive_and_clear.py
Le script archive les données (comme BoutonExport_Click) et, si des données sont archivées, efface les plages spécifiées (comme CLEAR_Click).
Vous ne pouvez pas lier ce script directement à un bouton dans Excel avec openpyxl.
Vous devez exécuter le script manuellement chaque fois que vous voulez effectuer l'action.
Si vous souhaitez continuer d'utiliser votre bouton dans Excel, il faut utilisez xlwings. Mais cela devient plus complexe.
1 juil. 2025 à 09:35
Bonjour,
Oui, il est tout à fait possible de transposer un code VBA en Python pour Excel, notamment en utilisant des bibliothèques comme openpyxl ou xlwings, qui permettent de manipuler des fichiers Excel de manière similaire à VBA. Cependant, il y a quelques points à considérer :
Avec les restrictions croissantes de Microsoft sur les macros VBA (notamment à cause de problèmes de sécurité), Python est une alternative puissante et flexible. Cependant, contrairement à VBA, qui est intégré à Excel, Python nécessite une installation séparée (Python et les bibliothèques nécessaires) et ne s'exécute pas directement dans Excel. Vous devrez exécuter le script Python depuis un environnement externe (comme un IDE ou une ligne de commande) ou utiliser des outils comme xlwings pour une intégration plus poussée.
Vous devez connaître la programmation Python qui doit être installé sur votre machine avec les bibliothèques utilisées.
Voici une version Python de votre code VBA, utilisant openpyxl :
import openpyxl from openpyxl.utils import get_column_letter # Charger le fichier Excel file_path = "votre_fichier.xlsx" # Remplacez par le chemin de votre fichier wb = openpyxl.load_workbook(file_path) # Sélectionner les feuilles ws = wb.active # Feuille active (ou spécifiez wb["NomFeuille"]) ws_archive = wb["Archive"] # Paramètres équivalents à ceux du VBA plilr = 15 # Première ligne delr = 30 # Dernière ligne pco = 3 # Première colonne st = 3 # Pas pour les colonnes dat = ws["L6"].value # Valeur de la cellule L6 # Trouver la dernière ligne occupée dans la feuille Archive liar = ws_archive.max_row + 1 ok = False # Boucle sur les colonnes et lignes for c in range(pco, 13, st): # De la colonne 3 à 12 avec un pas de 3 for li in range(plilr, delr + 1): # De la ligne 15 à 30 cell_value = ws[f"{get_column_letter(c)}{li}"].value if cell_value is not None and cell_value != "": ws_archive[f"A{liar}"].value = dat ws_archive[f"B{liar}"].value = cell_value liar += 1 ok = True # Sauvegarder les modifications wb.save(file_path) # Afficher un message (équivalent à MsgBox) if ok: print("Les données sont archivées") # Si vous avez une fonction CLEAR_Click, elle doit être implémentée séparément else: print("Il n'y a pas de données à archiver!")
Modifié le 1 juil. 2025 à 13:14
Bonjour , je vous remercie de votre réponse rapide et plutôt détaillée.
vous me dites " Si vous avez une fonction CLEAR_Click, elle doit être implémentée séparément"
C'est à dire que je peux créer le bouton sur excel comme avant mais pour qu'il puisse agir comme il le faisait avant je dois également écrire son code via une bibliothèque du genre "openpyxl" comme pour l'exemple que vous m'avez fait ?
et doit-il être dans une feuille à part ou je peux recommencer un code après celui de cet exemple un peu comme en vba où on pouvais récrire après un "end sub".
Si je fais tout cela je pourrais utiliser seulement mon fichier excel comme avant ou je devrais lancer d'autres outil en même temps que l'excel pour le code fonctionne ?
je crois me souvenir qu'en python un bouton est considère en objet ?
donc la déclaration de mon code va être différente ?
Private Sub CLEAR_Click()
Range("C15", "C30").ClearContents
Range("F15", "F30").ClearContents
Range("I15", "I30").ClearContents
Range("L15", "L30").ClearContents
Range("I9").ClearContents
End Sub
En vous remerciant