Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/10/2011, 17h58   #1
Membre du Club
 
Homme Cédric MERSCH
Ordonnanceur
Inscription : novembre 2009
Messages : 48
Détails du profil
Informations personnelles :
Nom : Homme Cédric MERSCH
Localisation : France

Informations professionnelles :
Activité : Ordonnanceur
Secteur : Industrie

Informations forums :
Inscription : novembre 2009
Messages : 48
Points : 46
Points : 46
Par défaut Progressbar VBA sur requete enregistrée

Bonjour à tous,

Ayant eu énormement de mal à recouper toutes les infos pour parvenir à mes fins, je propose ce poste aux débutants comme moi pour décrire la procédure à suivre:

Données:
  • 1 formulaire
  • 1 requete enregistrée (en l'occurence R_Raz_Temp)
  • 1 bouton qui lance la requete par le code (et non macro!)(ici B_Actualiser)
  • 1 table (ici Temp_Postes_Caff)
Il s'agit dans mon cas d'une requete de suppression servant à razer la table sur laquelle je travail et voici le code sur l'événement Click du bouton:

Code :
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 B_Actualiser_Click()
    Dim i As Integer
 
    'Desactivation des alertes
    DoCmd.SetWarnings False
 
    '#####################################
    'Raz de la table temporaire
    '#####################################
 
    'Définition des attributs de ma progressbar
    ProgressBar.Visible = True 'On fait apparaitre la progressbar
    ProgressBar.Min = 0 'Valeur mini de la progressbar
    ProgressBar.Max = DCount("*", "Temp_Postes_Caff") 'On compte les enregistrements de la table à effacer
 
    i = 1 'Initialisation de ma boucle de traitement
    TxtTraitement = "RAZ table temporaire" 'Mise à jour de la description de l'action en cours
    'Boucle de traitement
    While i <= ProgressBar.Max
        DoCmd.OpenQuery ("R_Raz_Temp") 'Traitement de la requete enregistrée
        DoEvents 'Liberation du système pour d'autres executions eventuelles
        ProgressBar.Value = i 'Incrementation de la valeur de la progressbar
        i = i + 1 'Incrémentation de la boucle de traitement
    Wend
    'Initialisation de l'affichage en fin de traitement
    ProgressBar.Value = 0
    ProgressBar.Visible = False
    TxtTraitement = ""
N'étant bien evidement pas un expert en VBA je suis absolument ouvert à toute critique ou correction éventuelle.

Amicalement
mc.schmer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 18h09   #2
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 258
Points : 5 258
Salut,

Dans ton code VBA, tu exécutes la requête "R_Raz_Temp", autant de fois qu'il y a d'enregistrements dans la table "Temp_Postes_Caff"...

Est-ce conforme avec ce que tu veux faire ?

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 21h43   #3
Membre du Club
 
Homme Cédric MERSCH
Ordonnanceur
Inscription : novembre 2009
Messages : 48
Détails du profil
Informations personnelles :
Nom : Homme Cédric MERSCH
Localisation : France

Informations professionnelles :
Activité : Ordonnanceur
Secteur : Industrie

Informations forums :
Inscription : novembre 2009
Messages : 48
Points : 46
Points : 46
Salut User,

En effet non! Ce n'est pas du tout ce que je veux faire...
De plus je viens de constater que les fonctions de domaine tel que "Dcount" ne fonctionne que sur des tables et non sur les requêtes. Elle ne fonctionne plus non plus si le contenu de la table retourne Null.
En conclusion je fini par me demander si je ne ferais pas mieux d'utiliser un recordset DAO pour faciliter la démarche?
mc.schmer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 23h27   #4
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 258
Points : 5 258
Salut,

Les fonctions de domaine comme DCount ne fonctionnent pas avec du sql comme argument, par contre elle fonctionne bien avec le nom d'une requête enregistrée comme argument, à condition que ce ne soit pas une requête paramétrée.

Que veux-tu dire par:

Citation:
Elle ne fonctionne plus non plus si le contenu de la table retourne Null.
Si la table est vide DCount renvoie 0.

Par contre si tu as 1 critère comme argument de ta fonction DCount, assure toi qu'il n'y a pas d'erreur dans son expression.

Remarque sur les fonctions domaines:

Les fonctions de domaine permettent de simplifier le code VBA, par rapport au recordset, et sont utiles dans le cas ou on a besoin de renvoyer qu'une valeur: somme pour 1 champ, valeur max pour un champ, valeur précise d'1 champ.

Dans ce cas, elles sont généralement assez performantes dans du code VBA.

Par contre dans les requêtes les fonctions domaines sont généralement moins performantes qu'une sous-requête mais un peu plus simple à écrire.

D'autre part comme source d'1 contrôle je ne les utilise pas directement et préfère mettre à jour indirectement le contrôle avec du VBA et éventuellement une fonction domaine utilisée dans le code.

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 09h31   #5
Membre du Club
 
Homme Cédric MERSCH
Ordonnanceur
Inscription : novembre 2009
Messages : 48
Détails du profil
Informations personnelles :
Nom : Homme Cédric MERSCH
Localisation : France

Informations professionnelles :
Activité : Ordonnanceur
Secteur : Industrie

Informations forums :
Inscription : novembre 2009
Messages : 48
Points : 46
Points : 46
Bonjour User,

Merci de ta réponse.

Citation:
Si la table est vide DCount renvoie 0
En fait il m'arrive la chose suivante: si ma table "Temp_Postes_Caff" est vide mon code génère l'erreur suivante

Erreur d'exécution '380':
Valeur de propriété non valide.

J'ais finalement compris que j'affecte 0 à la propriété max de l'objet ce qui est incorrect. Donc je corrige mon code comme ceci:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ProgressBar.Min = 0 'Valeur mini de la progressbar
    ProgressBar.Max = DCount("*", "Temp_Postes_Caff") 'On compte les enregistrements de la table à effacer
    If ProgressBar.Max = 0 Then
        GoTo lbl1
    Else
        While i <= ProgressBar.Max
            DoCmd.OpenQuery ("R_Raz_Temp")
            DoEvents
            'SysCmd acSysCmdUpdateMeter, i 'Définit le texte à afficher et la valeur actuelle de la jauge.
            ProgressBar.Value = i
            i = i + 1
        Wend
    End If
    ProgressBar.Value = 0
lbl1:
    'Initialisation de l'affichage en fin de traitement
    ProgressBar.Value = 0
    ProgressBar.Visible = False
    TxtTraitement = ""
Dernière question, dois remonter l'instruction au dessus de ma boucle while afin de ne pas la répéter?

Amicalement.
mc.schmer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 09h39   #6
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 258
Points : 5 258
Salut,

Citation:
Dernière question, dois remonter l'instruction au dessus de ma boucle while afin de ne pas la répéter?
Oui mais dans ce cas tu ne risques pas d'obtenir le résultat escompté :

La barre de progression, ne va pas progresser durant l'exécution de la requête, mais après il me semble

A+
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/10/2011, 10h04   #7
Membre du Club
 
Homme Cédric MERSCH
Ordonnanceur
Inscription : novembre 2009
Messages : 48
Détails du profil
Informations personnelles :
Nom : Homme Cédric MERSCH
Localisation : France

Informations professionnelles :
Activité : Ordonnanceur
Secteur : Industrie

Informations forums :
Inscription : novembre 2009
Messages : 48
Points : 46
Points : 46
Re,

Citation:
La barre de progression, ne va pas progresser durant l'exécution de la requête, mais après il me semble
Tu viens donc de lever le doute qui me hanté.
Vois-tu une autre solution afin de faire progresser ma barre durant l'éxecution de ma requête?

Amicalement.
mc.schmer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 10h13   #8
Rédacteur/Modérateur
 
Avatar de User
 
Homme Denis
Développeur informatique
Inscription : août 2004
Messages : 3 206
Détails du profil
Informations personnelles :
Nom : Homme Denis
Âge : 42
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : août 2004
Messages : 3 206
Points : 5 258
Points : 5 258
Citation:
Vois-tu une autre solution afin de faire progresser ma barre durant l'éxecution de ma requête?
Malheureusement je ne connais pas de solution.

Remplacer la barre de progression par 1 sablier mais ce n'est pas le but
__________________
Merci de ne pas poster sur mon profil pour des problèmes techniques. Pour celà vous pouvez utiliser le forum ou m'envoyer un mp.

Bon développement !


Mes tutoriels et contributions sur ma page perso:
Ma page personnelle
User est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 10h30   #9
Membre Expert
 
Avatar de nico84
 
Homme Nicolas Guimbal
Consultant/développeur ERP
Inscription : mai 2008
Messages : 1 256
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Guimbal
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant/développeur ERP
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2008
Messages : 1 256
Points : 1 872
Points : 1 872
Bonjour,

Qq remarques :

- Il me semble que sur les requêtes longues access met tout seul une progressbar

- j'utilise syscmd pour afficher une progressbar et si j'essaie de remplacer par la commande progressbar j'ai une erreur de compilation "variable non définie" alors qu'access semble connaitre le mot... Faut-il une déclaration préalable ? J'utilise access 2000...

- plutot que setwarnings false il vaut mieux récupérer l'erreur et la gérer comme dans l'exemple que je donne dans cette file
nico84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 12h47   #10
Membre du Club
 
Homme Cédric MERSCH
Ordonnanceur
Inscription : novembre 2009
Messages : 48
Détails du profil
Informations personnelles :
Nom : Homme Cédric MERSCH
Localisation : France

Informations professionnelles :
Activité : Ordonnanceur
Secteur : Industrie

Informations forums :
Inscription : novembre 2009
Messages : 48
Points : 46
Points : 46
Bonjour nico,

Merci pour tes précisions, je vais tenter de mieux gérer mes erreurs en suivant tes conseils.

Amicalement.
mc.schmer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 13h05   #11
Membre du Club
 
Homme Cédric MERSCH
Ordonnanceur
Inscription : novembre 2009
Messages : 48
Détails du profil
Informations personnelles :
Nom : Homme Cédric MERSCH
Localisation : France

Informations professionnelles :
Activité : Ordonnanceur
Secteur : Industrie

Informations forums :
Inscription : novembre 2009
Messages : 48
Points : 46
Points : 46
Pour conclure ce poste, je pense que la tache est un peu trop hardu pour moi et qu'il n'existe pas vraiment de solution de remplacement à la barre de progression de la barre d'état access (Toujours en ce qui concerne une requête enregistrée).

Merci à tous ceux qui on consacré de précieuse minutes à ce poste...

Amicalement
mc.schmer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 14h35   #12
Invité de passage
 
Inscription : octobre 2011
Messages : 17
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 17
Points : 3
Points : 3
Par défaut peut être une solution

Je viens de débuter dans le développement vba/access, donc ma parole n'a pas tant de valeur que cela...

Mais sans trop m'avancer je pourrais dire, si j'ai bien compris le problème, que si tu réalisais plutot une requête qui supprime la première en entrée de ta table plutôt que supprimer tous les éléments de ta table, l'action ferait progresser ta "progressbar" avec la supression des entrées pour être complète lorsque toutes tes entrées sont supprimées.

non?
orfeu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h17.


 
 
 
 
Partenaires

Hébergement Web