Finalisation fichier VBA / Questions codage + Bugs

Bonsoir tout le monde,

Et voilà, après pas mal de taff et l'aide de plusieurs d'entre vous, je suis parvenu a réaliser un fichier quasi 100% comme je le voulais. C'est un fichier de gestion des devis et commandes pour ma boite. Je suis en phase de test final ou je teste toutes les possibilités pour vérifier que tout fonctionne bien et j'ai quelques bug que j'ai du mal a expliquer, je me tourne donc vers vous pour voir si vous sauriez m'aiguiller.

Voici mon fichier Excel, avec les dossiers de travail. Il suffit de déposer le tout sur votre bureau et de changer les deux chemins dans l'onglet donnée en ligne 15 et 18 (Fond jaune).

1 - Premier problème: C'est un soucis que je n'ai pas au bureau mais uniquement chez moi, quand je dépose un mail dans le dossier et que la macro veut ouvrir le mail pour récupérer des infos (Destinataire/Objet) il me met une erreur d’exécution:

1

Le code en cause est (Ligne en cause repérée par ----->):

    If NewFichier <> vbNullString Then
        Set MailItem = OutlookApplication.Session.OpenSharedItem(Répertoire & NewFichier)
        If MailItem.SenderEmailType = "SMTP" Then
            MailTo = MailItem.SenderEmailAddress
        Else
            If MailItem.SenderEmailType = "EX" Then
----->           MailTo = MailItem.Sender.GetExchangeUser.PrimarySmtpAddress
            End If
        End If
        Mailsubject = "RE: " & MailItem.Subject
    Else
        MsgBox "Le dossier ne contient pas de mail.", vbExclamation, "Erreur - Envoyer_Mail_Client"
    End If

Au boulot ça fonctionne nickel, chez moi non, je me demande si c'est normal, j'ai juste peur qu'avec un collègue ça puisse buger mais c'est peut-être juste parce que je n'ai pas de compte Exchange chez moi ?

2 - Second problème: Je n'arrive pas à la reproduire chez moi pour l'instant, peut-être en partie à cause des macros qui s’arrêtent à mi-chemin suite au premier problème. mais quand je suis au taff et que je lance plusieurs macro à la suite, j'ai un moment donné une des macros qui va buger quand il faut créer les dossiers. Exemple, je créé deux devis, il me rempli le tableau et créer les dossier Windows, j'en révise un, ça fonctionne aussi, puis je vais vouloir enregistrer un AR (Commande), les données vont se mettre dans le tableau mais la partie dossier sera ignorée totalement. Si je supprimer les données ajoutées dans le tableau, que je quitte et que je relance la macro et refait la même manipulation ça fonctionne de nouveau.

J'ai dans mon fichier (Oui je sais c'est pas bien...) utilisé pas mal de variables Global, qui sont regroupées dans un module du même nom. Car quasi toutes mes macros fonctionnent avec des variables du même nom (Par exemple la variable Ligne quand je réalise des Rows.Count). J'ai ajouté en fin de macro principale des End avant les End Sub, mais je me demande si ça peut être l'origine à de ce problème ? Le soucis que j'ai c'est que j'ai très souvent des données du UserForm que je dois retrouver dans le module associé et que sans Global ou Public j'ai du mal à voir comment je peux récupérer ces valeurs sans faire de la grosse redondance. Mais peut-être ais-je tors de procéder ainsi ?

Désolé pour le pavé mais cette partie variable est encore assez floue pour moi je l'avoue, parfois j'arrive à récupérer la valeur du UserForm sans soucis dans le module sans devoir le retaper et parfois ça ne fonctionne pas sans que je comprenne pourquoi et c'est assez frustrant.

26exemple.zip (321.44 Ko)

Bonjour Heelflip

Comme ça en passant pour répondre à ton point n° 1, oui c'est normal, on n'utilise pas Exchange à la maison

A+

Ok je me doutais bien mais étant débutant je préférais avoir une confirmation ;)

Re,

Pour ton 2ème problème, c'est normal aussi vu l'utilisation de toutes ces variables globales

Mais si elle sont initialisées dans chaque module, cela réduit les soucis

Je ne sais pas quoi te dire de plus à ce sujet, navré.

A+

Je me doutais que ça pourrait poser problème mais comment fais pour récupérer utiliser la valeur d'un variable d'un UserForm dans le module qui y est associé sans passer en Public ? Car un Dim même si placé en haut de module ou de UserForm n'est valable que pour les Sub du module ou du UserForm.

Exemple: Dans mon UserForm j'ai une TextBox Prénom Chargé d'affaire, cette donné je l'utilise après dans le module, comment faire le lien entre les deux sans Public ou Global ?

Re,

Attention, il ne faut pas confondre variable Public et Global

Les variables Global ne peuvent être utilisées que dans des modules standard,
alors que Public peut être utilisé dans tous les contextes (modules, classes, contrôles, formulaires, etc.)

Global provient d'anciennes versions de VBA et a probablement été conservé pour la rétrocompatibilité.

Pour ce qui est de passer une valeur d'un USF à l'autre, pas forcément le choix, il faut passer par une variable Public
Ceci dit on peut réinitialiser ces variables et les mettre à zéro, une fois utilisées

J'espère que cela pourra t'apporter de l'aide

A+

J'ai du mal avec le terme initialisés.

Tu veux dire qu'en début de chaque module je devrais mettre:

Public PrénomDeviseur As String

Ou que je dois lui octroyer une valeur à 0 pour qu'elle évite de garder une ancienne ?

Je pensais avoir lu que lorsqu'on quitte un Sub les variables déclarées étaient réinitialisées automatiquement, ce n'est pas valable pour une variable public ?, il n'y avait pour moi que les objets pour lesquels on mettait un = nothing pour vider la mémoire, c'est faux ?

Au final si je mets des variable public dans les module pour récupérer les infos des UserForm mais que je fais en sorte qu'elle soit unique pour chaque module, exemple pour mon module 1 -> PrénomDeviseur1 et pour le 2 PrénomDeviseur2, à ce moment la même en déclaration Public ça ne devrait plus interférer on est d'accord ?

Re,

Une variable qui ne servira que pour un ensemble de Sub dans un module peut être simplement déclarée en Dim en entête de module

Si tu déclares une variable Dim dans une Sub, celle-ci est effectivement réinitialisée lorsque tu en sors.

On utilise Public lorsque l'on a besoin d'utiliser le contenu de la variable ailleurs que dans le module actuel
USF <-> Module <-> USF

On l'initialise en entrant dans la sub ou on l'efface en sortant

MaVarPublicString = ""
' ou
MaVarPublicInteger = 0

Il n'y a pas d'interférence si tu initialises bien tes variables dans chaque Sub (quand besoin)

A+

Ha ok, je vois comme dans le cours sur le site, l’intérêt de la l'initialisation était flou pour moi, maintenant c'est bien plus clair merci, je vais bosser la dessus, ça fait un paquet de chose a revoir, heureusement que l'Option Explicit existe

Re,

A+

Rechercher des sujets similaires à "finalisation fichier vba questions codage bugs"