Problème vba compatibilité entre Excel 2010 et 2003

Résolu/Fermé
L28 Messages postés 157 Date d'inscription mercredi 19 novembre 2008 Statut Membre Dernière intervention 27 octobre 2019 - Modifié par L28 le 7/05/2013 à 16:20
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 - 22 sept. 2014 à 22:27
Bonjour!

J'ai (encore) un soucis sous excel ou plutôt la programmation Vba. De ce fait je crée mon quatrième (et j'espère dernier) topic pour cet exercice/microprogramme.

Bon d'un coté 4 questions pour 11 modules, un Userform et surtout un débutant qui découvre le vba sur le tas je pense que je suis excusable ^^.

Cette fois-ci mon problème est issu d'un manque de compatibilité entre excel 2010 et le 2003. je vous explique:

Dans mon usine à gaz, j'ai découvert que l'utilisation de certains événements tels que le Change, rendaient les boutons (annuler/répéter) inutilisables...

J'ai donc créé une méthode undo assez... simple qui stocke, pour chaque cellule d'une certaine plage, les données précédemment entrées.

Tout cela fonctionne sauf que pour le "Design" j'ai rajouté un compteur dans un rectangle pour montrer le nombre de "undo" encore disponibles.

Et là j'ai une erreur que je ne comprend pas:
"Impossible de définir la propriété Text de la classe Characters"

Feuil1.Shapes("IndUndo").TextFrame.Characters.Text = ComptUndo


Cela pourrait être compréhensible si la même commande utilisé 20 lignes plus haut ne fonctionnait pas non plus... Or pour augmenter la valeur du compteur ma formule fonctionne, mais pour la réduire non...

Voici mon code, cela pourra peut être aider aussi certains...
Public Sauv(7, 19, 10) As String, ModifAuto As Boolean, ListeUndo(19) As String, ComptUndo As Integer 

Sub SauvAction(Cellule As Range) 

If Cellule.Rows.Count = 1 And Cellule.Columns.Count = 1 Then 
    Ligne = Cellule.Row - 27 
    Colonne = Cellule.Column - 31 

    If Ligne >= 0 And Colonne >= 0 Then 
        If Sauv(Colonne, Ligne, 0) <> "" Then 
            For i = 0 To 9 
                Sauv(Colonne, Ligne, 10 - i) = Sauv(Colonne, Ligne, 9 - i) 
            Next i 
        End If 
        Sauv(Colonne, Ligne, 0) = Cellule.Value 
         
        If ListeUndo(0) <> "" Then 
            For i = 0 To 18 
                ListeUndo(19 - i) = ListeUndo(18 - i) 
            Next i 
        End If 
        ListeUndo(0) = Cellule.Address 
        ComptUndo = ComptUndo + 1 
    End If 
        Else 
            ComptUndo = 0 
            Erase Sauv 
            Erase ListeUndo 
        End If 
        Feuil1.Shapes("IndUndo").TextFrame.Characters.Text = ComptUndo 
End Sub 
-------------------------------------------------------------------------------------------------- 
Sub Undo() 

If ListeUndo(0) <> "" Then 
    ModifAuto = True 
    Ligne = Range(ListeUndo(0)).Row - 27 
    Colonne = Range(ListeUndo(0)).Column - 31 
     
    Range(ListeUndo(0)) = Sauv(Colonne, Ligne, 1) 
     
    For i = 0 To 9 
        Sauv(Colonne, Ligne, i) = Sauv(Colonne, Ligne, i + 1) 
    Next i 
       
    For i = 0 To 18 
        ListeUndo(i) = ListeUndo(i + 1) 
    Next i 
    ModifAuto = False 
    ComptUndo = ComptUndo - 1 
End If 
Feuil1.Shapes("IndUndo").TextFrame.Characters.Text = ComptUndo 
End Sub 
     



*modifauto: lorsque certaines macro s'exécutent, cela permet de limiter le nombre de commande à exécuter pour les événements change ou sélection change avec un
If Not ModifAuto

POur la première fonction la commande
Feuil1.Shapes("IndUndo").TextFrame.Characters.Text = ComptUndo

n'a pas de soucis.

mais pour la deuxième si. Et cela uniquement sur Excel 2003

Un grand Merci d'avance et une bonne journée!
A voir également:

3 réponses

Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
7 mai 2013 à 20:13
Bonjour,

Il est difficile de te répondre sans le classeur et sans la totalité du code, mais il ne s'agit probablement pas d'un problème de compatibilité 2003 / 2007 mais plutôt d'un écriture ambigüe interprétée différemment .
Met ton fichier (ou un exemple publiable) sur https://www.cjoint.com/

