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 :

Classeur impossible à ouvrir


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut Classeur impossible à ouvrir
    Bonjour,

    Configuration
    Windows 10 (64 bits)
    Microsoft Office 2016 (32 bits)
    Une dizaine de postes installés
    Situation présente
    Un classeur interface au format xls (en local)
    Trois macros complémentaires au format xla (en local)
    Une base Microsoft Access au format mdb (sur le serveur)
    Quelques fichiers de configuration au format ini et txt (en local et sur le serveur)
    Fonctionnement
    L'utilisateur lance le classeur interface.
    Celui-ci récupère les enregistrements de la base Access et les affiche.
    Problème rencontré
    Tout fonctionnait correctement jusqu'au 20 octobre.
    Puis sur un premier poste, impossible de lancer le classeur interface
    Le curseur tourne sans arrêt et obligation de tuer la tâche Excel
    Le lendemain c'est un second poste qui tombe et un troisième.
    Aujourd'hui tous les postes sont en rade.
    Correctifs mis en oeuvre.
    Conversion du classeur interface au format xlsm
    Conversion des macros complémentaires en xlam
    Conversion de la base au format accdb
    Ce qui m'oblige à abandonner Microsoft DAO 3.6 Object Library pour Microsoft Office [XX.x] Access database engine Object Library dans les classeurs Excel.
    Autres mesures prises
    Débogage des macros complémentaires
    Aucun problème trouvé.
    Désactiver la procédure de démarrage (Workbook_Open) du classeur interface
    Le curseur continu de tourner comme si le code s'exécutait.
    L'affichage du classeur n'est pas top, avec des zones blanches, comme si l'écran ne se redessinait pas entièrement.
    Quand je met tout le code du classeur interface en commentaire
    Le classeur s'ouvre bien mais...
    Les objets (boutons, listes, cases à cocher, etc) posés sur la feuille ne sont plus à la bonne taille et se chevauchent.
    Ce n'est pas normal et c'est peut-être une piste
    .
    Références du classeur interface
    • Visual Basic For Applications
    • Microsoft Excel [XX.x] Object Library
    • OLE Automation
    • Microsoft Forms 2.0 Object Library
    • Microsoft Office [XX.x] Object Library
    • Microsoft Office [XX.x] Access database engine Object Library (pour la base Access)
    • Les 3 macros complémentaires


    Autres informations
    Les classeurs utilisent un nombre conséquent d'A.P.I. Windows.
    Conclusions
    La migration des divers classeurs ne change rien au problème.
    Empêcher l'exécution du code touches [Shift] ou [Ctrl] ne change rien, le curseur tourne toujours.
    J'ai réussi à rentrer deux fois dans le code (pourquoi ?), j'essaye d'écrire une instruction MsgBox sur WorkBook_Open
    Après avoir saisi l'instruction MsgBox j'écris une espace et là crac, j'ai le curseur qui tourne de nouveau sans s'arrêter.

    Je ne sais vraiment plus quoi faire, si quelqu'un à une idée, je suis preneur. Merci pour votre aide.

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    la première chose, je pense, à vérifier, c'est pourquoi ceci s'est successivement produit d'un poste à l'autre.

    il serait opportun de vérifier les dernières mises à jour Windows et office déployée sur le parc :

    - contenu des MaJ
    - date d'application des MaJ sur chaque poste.

    histoire de vérifier si ça coincide, et d'agir à ce niveau ?

    Ensuite (ou au préalable), le fait d'avoir converti les Xla en Xlam a bien rompu l'appel aux anciens xla ?

  3. #3
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour
    Les classeurs utilisent un nombre conséquent d'A.P.I. Windows
    Lesquelles ?
    En rappelant que certains sous-classements et/ou "hookings" peuvent être source de dégâts (mauvaise gestion ou arrêt non régulier -notamment depuis l'interface de VBA- ou encore arrêt par instruction END).

    Ah oui ...
    Et en espérant que d'autres classeurs que celui-ci ne "tomberont" pas, l'un après l'autre (pas forcément dans l'immédiat), dans le même cas (ce qui peut parfaitement arriver lorsque l'on s'échange entre copains des classeurs, dotés ou non de macros. )
    (j'ai déjà assisté à ce genre d'avalanche).

  4. #4
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    Bonjour,

    Merci pour votre aide.

    @joe.levrai : le fait d'avoir converti les Xla en Xlam a bien rompu l'appel aux anciens xla ?
    Je n'ai plus de référence aux xla et j'ai testé le programme sur un windows 7 et il fonctionne correctement.
    Moi aussi depuis le début, je soupçonne une mise à jour Windows ou Office, malheureusement, je n'ai pas la main sur l'administration des postes.

    Ce programme fonctionne depuis 2004 avec une petite mise à jour en 2010, il a marché dans l'environnement actuel depuis le mois de juin. Si je l'ai converti c'est pour faire taire l'entreprise qui gère l’informatique et remet en cause mon programme plutôt que les mises à jour.

    @unparia : Les classeurs utilisent un nombre conséquent d' A.P.I. Windows Lesquelles ?
    • GetUserName
    • FindWindowA
    • GetDC
    • CreateSolidBrush
    • etc.

    Elles servent essentiellement à l'affichage d'une barre de progression. De plus je n'ai jamais utilisé une instruction END dans un programme (pas propre).

    Résumé
    Ce programme fonctionnait correctement dans l'environnement actuel depuis le mois de juin. Le convertir au nouveaux format Excel ne change rien. J'en conclu que le programme n'est pas en cause.
    Vos réponses me conforte dans ma réflexion et ma question serait maintenant plutôt est-ce que quelqu'un connait une mise à jour Windows ou Office qui pose soucis avec Excel, j'ai déjà vu passé des posts de droite et de gauche qui évoque des soucis de ce genre.

    Encore merci pour votre aide efficace

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    1) Ce sont quelles fonctions, les "etc ..." ?
    2) que contient ton code pour en dénoncer les éventuelles erreurs rencontrées en exécution ?
    3) Et ton 2010 : en combien de bits ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    @unparia Et ton 2010 : en combien de bits ?
    Comme précisé dans le premier post en 64 bits et Office en 32 bits.

    Depuis l'autre fois, nous avons avancé. Après tests, Windows n'est pas en cause, et c'est Office 2016 qui pose soucis.

    Pour l'heure, j'ai réglé le problème en installant une version 2013 d'Excel.

    @unparia que contient ton code pour en dénoncer les éventuelles erreurs rencontrées en exécution ?
    Alors là on rentre dans du compliqué, une vrai usine à gaz.
    Il y a 3 macros complémentaires. Elles se connectent au logiciel EasyWin fabrication de menuiseries (base .DBF), une base Access par laquelle transitent des enregistrements qui sont lus et écris dans une base SAGE Gestion commerciale 100 (version I7).
    Il y a ensuite un classeur interface qui affiche les informations issues de la base Access et permet d'écrire dedans
    .
    Les macros complémentaires et le classeur interface sont installés en local (une dizaine d'utilisateurs). Les fichiers de configuration et les base EasyWin, Access et SAGE sont sur le serveur.
    .
    Il y a ensuite des services (gestion d'utilisateurs, définition de DNS, configuration de l'affichage, système d'aide, jauge d'avancement, calendrier, lecture/écriture base de registre et fichier ini, fichier log etc.)
    Pour finir, on trouve les fonctionnalités métier
    Tout est écrit en pseudo objet (modules de classe)
    Il y a trop de code pour que je puisse rentrer plus dans le détail.
    @unparia Ce sont quelles fonctions, les "etc ..." ?
    Un peu de lecture
    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
    CloseHandle
    CreatePen
    CreateSolidBrush
    DeleteObject
    ExtTextOutA
    FindWindowA
    GetClassNameA
    GetClientRect
    GetDC
    GetOpenFileName
    GetPrivateProfileInt
    GetPrivateProfileSection
    GetPrivateProfileSectionNames
    GetPrivateProfileString
    GetPrivateProfileStringA
    GetSysColor
    GetTextExtentPointA
    GetUserName
    GetWindow
    PatBlt
    Rectangle
    RegCloseKey
    RegConnectRegistry
    RegCreateKey
    RegDeleteKey
    RegDeleteValue
    RegEnumKey
    RegEnumValue
    RegOpenKeyEx
    RegQueryValueEx
    RegSetValueEx
    ReleaseDC
    SelectObject
    SetBkColor
    SetTextColor
    SHBrowseForFolder
    SHGetPathFromIDList
    WritePrivateProfileSection
    WritePrivateProfileString
    WritePrivateProfileStringA
    J'attends de la part de la société qui gère l'informatique, la liste des mises à jour d'office effectuées récemment.

  7. #7
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    peut-on avoir simplement la bloc instruction dans lequel tu déclare tes Function d'API ?

    tu as bien un traitement conditionnel sur la version #WINx dans ces déclarations ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    Depuis mon dernier message, j'ai fais quelques modifications.
    J'ai supprimé un maximum d' A.P.I. pour les remplacer par des fonctions "maison" comme la création de la barre de progression.

    Voici un exemple de déclarations et mise en oeuvre
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #If VBA7 Then
        ' Pour se connecter une base de registre distante
        Private Declare PtrSafe Function RegConnectRegistry Lib "advapi32.dll" Alias "RegConnectRegistryA" (ByVal lpMachineName As String, ByVal hKey As LongPtr, phkResult As LongPtr) As Long
        ' pour énumérer les valeurs d'une clé ouverte
        Private Declare PtrSafe Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As LongPtr, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As LongPtr, lpType As Long, lpData As Byte, lpcbData As Long) As Long
        ' pour énumérer les sous-clé d'une clé ouverte
        Private Declare PtrSafe Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As LongPtr, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
        'pour ouvrir une clé
        Private Declare PtrSafe Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As LongPtr, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As LongPtr) As Long
        'pour fermer une clé ouverte
        Private Declare PtrSafe Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As LongPtr) As Long
        'pour créer une clé
        Private Declare PtrSafe Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As LongPtr, ByVal lpSubKey As String, phkResult As LongPtr) As Long
        'pour supprimer une clé ouverte
        Private Declare PtrSafe Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As LongPtr, ByVal lpSubKey As String) As Long
        'pour supprimer une valeur
        Private Declare PtrSafe Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As LongPtr, ByVal lpValueName As String) As Long
        'pour lire une valeur
        ' Note that if you declare the lpData parameter as String, you must pass it By Value.
        Private Declare PtrSafe Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As LongPtr, ByVal lpValueName As String, ByVal lpReserved As LongPtr, lpType As Long, lpData As Any, lpcbData As Long) As Long
        'pour fixer ou créer une valeur
        ' Note that if you declare the lpData parameter as String, you must pass it By Value.
        Private Declare PtrSafe Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As LongPtr, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
    #Else
        ' Pour se connecter une base de registre distante
        Private Declare Function RegConnectRegistry Lib "advapi32.dll" Alias "RegConnectRegistryA" (ByVal lpMachineName As String, ByVal hKey As Long, phkResult As Long) As Long
        ' pour énumérer les valeurs d'une clé ouverte
        Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Byte, lpcbData As Long) As Long
        ' pour énumérer les sous-clé d'une clé ouverte
        Private Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long
        'pour ouvrir une clé
        Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
        'pour fermer une clé ouverte
        Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
        'pour créer une clé
        Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
        'pour supprimer une clé ouverte
        Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
        'pour supprimer une valeur
        Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
        'pour lire une valeur
        Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
        'pour fixer ou créer une valeur
        Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
    #End If
     
    ' Pas de déclaration du type sur les constantes.
    '   Pour ne pas se poser la question s'il faut un type Long / LongPtr.
    ' const prises WINREG.H
        Private Const VBREG_HKEY_CLASSES_ROOT = &H80000000
        Public Const VBREG_HKEY_CURRENT_USER = &H80000001
        Public Const VBREG_HKEY_LOCAL_MACHINE = &H80000002
        Private Const VBREG_HKEY_USERS = &H80000003
        Private Const VBREG_HKEY_PERFORMANCE_DATA = &H80000004
        Private Const VBREG_HKEY_CURRENT_CONFIG = &H80000005
        Private Const VBREG_HKEY_DYN_DATA = &H80000006
    #If VBA7 Then
        Private Function EstBrancheFille(srcMere As String, srcSource As String, srcRecherche As String, Optional Retour As LongPtr) As Boolean
        Dim NumBranche As LongPtr
    #Else
        Private Function EstBrancheFille(srcMere As String, srcSource As String, srcRecherche As String, Optional Retour As Long) As Boolean
        Dim NumBranche As Long
    #End If
     
    Public Function GetBrancheFille(srcMere As String, srcSource As String, Optional Retour As Variant) As Long
     
        Dim NumBranche As Long
        Dim NbBrancheFille As Long
        ' Numéro de la branche cherchée
        NumBranche = Open_a_Key(srcMere, srcSource, VBREG_KEY_ALL_ACCESS)
        ' Open_a_key retourne un long (car l'api retourne un long quelque soit la plateforme).
        ' Mais Get_Subkeys attend en paramètre un LongPtr (c'est l'api utilisée qui le demande).
        #If VBA7 Then
            NbBrancheFille = Get_Subkeys(CLngPtr(NumBranche), Retour)
        #Else
            NbBrancheFille = Get_Subkeys(NumBranche, Retour)
        #End If
        GetBrancheFille = NbBrancheFille
     
    End Function
    Il y a du nouveau. Le programme par magie fonctionne sur certains postes depuis une semaine mais certains sont toujours à la ramasse. Ce qui semble confirmer ce que je pense depuis le début à savoir qu'il y a une mise à jour frelatée.

    Merci pour votre aide active

Discussions similaires

  1. impossible ouvrir ou modifier formulaire
    Par eddy37fr dans le forum IHM
    Réponses: 6
    Dernier message: 01/04/2008, 20h13
  2. Réponses: 4
    Dernier message: 14/01/2008, 17h04
  3. impossible ouvrir page avec target=_ blank
    Par EE dans le forum ASP.NET
    Réponses: 3
    Dernier message: 11/09/2007, 22h45
  4. vbproj impossible à ouvrir
    Par SorcierGris dans le forum Visual Studio
    Réponses: 2
    Dernier message: 05/12/2006, 16h37

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