Vba vers Python

Résolu
alexis4489 Messages postés 88 Date d'inscription mercredi 3 mars 2021 Statut Membre Dernière intervention 1 juillet 2025 - 1 juil. 2025 à 09:11
Bruno83200_6929 Messages postés 570 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 16 août 2025 -

Bonjour, depuis peu j'ai des petits soucis avec mes fichiers qui ont des macro ou du code VBA ceux-ci sont bloqués par Windows et d’après ce que j'ai pu lire cela ne vas pas aller en s’améliorant.

En effectuant mes recherches j'ai pu voir qu'une alternative au vba sera d'utiliser du "python' sur excel tout ce que je sais, c'est que c'est un langage de codage.

Est-il possible de transposer un code vba dans un fichier excel pour pouvoir continuer à l'utiliser comme avant et si oui comment faire ?

voici un code vba qui fontionne.

Private Sub BoutonExport_Click()
plilr = 15: delr = 30: pco = 3: st = 3
dat = Range("L6")
Set shar = Sheets("Archive")

liar = shar.Cells(Rows.Count, 1).End(xlUp).Row + 1
ok = fasle
'boucle sur données, colonnes/lignes
Application.EnableEvents = False
For c = pco To 12 Step st
    For li = plilr To delr
        If Cells(li, c) <> "" Then
            shar.Cells(liar, 1) = dat
            shar.Cells(liar, 2) = Cells(li, c)
            liar = liar + 1
            ok = True
        End If
    Next li
Next c
If ok = True Then
    CLEAR_Click
    MsgBox "Les données sont archivées"
Else
    MsgBox "Il n'y a pas de données à archiver!"
End If
Application.EnableEvents = True

End Sub

merci d'avance pour votre temps.


Windows / Firefox 138.0

2 réponses

Bruno83200_6929 Messages postés 570 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 16 août 2025 114
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
Bruno83200_6929 Messages postés 570 Date d'inscription jeudi 18 juin 2020 Statut Membre Dernière intervention 16 août 2025 114
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!")

0
alexis4489 Messages postés 88 Date d'inscription mercredi 3 mars 2021 Statut Membre Dernière intervention 1 juillet 2025 2
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

0

Discussions similaires