IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Erreur VBA de 2003 à 2007, seulement après fermeture du fichier


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 28
    Points : 11
    Points
    11
    Par défaut Erreur VBA de 2003 à 2007, seulement après fermeture du fichier
    Bonjour à tous,
    j'ai une macro qui tourne sous 2003, je souhaite la faire passer sur 2007... Tout fonctionne au sein de la macro mais qd je ferme le fichier 2007 et que je le reouvre, j'ai l'erreur :

    Excel found unreadable content in '2007.xlsm'. Do you want to recover the contents of this workbook? If you trust the source of this workbook, click Yes.
    Puis à l'ouverture :
    Removed Feature: Data validation from /xl/worksheets/sheet1.xml part
    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    - <recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <logFileName>error031680_01.xml</logFileName>
    <summary>Errors were detected in file 'G:\...\2007.xlsm'</summary>
    - <removedFeatures summary="Following is a list of removed features:">
    <removedFeature>Removed Feature: Data validation from /xl/worksheets/sheet1.xml part</removedFeature>
    </removedFeatures>
    </recoveryLog>

    Mon code est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim Lst As String
    Dim c As Range
     
    If Target.Count = 1 And Target.Column = 1 And Target.Row > 1 Then
        If Target.Value <> "" Then
        Application.ScreenUpdating = False
            Target.Offset(0, 10).Validation.Delete
            With Sheets("Contacts")
                .AutoFilterMode = False
                .Range("Company").AutoFilter Field:=4, Criteria1:=Target.Value
                For Each c In .Range("Contact").SpecialCells(xlCellTypeVisible)
                    If c.Row > 1 Then Lst = Lst & "," & c.Value
                Next c
                .AutoFilterMode = False
            End With
            Lst = Mid(Lst, 2)
            If Lst <> "" Then Target.Offset(0, 10).Validation.Add Type:=xlValidateList, Formula1:=Lst
        Else
            Application.EnableEvents = False
            Target.Offset(0, 10).ClearContents
            Application.EnableEvents = True
        End If
    End If
    End Sub
     
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim Kol As New Collection
    Dim Lst As String
    Dim i As Integer
    Dim c As Range
     
    If Target.Count = 1 And Target.Column = 1 And Target.Row > 1 Then
        Target.Validation.Delete
        With Sheets("Contacts")
            For Each c In .Range("Company")
                On Error Resume Next
                Kol.Add c.Value, c.Value
                On Error GoTo 0
            Next c
        End With
        For i = 1 To Kol.Count
            Lst = Lst & "," & Kol(i)
        Next i
        Lst = Mid(Lst, 2)
        If Lst <> "" Then Target.Validation.Add Type:=xlValidateList, Formula1:=Lst
    End If
    End Sub
    J'ai déjà retiré Application.ScreenUpdating = False, cela crée la meme erreur.

    Ca retire donc toutes mes listes, j'enregistre autre part, fais quelques modifs et le problème resurgit.

    Je cherche depuis 3j et suis récent en VBA donc je ne sais pas trop quelle partie du code ne peut s'appliquer à 2007,

    Merci de votre aide future,
    efesdark.

  2. #2
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    Le message d'erreur semble dire que le contenu d'une validation ne lui plait pas.
    Je serais toi, je vérifierais les valeurs de Lst que tu utilises comme validation.
    Soit tu fais une exécution pas à pas si tu as peu de cellule, soit tu fais en sorte que le contenu de Lst soit afficher dans le contenu de la cellule à coté de celle contenant la validation sus nommée

    A mon avis plutôt que de faire une boucle (For Each C...), tu devrais pouvoir directement faire référence à l'address de la plage en utilisant Resize pour supprimer la ligne 1.

    Ça ressemblerait à un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range("Contact").offset(1).resize(.Range("Contact").rows.count-1).SpecialCells(xlCellTypeVisible).address
    ++
    Qwaz

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Merci Qwazerty, je vais essayer de modifier cette partie de code.

    En tapant l'erreur affichée sur internet, j'ai vu que certains américains expliquaient que mnt des listes de validation créés classiquement réutilisées ds une macro posaient pb pour toute chaine supérieure à 255 caractères, ce qui est ridiculement peu élevé et essayait de contourner le pb.

    Qqn a t-il déjà entendu qqch ds le genre ?

    Merci,
    efesdark.

  4. #4
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    255 correspond à un type byte et Microsoft en laisse malheureusement traîner partout....
    Si les cellules sont consécutives il est préférable d'utiliser l'adresse du groupe, ainsi au lieu d'avoir A1;A2;A3 tu as A1:A3 ce qui utilise bien moins de caractère, d'autant plus si le nombre de cellule est très élevés.
    J'ai eu un soucis similaire j'ai fait cette petite function

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Function LongAddressToRange(ByVal StrRange As String, Ws As Worksheet) As Range
    'Permet de passer une chaine de plus de 255 caracteres à la function Range
    Dim iStart As Integer, byLen As Byte
    Dim Sepa As String
     
    'On teste le type de separateur demander (il change entre , et ; .....)
    On Error Resume Next
        Set LongAddressToRange = Ws.Range("A1,A2")
        If LongAddressToRange Is Nothing Then
            Sepa = ";"
            StrRange = Replace(StrRange, ",", ";")
        Else
            Sepa = ","
        End If
        Set LongAddressToRange = Nothing
    On Error GoTo 0
     
        iStart = 1
        byLen = 0
        Do
            If Len(StrRange) > iStart + 254 Then
                byLen = InStr(240 + iStart, StrRange, Sepa) - iStart
            Else
                byLen = Len(StrRange) - (iStart) + 1
            End If
     
            If LongAddressToRange Is Nothing Then
                Set LongAddressToRange = Ws.Range(Mid(StrRange, iStart, byLen))
            Else
                Set LongAddressToRange = Union(LongAddressToRange, Ws.Range(Mid(StrRange, iStart, byLen)))
            End If
            If iStart + byLen < Len(StrRange) Then iStart = iStart + byLen + 1 Else StrRange = ""
        Loop Until StrRange = ""
    Exit Function
     
    End Function
    Elle te permet de passer ta liste de cellule et la convertie en Range, par la suite tu peux utiliser l'address de ce range. Attention toute fois, si tes cellules ne sont pas suffisamment consécutives et que l'address fait plus de 255 caractères tu aura le même soucis.
    C'est peut être pas super élégant, mais ça m'a permis de résoudre rapidement mon problème.

    ++
    Qwaz

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Merci, je ne suis pas très familier avec les Function.
    Je dois juste renseigner ma liste dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set LongAddressToRange = Ws.Range("A1,A2")
    Et l'insérer dans mon code ??
    Et si ma liste est une colonne entière d'un tableau créé, peut-il se renseigner comme Table[Company] par ex?

    Merci d'avance pr ton aide.

  6. #6
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Non, tu places la function tel quelle dans un module, inutile de modifier son contenu.
    Puis dans ton code lorsque tu veux obtenir l'adresse en fonction de ta string

    tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Lst = LongAddressToRange(Lst, target.worksheet).address
    Il serait même plus sérieux de contrôler que la function renvoie bien un range valide pour éviter des plantages:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Dim TheRange as range
     
    '[...]
     
    'On récupère le range retourné par la function
    On error resume next
    Set TheRange = LongAddressToRange(Lst, target.worksheet)
    On error goto 0
     
    'On verifie que celui-ci est valide
    If not therange is Nothing Then
       'Si il est valide, on prend le contenu de sa propriété Address que l'on applique en tant que Validation
       Lst = therange.address
       Target.Offset(0, 10).Validation.Add Type:=xlValidateList, Formula1:=Lst
    end If
     
    '[...]
    ++
    Qwaz

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    En fait ca m'embrouille pas mal, mode Boulet [ON].

    J'ai voulu juste créer mes listes à l'ouverture de mon fichier et les supprimer à sa fermeture. Penses tu que cela pourrait être une solution viable?

    Merci de cette partie code, je comprends ce que cela fait, mais ca m'embrouille car je ne sais pas quelle partie de mon 1er code cela doit remplacer, + j'ai 2 listes à créer, elles sont : dans "Contacts" colonne 4 (company)et colonne 14 (contact), et dans mon onglet sélectionné, la liste company doit pouvoir être choisi dans chaque cellule de la 1ere colonne et en fct de ce choix, la liste liée Contact doit pouvoir être choisi en colonne 10.

    donc cette partie de code, je dois l'appliquer aux 2, qu à une des 2 ? dans quelle partie de mon code?

    Merci.

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Désolé, c'est moi qui m'emballe un peu.
    Avant d'utiliser une quelconque functio, essai déjà ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim Lst As String
    Dim c As Range
     
    If Target.Count = 1 And Target.Column = 1 And Target.Row > 1 Then
        If Target.Value <> "" Then
            Application.ScreenUpdating = False
            Target.Offset(0, 10).Validation.Delete
            With Sheets("Contacts")
                .AutoFilterMode = False
                .Range("Company").AutoFilter Field:=4, Criteria1:=Target.Value
                Lst = .Range("Contact").Offset(1).Resize(.Range("Contact").Rows.Count - 1).SpecialCells(xlCellTypeVisible).Address
                'For Each c In .Range("Contact").SpecialCells(xlCellTypeVisible)
                '    If c.Row > 1 Then Lst = Lst & "," & c.Value
                'Next c
                .AutoFilterMode = False
            End With
            Application.ScreenUpdating = True
           'Lst = Mid(Lst, 2)
            If Lst <> "" Then Target.Offset(0, 10).Validation.Add Type:=xlValidateList, Formula1:=Lst
        Else
            Application.EnableEvents = False
            Target.Offset(0, 10).ClearContents
            Application.EnableEvents = True
        End If
    End If
    End Sub
    Essai de fournir un petit fichier demo stp.

    ++
    Qwaz

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2011
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Bonjour Qwaz, merci de ton aide. Pr le moment, j'ai remarqué que c'était la validation de données qui crééait le problème. C'est pourquoi je les retire avant de fermer.
    Pour le moment, et cela peut-être sur le court terme, cela semble me convenir.

    Pour info, j'ai essayé ton bout de macro, ds ma seconde liste en K, il renvoie pas les noms mais des trucs du genre $N$8, $N$11....

    A+

  10. #10
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    Salut
    J'avais oublier de rajouter un "=" devant... mais je viens de vérifier, en fait ça ne fonctionne pas, il n'est pas possible d'utiliser les unions dans une validation.
    ta liste de valeur semble donc limité a 255 caractères si tel est ce que tu as lu à ce sujet.
    [Edit]
    Je viens de faire le teste 256 caractères max en effet...
    [/Edit]

    Une autre solution serait de copier les valeurs dans une autre colonne en les plaçant les unes à la suite des autres et de faire référence à cette colonne pour ta validation. Par contre si tu fais une modif dans cette autre colonne, la modif se répercutera sur l’ensemble des validation qui référence la colonne en question.

    ++
    Qwaz

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/08/2014, 11h15
  2. [XL-2010] VBAPROJECT reste ouvert après fermeture du fichier
    Par Oliv- dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/04/2014, 16h01
  3. [AC-2007] basculer de 2003 à 2007, erreur vba
    Par fredo2009 dans le forum VBA Access
    Réponses: 10
    Dernier message: 28/10/2010, 12h01
  4. Réponses: 2
    Dernier message: 17/07/2007, 11h53
  5. [VBA-Word] lancement de macro à la fermeture de fichier
    Par perophron dans le forum VBA Word
    Réponses: 2
    Dernier message: 22/06/2007, 15h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo