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

VBA Access Discussion :

[A-03], code Compactage + OuvrirUnFichier


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 50
    Points : 37
    Points
    37
    Par défaut [A-03], code Compactage + OuvrirUnFichier
    Salut le forum,

    Suite a la lecture des divers tutos et FAQ, je souhaite combiner deux processus... et mes bases en VBA sont trop limitees. Chacun des codes fonctionnent independament mais quand j'essaye de les lier par les objets utilises ca bug.

    le premier etant le code de compactage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Compacter_Click()
     
    'J'aimerai attribuer a SnomBase le chemin+nom du fichier selectionne precedemment
     
        sNomBase = "chemin+nom du fichier Access a compiler"
        sNomBaseTmp = "C:\Documents and Settings\xav\My Documents\BaseTmp.MDB"
        DBEngine.CompactDatabase sNomBase, sNomBaseTmp '1. Compactage dans une nouvelle base
        Kill sNomBase '2. Suppression de la base originale
        Name sNomBaseTmp As sNomBase '3. Renommer la base compactée avec le nom de la base originale
     
    MsgBox "le compactage est reussi. Retrouver votre fichier dans le rep. indique" & _
    sNomBase, 1
    le 2 etant la fonction OuvrirUnFichier de la FAQ (fonction + une MsgBox ). Correction faite apres remarque de LedZepp, n'ayant pas colle le bon code FAQ ici
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     'Déclaration de l'API
    Private Declare Sub PathStripPath Lib "shlwapi.dll" Alias "PathStripPathA" (ByVal pszPath As String)
    Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
                       "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
     
     'Structure du fichier
    Private Type OPENFILENAME
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        lpstrFilter As String
        lpstrCustomFilter As String
        nMaxCustFilter As Long
        nFilterIndex As Long
        lpstrFile As String
        nMaxFile As Long
        lpstrFileTitle As String
        nMaxFileTitle As Long
        lpstrInitialDir As String
        lpstrTitle As String
        flags As Long
        nFileOffset As Integer
        nFileExtension As Integer
        lpstrDefExt As String
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
     
     'Constantes
    Private Const OFN_READONLY = &H1
    Private Const OFN_OVERWRITEPROMPT = &H2
    Private Const OFN_HIDEREADONLY = &H4
    Private Const OFN_NOCHANGEDIR = &H8
    Private Const OFN_SHOWHELP = &H10
    Private Const OFN_ENABLEHOOK = &H20
    Private Const OFN_ENABLETEMPLATE = &H40
    Private Const OFN_ENABLETEMPLATEHANDLE = &H80
    Private Const OFN_NOVALIDATE = &H100
    Private Const OFN_ALLOWMULTISELECT = &H200
    Private Const OFN_EXTENSIONDIFFERENT = &H400
    Private Const OFN_PATHMUSTEXIST = &H800
    Private Const OFN_FILEMUSTEXIST = &H1000
    Private Const OFN_CREATEPROMPT = &H2000
    Private Const OFN_SHAREAWARE = &H4000
    Private Const OFN_NOREADONLYRETURN = &H8000
    Private Const OFN_NOTESTFILECREATE = &H10000
     
    Private Const OFN_SHAREFALLTHROUGH = 2
    Private Const OFN_SHARENOWARN = 1
    Private Const OFN_SHAREWARN = 0
     
     
    Public Function OuvrirUnFichier(Handle As Long, _
                                    Titre As String, _
                                    TypeRetour As Byte, _
                                    Optional TitreFiltre As String, _
                                    Optional TypeFichier As String, _
                                    Optional RepParDefaut As String) As String
     'OuvrirUnFichier est la fonction a utiliser dans votre formulaire pour ouvrir _
     'la boîte de dialogue de sélection d'un fichier.
     'Explication des paramètres
        'Handle = le handle de la fenêtre (Me.Hwnd)
        'Titre = Titre de la boîte de dialogue
        'TypeRetour (Définit la valeur, de type String, renvoyée par la fonction)
            '1 = Chemin complet + Nom du fichier
            '2 = Nom fichier seulement
        'TitreFiltre = Titre du filtre
            'Exemple: Fichier Access
            'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
        'TypeFichier = Extention du fichier (Sans le .)
            'Exemple: MDB
            'N'utilisez pas cet argument si vous ne voulez spécifier aucun filtre
        'RepParDefaut = Répertoire d'ouverture par defaut
            'Exemple: C:\windows\system32
            'Si vous laissé l'argument vide, par defaut il se place dans le répertoire de votre application
     
    Dim StructFile As OPENFILENAME
    Dim sFiltre As String
     
     'Construction du filtre en fonction des arguments spécifiés
    If Len(TitreFiltre) > 0 And Len(TypeFichier) > 0 Then
      sFiltre = TitreFiltre & " (" & TypeFichier & ")" & Chr$(0) & "*." & TypeFichier & Chr$(0)
    End If
    sFiltre = sFiltre & "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
     
     
     'Configuration de la boîte de dialogue
      With StructFile
        .lStructSize = Len(StructFile) 'Initialisation de la grosseur de la structure
        .hwndOwner = Handle 'Identification du handle de la fenêtre
        .lpstrFilter = sFiltre 'Application du filtre
        .lpstrFile = String$(254, vbNullChar) 'Initialisation du fichier '0' x 254
        .nMaxFile = 254 'Taille maximale du fichier
        .lpstrFileTitle = String$(254, vbNullChar) 'Initialisation du nom du fichier '0' x 254
        .nMaxFileTitle = 254  'Taille maximale du nom du fichier
        .lpstrTitle = Titre 'Titre de la boîte de dialogue
        .flags = OFN_HIDEREADONLY  'Option de la boite de dialogue
        If ((IsNull(RepParDefaut)) Or (RepParDefaut = "")) Then
            RepParDefaut = CurrentDb.Name
            PathStripPath (RepParDefaut)
            .lpstrInitialDir = Left(CurrentDb.Name, Len(CurrentDb.Name) - Len(Mid$(RepParDefaut, 1,  _
    InStr(1, RepParDefaut, vbNullChar) - 1)))
            Else: .lpstrInitialDir = RepParDefaut
        End If
      End With
     
    If (GetOpenFileName(StructFile)) Then 'Si un fichier est sélectionné
        Select Case TypeRetour
          Case 1: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFile, InStr(1, StructFile.lpstrFile, vbNullChar)-1))
          Case 2: OuvrirUnFichier = Trim$(Left(StructFile.lpstrFileTitle, InStr(1,  StructFile.lpstrFileTitle, vbNullChar)-1))
        End Select
      End If 
     
    End Function

    J'ai du mal a attribuer le chemin du fichier + son nom dans le "sNomBase", qui precise la base a compacter.

    Mon probleme est que je cumule trop de subtilites pour mon niveau en VBA.

    Est-ce le BDengine qui bug avec des objets autres que string?
    Est-ce le fait d'essayer d'attribuer un objet venant d'une fonction placee dans un module?

    ou enfin est-ce que StructFile.lpstrFile n'est pas le chemin+nom de mon fichier?

    Voila, je suis un peu paume, j'essaye, je tatonne, je lis et je bute...

    Salut a tous et merci de votre aide

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 50
    Points : 37
    Points
    37
    Par défaut interessant: compactage avec OuvrirUnFichier integre
    Salut a... moi meme, et a vous lecteurs,

    Alors par rapport a audessus...

    fouillant la FAQ, je me suis interesse de plus pres a ce bout de code trouve sur la doc DAO ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'code du bouton parcourir
    Private Sub Commande3_Click()
    Dim strChemin As String
    strChemin = OuvrirUnFichier(Me.Hwnd, _
    "Selectionner une base de données Access", _
    1, "Fichiers Access", "mdb")
    If  strChemin <> "" Then
    Me.TFichier = strChemin
    End If
    End Sub
    et j'ai vu strChemin = OuvrirUnFichier... que je me suis empresse de tenter dans le mien sNomBase = OuvrirUnFichier... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Compacter_Click()
     
    'J'ai tente d'inserer la fonction comme le bout de code dans la doc DAO
     
        sNomBase = OuvrirUnFichier(Me.Hwnd, "Parcourir", 1, "Fichier Access", "mdb")
        sNomBaseTmp = "C:\Documents and Settings\xav\My Documents\BaseTmp.MDB"
        DBEngine.CompactDatabase sNomBase, sNomBaseTmp '1. Compactage dans une nouvelle base
        Kill sNomBase '2. Suppression de la base originale
        Name sNomBaseTmp As sNomBase '3. Renommer la base compactée avec le nom de la base originale
     
    MsgBox "le compactage est fini. Retrouvez votre fichier dans le rep. indique" & _
    sNomBase, 1
     
    End Sub
    Ca marche. J'ai donc lors du click, une fenetre parcourir qui s'ouvre. Apres selection du fichier le compactage se lance et m'affiche le msgBox. Parfait?

    Non pas vraiment, j'aimerai comprendre. je fais des hypotheses.

    En esperant que ce soit lisible. ceci pourrait etre une petite amelioration du compactage deja dispo sur ce forum.

    Amicalement Xav

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Commence par appeler la fonction EnregistrerUnFichier et attribue la valeur retournée à ta variable sNomBase.
    J'ai ajouté un petit test. Si la longueur de la variable sNomBase est 0, c'est qu'on a cliqué sur le bouton Annuler de la boîte de dialogue.
    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
    Private Sub Compacter_Click()
    Dim sNomBase As String, sNomBaseTmp As String 
     
        sNomBase = EnregistrerUnFichier(Me.hWnd, "Selectionner une base à compacter", _
                                        "", "C:\Documents and Settings\xav\My Documents")
        If Len(sNomBase) = 0 Then
           MsgBox "Vous avez annulé l'opération"
           Exit Sub
        End If
        sNomBaseTmp = "C:\Documents and Settings\xav\My Documents\BaseTmp.MDB"
        DBEngine.CompactDatabase sNomBase, sNomBaseTmp '1. Compactage dans une nouvelle base
        Kill sNomBase '2. Suppression de la base originale
        Name sNomBaseTmp As sNomBase '3. Renommer la base compactée avec le nom de la base originale
     
    MsgBox "le compactage est reussi. Retrouver votre fichier dans le rep. indique" & _
    sNomBase, 1
    End Sub
    Attention : dans la FAQ il y une fonction EnregistrerUnFichier et une fonction OuvrirUnFichier.
    Tu as mis le code de EnregistrerUnFichier, mais ton lien pointe sur OuvrirUnFichier.

    Avec la fonction de OuvrirUnFichier de la FAQ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        sNomBase = OuvrirUnFichier(Me.hWnd, "Selectionner une base à compacter", _
                                   1, "Access", "md?", "C:\Documents and Settings\xav\My Documents")
    A+

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 50
    Points : 37
    Points
    37
    Par défaut EnregistrerUnFichier ou OuvrirUnFichier
    SAlut LedZepp,

    Merci pour ta participation.

    Je viens de verifier apres lecture de ton msg. J'ai rectifie le code. Dans ma base c'est bien le module provenant de "Afficher la boîte de dialogue ouvrir afin de récupérer le nom et le chemin du fichier sélectionné" auteur: Shwin.

    Merci pour le code de gestion de l'erreur et le code general.

    En oubliant cette erreur de copier/coller entre EnregistrerUnFichier et OuvrirUnFichier audessus.

    Le but premier de mon probleme etait d'associer les deux separement. un bouton "Parcourir" stockant le chemin+le nom puis un bouton "compacter".

    Peut on essayer de resoudre cet objectif? cela permettrait d'apprendre un poil plus encore...


    Merci encore

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Ok, ton problème doit être un problème de portée de variable.

    Déclare la variable sNomBase au début du module de code du formulaire.
    Elle devient ainsi, globale pour ce module, et toutes les Sub/Function de ce module y ont accès,
    sauf re-déclaration locale (dans la Sub/Function) d'une variable ayant le même nom.

    Si tu ne déclares sNomBase nulle part, ou seulement dans la Sub/Function, sa portée est limitée à la Sub/Function.

    Je sais pas si c'est bien clair ?
    C'est un principe qu'on retrouve dans tous les langages de programmation que je connais.

    A+

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 50
    Points : 37
    Points
    37
    Par défaut Location de"Dim sNomBase as String"
    Salut LedZepp,

    Merci pour tes explications. J'ai du attendre de rentrer pour essayer ceci. En effet, depuis que j'ai convaincu mon patron pour changer de methodes de database, tout le monde veut la sienne.
    C'est chouette, j'apprends grace a ce partage que vous maintenez.

    Bon revenons.

    J'ai passe pas mal de temps a essayer de placer cette declaration. Tu precisais dans le module, plusieurs fois tente, a des endroits sans succes.

    Puis je me suis dit que LedZepp y pensait costaud donc pour lui (toi) il n'aurait pas fait ca comme cela, attacher cette fonction a un bouton.

    Donc j'ai place ce bout de code Dim sNomBase as String juste apres "option Compare Base"

    Ca marche. Puis je realise que...
    Déclare la variable sNomBase au début du module de code du formulaire
    Voulait exactement dire cela.

    Merci LedZepp pour cette rigueur qui leve les subtilites. L'apprentissage en est que plus solide.

    Merci a vous.

    PS: comment partager ce petit outil du coup bien pratique puisque il permet de compacter une base que l'on choisit? dans contribuez?

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Oui, une déclaration de variable globale ou de constante globale se fait au début d'un module.
    C'est à dire, toutes les lignes qui se trouvent avant la première Sub ou Function du module.
    Dans l'éditeur Visual Basic, cela s'appelle la zone de Déclarations.
    Pour vérifier si le curseur se trouve bien dans cette zone, regarde les deux listes déroulantes se trouvant au dessus du code.
    La première doit afficher "(Général)" et la deuxième "(Déclarations)"
    Voir la copie d'écran ici.

    PS: comment partager ce petit outil du coup bien pratique puisque il permet de compacter une base que l'on choisit? dans contribuez?
    C'est le bon endroit.
    Personnellement j'ajouterai une gestion d'erreur pour le cas ou la méthode DBEngine.CompactDatabase échoue.
    Dans ce cas, il ne faut pas détruire la base d'origne, car sinon tu perds tout .

    A+

Discussions similaires

  1. Compactage d’une base de données MDF avec code Delphi
    Par Powerdj dans le forum Bases de données
    Réponses: 0
    Dernier message: 03/05/2015, 19h23
  2. De la rapidité du code
    Par jfloviou dans le forum Contribuez
    Réponses: 233
    Dernier message: 29/05/2009, 02h17
  3. Compactage de la base par du code VBA?
    Par juliojc13 dans le forum VBA Access
    Réponses: 2
    Dernier message: 22/05/2007, 17h06
  4. Question sur le code compactage de la FAQ
    Par Nicko29 dans le forum Access
    Réponses: 7
    Dernier message: 14/11/2005, 20h19

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