Récupérer un fichier dont le code VBA est corrompu

Parfois le code VBA d'un fichier Excel peut être corrompu. Les raisons peuvent être multiples, mais très franchement, je me suis focalisé sur les solutions :-). En voici une qui a fonctionné pour récupérer le fichier excel (pas le code VBA) dans le cas où vous ne pouvez pas voir le contenu d'un module et que l'enregistrement ne fonctionne plus. Sans garantie que cela fonctionne dans votre cas.

Récupérer le fichier excel (sans le code VBA)

Voici comment enlever tout le code du fichier sans avoir besoin de l'ouvrir.

ATTENTION, toujours travailler sur une copie du fichier.

  1. Changer l'extension du fichier en .zip (il faut que les extensions soient visibles)
  2. Ouvrir le fichier zippé, avancer jusque : /xl/
  3. Supprimer le fichier vbaProject.bin
  4. Sauvegarder le fichier zippé
  5. Renommer l'extension du fichier en .xlsm
  6. Ouvrir le fichier et l'enregistrer sous un nouveau nom pour voir si la corruption est toujours présente.

En espérant que cela vous aidera !

Comment numéroter (incrémenter) automatiquement ses numéros de factures ou d'autres clefs ?

Cet article couvre les 15 premières minutes de la formation sur les tableaux que je donne ici.

Cette question des numéros de facture est peut-être la plus ancienne d'Excel, mais elle est toujours parmi les plus demandés ! Il existe de nombreux réponses possibles, mais voici un code un peu plus poussé qui présente beaucoup d'avantages :

  • Pas d'utilisation de la solution avec xlUp qui peut générer des erreurs si des données sont entrées en dessous de la table ou si on dépasse un certain nombre de lignes - en fonction du code trouvé sur internet.
  • Gestion du cas d'une table vide.
  • Possibilité d'ajouter très rapidement plusieurs lignes au lieu d'une seule.
  • Positionnement direct sur la dernière ligne après l'ajout.
  • Avec un tableau, les formules et les formats sont recopiés automatiquement vers le bas.

Téléchargez le fichier.

Installation en vidéo

Pour un nouveau fichier

  • Utilisez un tableau structuré pour stocker vos factures : Accueil, Mettre sous forme de tableau
  • Renommez le tableau structuré, ici T_Data
  • Suivre la suite des étapes

Pour un fichier existant contenant déjà un tableau structuré

  • Copiez le code ci-dessous dans un nouveau module : ALT+F11, Insertion - Module
  • Revenez sur Excel, puis ajoutez un bouton.
    Vous pouvez utiliser les nouveautés d'Excel avec Insertion :
  • Associez-y ce code via un clic droit sur l’icône, affecter une macro et choisir AjouterUneLigne.

Explication du code en vidéo

Le code

Option Explicit
Sub AjouterUneLigne()
    AjouterNLignes loData, 1, 1
    GoToDerniereLigneDuTableau loData, 10
End Sub
Sub Ajouter5Lignes()
    AjouterNLignes loData, 5, 1
    GoToDerniereLigneDuTableau loData, 10
End Sub
Private Sub GoToDerniereLigneDuTableau(loTable As ListObject, nLignesVisibles As Long)
    Dim rLastCell As Range
    Set rLastCell = loTable.DataBodyRange.Resize(1, 1).Offset(loTable.DataBodyRange.Rows.Count - 1)
    On Error Resume Next 'au cas ou on est en haut de la feuille
    Application.Goto rLastCell.Offset(-nLignesVisibles, 1), True
    On Error GoTo 0
    Application.Goto rLastCell, False
End Sub
Private Sub AjouterNLignes(loTable As ListObject, nRow As Long, lColKey As Long)
    'on aurait pu faire une boucle ajoutant nRow lignes,
    'mais le redimensionnement - resize - est (beaucoup) plus rapide que l'ajout
    'd'une ligne à la suite.
    Dim lMax As Long
    Dim lNbRowsStart As Long
    'aucune donnee, on demarre la numerotation a 1
    If loTable.DataBodyRange Is Nothing Then
        loTable.ListRows.Add (1)
        If nRow <> 1 Then loTable.Resize loTable.Range.Resize(loTable.Range.Rows.Count + nRow - 1)
        loTable.DataBodyRange.Resize(, 1).Offset(, lColKey - 1).Value = _
            fctSequence(nRow, 1, 1, 1)
            'Application.WorksheetFunction.Sequence(nRow, 1)'unqiuement en excel 365
    Else
        lNbRowsStart = loTable.DataBodyRange.Rows.Count
        lMax = Application.WorksheetFunction.Max(loTable.DataBodyRange.Columns(lColKey))
        loTable.Resize loTable.Range.Resize(loTable.Range.Rows.Count + nRow)
        loTable.DataBodyRange.Resize(nRow, 1).Offset(lNbRowsStart, lColKey - 1).Value = _
            fctSequence(nRow, 1, lMax + 1, 1)
        'Application.WorksheetFunction.Sequence(nRow, 1, lMax + 1) 'si vous etes en excel 365
    End If
End Sub
Private Function fctSequence(lRow As Long, lCol As Long, lStart As Long, lStep As Long)
    Dim arrSequence As Variant
    ReDim arrSequence(1 To lRow, 1 To lCol) As Variant
    Dim lRowLoop As Long, lColLoop As Long
    Dim lValue As Long
    lValue = lStart
    For lRowLoop = 1 To lRow
        For lColLoop = 1 To lCol
            arrSequence(lRowLoop, lColLoop) = lValue
            lValue = lValue + lStep
        Next
    Next
    fctSequence = arrSequence
End Function
Private Function loData() As ListObject
    'Set loData = wksData.ListObjects("T_Data") 'au cas où l'on veut faire fonctionner la macro a partir d'une autre feuille
    Set loData = ActiveSheet.ListObjects(1)
End Function

Liste déroulante avec données complémentaires (Excel 365)

Dans la continuité de mon précédent post, voici une autre solution qui offre deux avantages :

  • Pas besoin de colonne supplémentaire dans la table
  • Pas de message d'erreur sur la cellule

Par contre, la formule est beaucoup plus complexe à créer, mais facile à implanter; chanceux que vous êtes !!!

La vidéo explique dans le détail et vous pouvez retrouver le fichier ici :