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

Par­fois le code VBA d’un fichi­er Excel peut être cor­rompu. Les raisons peu­vent être mul­ti­ples, mais très franche­ment, je me suis focal­isé sur les solu­tions :-). En voici une qui a fonc­tion­né pour récupér­er le fichi­er excel (pas le code VBA) dans le cas où vous ne pou­vez pas voir le con­tenu d’un mod­ule et que l’en­reg­istrement ne fonc­tionne plus. Sans garantie que cela fonc­tionne dans votre cas. 

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

Voici com­ment enlever tout le code du fichi­er sans avoir besoin de l’ouvrir.

ATTENTION, tou­jours tra­vailler sur une copie du fichier.

  1. Chang­er l’ex­ten­sion du fichi­er en .zip (il faut que les exten­sions soient vis­i­bles)
  2. Ouvrir le fichi­er zip­pé, avancer jusque : /xl/
  3. Sup­primer le fichi­er vbaProject.bin
  4. Sauve­g­arder le fichi­er zippé
  5. Renom­mer l’ex­ten­sion du fichi­er en .xlsm
  6. Ouvrir le fichi­er et l’en­reg­istr­er sous un nou­veau nom pour voir si la cor­rup­tion est tou­jours présente.

En espérant que cela vous aidera !

En cadeau de bien­v­enue : les 7 com­bi­naisons de touch­es indis­pens­ables sur Excel

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

Cet arti­cle cou­vre les 15 pre­mières min­utes de la for­ma­tion sur les tableaux que je donne ici. 

Cette ques­tion des numéros de fac­ture est peut-être la plus anci­enne d’Ex­cel, mais elle est tou­jours par­mi les plus demandés ! Il existe de nom­breux répons­es pos­si­bles, mais voici un code un peu plus poussé qui présente beau­coup d’avantages : 

  • Pas d’u­til­i­sa­tion de la solu­tion avec xlUp qui peut génér­er des erreurs si des don­nées sont entrées en dessous de la table ou si on dépasse un cer­tain nom­bre de lignes — en fonc­tion du code trou­vé sur internet.
  • Ges­tion du cas d’une table vide.
  • Pos­si­bil­ité d’a­jouter très rapi­de­ment plusieurs lignes au lieu d’une seule.
  • Posi­tion­nement direct sur la dernière ligne après l’ajout.
  • Avec un tableau, les for­mules et les for­mats sont recopiés automa­tique­ment vers le bas. 

Téléchargez le fichier.

Installation en vidéo

Pour un nouveau fichier

  • Utilisez un tableau struc­turé pour stock­er vos fac­tures : Accueil, Met­tre sous forme de tableau
  • Renom­mez le tableau struc­turé, ici T_Data
  • Suiv­re la suite des étapes

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

  • Copiez le code ci-dessous dans un nou­veau mod­ule : ALT+F11, Inser­tion — Module
  • Revenez sur Excel, puis ajoutez un bou­ton.
    Vous pou­vez utilis­er les nou­veautés d’Ex­cel 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
En cadeau de bien­v­enue : les 7 com­bi­naisons de touch­es indis­pens­ables sur Excel

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

Dans la con­ti­nu­ité de mon précé­dent post, voici une autre solu­tion qui offre deux avantages : 

  • Pas besoin de colonne sup­plé­men­taire dans la table
  • Pas de mes­sage d’er­reur sur la cellule

Par con­tre, la for­mule est beau­coup plus com­plexe à créer, mais facile à implanter; chanceux que vous êtes !!!

La vidéo explique dans le détail et vous pou­vez retrou­ver le fichi­er ici :

En cadeau de bien­v­enue : les 7 com­bi­naisons de touch­es indis­pens­ables sur Excel