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 28/03/2011, 13h38   #1
Membre éclairé
 
Avatar de @rkane
 
Homme Patrick
developpeur amateur dans mon cadre professionnel
Inscription : juin 2006
Messages : 499
Détails du profil
Informations personnelles :
Nom : Homme Patrick
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : developpeur amateur dans mon cadre professionnel
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2006
Messages : 499
Points : 360
Points : 360
Par défaut problèmes dans une boucle de transfert de tables

Bonjour à tous,


Dans une boucle de transfert de tables j’ai 2 problèmes :

Le 1er est que la boucle accroche sur les tables systèmes (mêmes masquées), comment puis je les squeezer autrement que sur leur nom, de façon radicale ?
Code :
1
2
3
4
5
6
7
8
9
10
11
Progression.Min = 0
  Progression.Max = 8 
  Set Db = CurrentDb
  For i = 1 To 8
  For Each Tbl In Db.TableDefs
  If Tbl.Name <> "Msys" & "*" Then
  DoCmd.TransferDatabase acExport, "Microsoft Access", "G:\Sauvegarde Bases de donnees\BackupMaBase.mdb", acTable, Tbl.Name, Tbl.Name
  Progression = Progression + 1
  End If
  Next Tbl
  Next i
2eme problème : la boucle me donne à la fin : « ProgCtrl a retourné l’erreur suivante : Valeur de propriété non valide » sur la ligne « Progression = Progression + 1 » J'ai essayé plusieurs valeurs je n'arrive pas à calibrer le nombre de fois ou la boucle doit tourner (j'ai en realité une bonne centaine de tables, j'en ai gardé 8 pour les tests)
__________________

@rkane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 14h04   #2
Membre éclairé
 
Avatar de @rkane
 
Homme Patrick
developpeur amateur dans mon cadre professionnel
Inscription : juin 2006
Messages : 499
Détails du profil
Informations personnelles :
Nom : Homme Patrick
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : developpeur amateur dans mon cadre professionnel
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2006
Messages : 499
Points : 360
Points : 360
en fouinant j'ai trouvé la propriété "attribute"
Code :
If Tbl.Attributes <> dbSystemObject Then
mais ça ne fonctionne pas
__________________

@rkane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 15h18   #3
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Bonjour,

Si ça peux t'aider, je fais ça plutôt pour mes sauvegardes:
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
29
30
Private Sub btn_menuAdminSauvegardes_Click()
 
    ' ===== Déclaration des variables =====
    Dim strSrc As String, strDest As String, strNewFile As String, strRepDest As String
 
    On Error GoTo err_btn_menuAdminSauvegardes_Click
 
    ' ===== Affectation =====
    strSrc = "L:\monChemin\BaseSHA.mdb"
    strRepDest = "L:\monDeuxiemeChemin\Tables\Archives\"
    strNewFile = Format(Date, "mmmm" & "_" & "yyyy", 2, 2) & ".mdb"
    strDest = strRepDest & strNewFile
 
    ' ===== Effectue une sauvegarde de la base dorsale =====
    FileCopy strSrc, strDest
    MsgBox ("Enregistrement du fichier " & strNewFile & " réussi à l'emplacement suivant : " & strRepDest)
 
exit_btn_menuAdminSauvegardes_Click:
    Exit Sub
 
err_btn_menuAdminSauvegardes_Click:
    Select Case err.Number
        Case 70
            MsgBox "Pour éviter d'avoir une sauvegarde endommagée, veuillez attendre que tout le monde soit déconnecté de l'application.", vbCritical, "Sauvegarde impossible"
        Case Else
            MsgBox ("Erreur n° : " & err.Number & ", Description : " & err.Description & ", Source : " & err.Source)
    End Select
    Resume exit_btn_menuAdminSauvegardes_Click
 
End Sub
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2011, 16h07   #4
Membre Expert
 
Avatar de keita
 
Homme
Inscription : novembre 2002
Messages : 879
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Côte d'Ivoire