Conseil pour les débutants (et les autres) : toujours débuter chaque module par :

Option Explicit
ça oblige à déclarer toutes les variables et ça évite toute ambigüité.

et dans le cas de variables publiques, ajouter :

Option Private Module
pour éviter d'éventuelles interférences avec d'autres projets (ou des macros complémentaires) dans lesquels une variable pourrait avoir le même nom.

Remarque : le fait de déclarer des variables publiques ne permet pas de conserver leur valeur lorsque l'exécution des macros se termine : je ne vois pas l'intérêt de ComptUndo s'il n'est pas initialisé à partir d'une donnée mémorisée.

Patrice
0
L28 Messages postés 157 Date d'inscription mercredi 19 novembre 2008 Statut Membre Dernière intervention 27 octobre 2019 132
13 mai 2013 à 11:06
Bonjour Patrice33740,

Merci pour ta réponse! Je suis actuellement en train d'effectuer les modifications que tu me conseilles et je trouve quelques erreurs assez "drôles" comme par exemple le xlcontinuous qui devient x1continuous en raison d'une mauxaise interprétation.
Aussi l'utilisation de Err en tant que variable perso alors que Err existe déjà dans excel ... bref quelques petites erreurs.

Sinon je n'ai pas "bien" compris ta remarque concernant la déclaration publique et cela m'effraie car j'utilise quelques variables déclarées en publiques dont:

- Version: Integer contenant la version du logiciel (10,12,14..) permettant de déterminer quelles fonctions utiliser en fonction de Excel 2003 ou 2007 (cela me permet de faire tourner le programme actuellement en désactivant le compteur Undo)

- Et quelques autres variables telles que ModifAuto: booléen qui indique si la modification au classeur est d'origine utilisateur ou macro (permet de diminuer les opérations)

Je n'ai pas rencontré de soucis pour leurs mises en place, le comptUndo s'incrémente et se réduit bien de même pour les tableaux de sauvegarde. Sauf si bien sur il y a une erreur et que je réinitialise le projet.

Sinon J'ai essayé d'utiliser le compteur dans un classeur vide et cela fonctionne donc effectivement ce n'est pas un problème de compatibilité...

Au final (j'ai créé ce post en même temps que je corrigeais le code), l'erreur vient d'un problème de protection de la feuille.
En effet j'avais protégé la feuille avec Protect et UserinterfaceOnly.

Pour Sauvaction juste avant de l'appeler je faisais un unprotect et pas pour undo. Je pense que Sur 2007 les macro ont accès aux objets alors que sur 2003 même avec UserinterfaceOnly elles n'ont accès qu'au tableau...
Après ce ne sont que des suppositions.

Encore merci pour ton aide!
0
Bonjour tout le monde !
eh ben moi j'ai un trés serieux probleme !!

j'ai créer un fichier avec plein de macros sous excel 2007 , ce fichier marhce parfaitement sous excel 2010 mais avec 2007 ça plante aprés 10-15 min!!

Pourquoi ? comment ? c'est un probleme qui date de plus que 2 mois , j'ai fais bcp de recherche sur internet sans trouver la solution :(

J'attends vos solutions avec impatience !!

GRAND MERCI
0
Raymond PENTIER Messages postés 58388 Date d'inscription lundi 13 août 2007 Statut Contributeur Dernière intervention 17 avril 2024 17 088
Modifié par Raymond PENTIER le 21/09/2014 à 19:51
Normal : Les ingénieurs s'efforcent de garantir une compatibilité ascendante (de 2007 vers 2010), et y parviennent quasiment à 100%.
Mais il faut se rappeler que la compatibilité descendante (de 2010 vers 2007 par exemple) n'est jamais envisagée, surtout en matière de macros.
Donc pas de solution, sauf à ré-écrire tes macros sous Excel 2007 ...
0
Patrice33740 Messages postés 8556 Date d'inscription dimanche 13 juin 2010 Statut Membre Dernière intervention 2 mars 2023 1 775
Modifié par Patrice33740 le 22/09/2014 à 22:28
Bonjour ameddo79

Ma boule de cristal n'est pas suffisamment puissante pour me permettre d'examiner ton code en détail !!!

Mais il est quasiment certain que si tu mets ton fichier sur c-joint nous aurons une vision beaucoup plus nette ...
.. à moins que la botte de paille ne soit trop grosse.

Patrice
0