Informations forums :
Inscription : novembre 2002
Messages : 879
Points : 1 015
Points : 1 015
Envoyer un message via MSN à keita
bonjour à tous
Citation:
(..............., j'en ai gardé 8 pour les tests)

Pas si sûr!
La boucle For Each Tbl In Db.TableDefs est à l'interieur de la boucle For i = 1 To 8
Selon moi, cela signifie que pour chaque valeur de i, on parcourt toutes les tables de ta bd;et non 8 comme tu l'espères;
Code :
1
2
3
4
5
For i = 1 To 8
     For Each Tbl In Db.TableDefs
 
     Next Tbl
Next i
et donc la limitation Progression.Max = 8 provoque l'erreur sur Progression = Progression + 1
En clair, il me semble que la boucle FOR ne sert pas à grand chose; du moins à la place qui est la sienne actuellement.
Le code de paidge te permettra de sauvegarder toute ta bd; si toutefois elle est en frontale/dorsale (si j'ai bien compris paidge)
Si par contre tu as envie de garder ton code à toi et donc de ne sauvegarder que tes tables, alors:
1/ Va falloir compter les tables systemes de ta bd:
Code :
1
2
3
4
5
For Each Tbl In db.TableDefs
            If (Tbl.Attributes And dbSystemObject) <> 0 Then
                n = n + 1
            End If
Next Tbl
2/determiner le nbre de tables non systemes que nous allons affecter progression.max
Code :
p = db.TableDefs.Count - 1 - n
3/ Pour faire simple, on devrait avoir un truc de ce genre
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
Function essai()
    Dim db As Database, Tbl As TableDef, n As Byte, p As Byte
    Set db = CurrentDb
    n = 0
    p = 0
    'Pour determiner le nbre de tables systemes
    For Each Tbl In db.TableDefs
            If (Tbl.Attributes And dbSystemObject) <> 0 Then
                n = n + 1
            End If
    Next Tbl
    p = db.TableDefs.Count - 1 - n   ' Pour determiner le nbre de tables non systeme
    Me.Progression.Min = 0
    Me.Progression.Max = p           
    Me.Progression.Value = 0
    n = 0
    For Each Tbl In db.TableDefs
            If (Tbl.Attributes And dbSystemObject) = 0 Then
                n = n + 1
                DoCmd.TransferDatabase acExport, "Microsoft Access", "G:\Sauvegarde Bases de donnees\BackupMaBase.mdb", acTable, Tbl.Name, Tbl.Name
                If n <= p Then
                    Me.Progression.Value = Me.Progression.Value + 1
                End If
            End If
   Next Tbl
End Function
4/Pour repondre à cette préoccupation:
Citation:
...les tables systèmes (mêmes masquées), comment puis je les squeezer autrement que sur leur nom, de façon radicale ?
Moi je crée une table qui contient le nom de mes tables; et je boucle la dessus. Non?
@+
keita est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/03/2011, 19h14   #5
Membre éclairé
 
Avatar de @rkane
 
Homme Patrick
developpeur amateur dans mon cadre professionnel
Inscription : juin 2006
Messages : 499
Détails du profil
Informations personnelles :
Nom : Homme Patrick
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : developpeur amateur dans mon cadre professionnel
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2006
Messages : 499
Points : 360
Points : 360
Bonjour Keita
merci pour ta réponse très intéressante. En fait, j'ai trouvé tout seul le bon code pour la boucle et ça roule vraiment tout bien. Là je n'ai pas le script sous la main ni en tête... Je crois que j'ai simplement viré la boucle sur le i qui en fait ne me sert à rien.
Parallèlement, j'ai contourné le problème des tables systèmes comme ça :
Code :
1
2
3
4
if Tbl.Name <> "Msys...." and Tbl.Name <> "Msys...." (y'en a 6 en tout) Then
DoCmd.TransferDatabase acExport, "Microsoft Access", "G:\Sauvegarde Bases de donnees\BackupMaBase.mdb", acTable, Tbl.Name, Tbl.Name
 Progression = Progression + 1
Next Tbl
J'imagine que les pros vont éclater de rire because ça n'est pas très académique, ça doit prendre plus de temps de comparer chaque table, mais au moins ça m'a tiré l'épine du pied en attendant mieux.
Pour info, ça ne m'intéresse absolument pas de copier la base en entier, seules les tables m'intéressent. Grosso modo, j'ai 50Mo de tables et 50 Mo de Forms,Etats et Modules.
__________________

@rkane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2011, 10h04   #6
Expert Confirmé
 
Avatar de Godzestla
 
Homme
Chercheur de bonheur
Inscription : août 2007
Messages : 2 255
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de bonheur
Secteur : Industrie

Informations forums :
Inscription : août 2007
Messages : 2 255
Points : 2 979
Points : 2 979
Bonjour,

je procède comme ceci sous Access 2003, et seules les tables non systèmes sont traitées.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
    Dim objAO As AccessObject
    Dim objCP As Object
 
    Dim Col As Object
 
    Set objCP = Application.CurrentData
    Set Col = objCP.AllTables
 
 
    For Each objAO In Col
           DoCmd.TransferDatabase acExport, "Microsoft Access", "G:\Sauvegarde Bases de donnees\BackupMaBase.mdb", acTable, objAO.Name, objAO.Name
        Next objAO
__________________
(\ _ /) Cordialement G@dz
(='.'=)

(")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.
Godzestla est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 10h34   #7
pgz
Expert Confirmé Sénior
 
Avatar de pgz
 
Homme Pierre GONZALEZ
Développeur Office VBA
Inscription : août 2005
Messages : 3 412
Détails du profil
Informations personnelles :
Nom : Homme Pierre GONZALEZ
Âge : 58
Localisation : France

Informations professionnelles :
Activité : Développeur Office VBA
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 412
Points : 5 934
Points : 5 934
Bonjour.

Tu peux faire
Code :
progression.Max = dB.TableDefs.Count
Ce nombre est bien-sûr plus grand que celui des tables à copier, mais cela ne devrait pas gêner l'opérateur.

Pour choisir les tables, tu as tout simplement
Code :
If tbl.Attributes = 0 Then ...
Cordialement,

PGZ
__________________
pluritas non est ponenda sine necessitate - Le rasoir d'Okham
Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon
pgz est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/03/2011, 16h00   #8
Membre éclairé
 
Avatar de @rkane
 
Homme Patrick
developpeur amateur dans mon cadre professionnel
Inscription : juin 2006
Messages : 499
Détails du profil
Informations personnelles :
Nom : Homme Patrick
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : developpeur amateur dans mon cadre professionnel
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2006
Messages : 499
Points : 360
Points : 360
Merci Keita, ton code fonctionne impeccable tout bien !

A une nuance près c'est que je n'ai pas tout compris la fçon de compter les tables "non systeme"...

Je vais me pencher la dessus tranquillement à froid un peu plus tard.

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
Dim db As Database, Tbl As TableDef, n As Byte, p As Byte
Set db = CurrentDb
n = 0
p = 0
    'Pour determiner le nbre de tables systemes
    For Each Tbl In db.TableDefs
            If (Tbl.Attributes And dbSystemObject) <> 0 Then
                n = n + 1
            End If
    Next Tbl
    p = db.TableDefs.Count - 1 - n   ' Pour determiner le nbre de tables non systeme
    Me.Progression.Min = 0
    Me.Progression.Max = p
    Me.Progression.Value = 0
    n = 0
    For Each Tbl In db.TableDefs
            If (Tbl.Attributes And dbSystemObject) = 0 Then
                n = n + 1
  DoCmd.TransferDatabase acExport, "Microsoft Access", "D:\BDD ACCESS\Rotations.mdb", acTable, Tbl.Name, Tbl.Name
                If n <= p Then
                    Me.Progression.Value = Me.Progression.Value + 1
                End If
            End If
   Next Tbl
__________________

@rkane est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h48.


 
 
 
 
Partenaires

Hébergement Web