Exporter une table vers un repertoire de l'utilisateur courrant

Exporter une table vers un repertoire de l'utilisateur courrant - VB/VBA/VBS - Programmation

Marsh Posté le 25-04-2005 à 12:17:42    

Bonjour,
Je suis un grand débutant dans Access, et on me demande de modifier un fichier afin d'extraire des données vers un fichier .CSV
Le programme est deja fait, sauf pour le chemin du repertoire.
Il faudrait que je puisse dire à Access que dans le chemin, il y a une variable contenant le User windows en cour d'utilisation (NomUtilisateur) dans le code
J'ai trouvé sur le net comment faire :
1 module qui contient :

Citation :

Public Declare Function RecupNomUtilisateur Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long


1 module qui contient :

Citation :

Public Function NomUtilisateur() As String
    Dim StrNomUtilisateur As String
    Dim Resultat As Long ' Contiendra simplement 1 si l'appel s'est bien déroulé
    StrNomUtilisateur = String$(255, 0)
    Resultat = RecupNomUtilisateur(StrNomUtilisateur, 255)
    If Resultat = 1 Then
    NomUtilisateur = StrNomUtilisateur
    Else
    NomUtilisateur = "UTILISATEUR INCONNU"
    End If
    End Function


 
Mais voilà, je comprend pas comment recuperer ça dans mon code :

Citation :

Private Sub cmdCreationExcelmajConditions_Click()
 
    DoCmd.SetWarnings False
     
    DoCmd.OpenTable "Fichier des mises à jour", acNormal, acEdit
    'Beep
    'MsgBox "Tous les enregistrement du fichier vont être supprimés. Si le fichier n'est pas sauvegardé, arrêter la macro (échap) et sauvegarder le fichier avant de relancer l'export.", vbCritical, "FICHIER DES MISES A JOUR"
    DoCmd.RunCommand acCmdSelectAllRecords
    DoCmd.RunCommand acCmdDelete
    DoCmd.Close acTable, "Fichier des mises à jour"
         
    DoCmd.OpenQuery "Fichier export Excel pour mise à jour COB"
    DoCmd.TransferText acExportDelim, "Fichier des mises à jour Spécification d'exportation", "Fichier des mises à jour", "c:\Documents and Settings\NomUtilisateur\Mes documents\fichiers des mises à jour.csv", False, ""
 
    'Beep
    MsgBox "Transfert terminé sur c:\documents and settings\NomUtilisateur\mes documents\fichiers des mises à jour.csv", vbInformation, "Export vers Excel"
     
    DoCmd.SetWarnings True
     
End Sub


 
 
Avez vous une idée de ce que je dois faire (parce qu'avec l'initiation Access sur 2 jours que j'ai eu il y a 2 ans de ça, j'ai un peu de mal .....)
 
Merci infiniment !

Reply

Marsh Posté le 25-04-2005 à 12:17:42   

Reply

Marsh Posté le 25-04-2005 à 13:38:45    

Rajoute tout simplement l'appel à ta fonction :

Code :
  1. DoCmd.TransferText acExportDelim, "Fichier des mises à jour Spécification d'exportation", "Fichier des mises à jour", "c:\Documents and Settings\" & NomUtilisateur & "\Mes documents\fichiers des mises à jour.csv", False, ""


 
Et idem pour la msgbox. Mais puisque tu as regardé du côté des API, regarde s'il n'existe pas une fonction qui renvoie directement le path de "Mes documents". Parce que si un utilisateur décide de déplacer "Mes documents" sur un autre disque ou à un autre endroit (il peut le faire), ton code va planter...

Reply

Marsh Posté le 25-04-2005 à 14:18:03    

Salut et merci pour ta reponse rapide et surtout tres utile
Ca semble marcher, sauf que maintenant, j'ai un message d'erreur comme quoi la "mise à jour impossible, la base de donnée ou l'objet est en lecture seule."
En revanche ça marche tres bien si je remplace la variable par mon nom de user...
 
pour ta suggestion, merci beaucoup, mais sur nos machines, les utilisateurs sont suffisement bridés pour eviter justement ce genre de probleme. mais l'idée de base est bonne, je vais chercher en parallele si je trouve l'API en question

Reply

Marsh Posté le 03-05-2005 à 17:51:17    

Salut
Un petit up car j'ai pas trouvé comment me debarasser de l'erreur de lecture seule
 
Merci beaucoup

Reply

Marsh Posté le 04-05-2005 à 11:01:20    

Salut,
 
Est-ce que tu es sûr que ton fichier est bien fermé lorsque tu tentes de refaire l'extraction?
 
Est-ce que tu es sûr d'avoir les droits sur le répertoire de l'utilisateur? Si tu essaies d'écrire dans le répertoire d'un autre utilisateur et que tu n'es pas administrateur de la machine, je pense que tu n'auras pas les droits... Et donc tu risques bien de rencontrer un message d'erreur style "lecture seule".
 
Regarde donc peut-être ces deux choses...
 
A+

Reply

Marsh Posté le 04-05-2005 à 14:05:50    

Bonjour
Pour repondre dans l'ordre
Le fichier est fermé
j'ai les droits sur l'utilisateur, puisque c'est moi
l'API va chercher l'utilisateur en cours (qui possede donc les droits necessaires pour ecrire sur son propre repertoire)

Citation :


DoCmd.TransferText acExportDelim, "Fichier des mises à jour Spécification d'exportation", "Fichier des mises à jour", "c:\Documents and Settings\" & NomUtilisateur & "\Mes documents\fichiers des mises à jour.csv", False, ""


si je remplace " & NomUtilisateur &" par le user en cour, ça passe.
si je laisse, j'ai une erreur d'execution '3027' l'objet ou la base de donnée est en lecture seule
 
J'utilise la même variable dans ma msgbox et il me renvoie bien le user pourtant
je seche un peu là héhé
Merci pour tes reponses en tout cas

Reply

Marsh Posté le 04-05-2005 à 14:40:43    

le_canard a écrit :

Bonjour
Pour repondre dans l'ordre
Le fichier est fermé
j'ai les droits sur l'utilisateur, puisque c'est moi
l'API va chercher l'utilisateur en cours (qui possede donc les droits necessaires pour ecrire sur son propre repertoire)


Tout à fait... Je me souvenais plus des détails  :whistle:

le_canard a écrit :

si je remplace " & NomUtilisateur &" par le user en cour, ça passe.
si je laisse, j'ai une erreur d'execution '3027' l'objet ou la base de donnée est en lecture seule
 
J'utilise la même variable dans ma msgbox et il me renvoie bien le user pourtant
je seche un peu là héhé
Merci pour tes reponses en tout cas


Est-ce que tu as déjà essayé de passer par une variable pour construire ton nom de fichier (et du chemin) et voir ce qu'il retourne dans cette variable?
 
Essaie peut-être d'utiliser un nom de fichier/répertoire sans espaces pour tester: essaie de créer le fichier test.csv dans c:\tmp par exemple :)
 
Sinon, ton erreur d'exécution, est-ce que tu es sûr qu'elle est sur le nom de fichier et non sur la DB? Peut-être que quand tu fais l'export, Access essaie de modifier qqch dans la DB et si elle est en lecture seule...
 
Je n'en sais trop rien... Je lance juste des idées... Des fois on se focalise sur une chose et la solution est ailleurs (et non pas la vérité).
 
A+

Reply

Marsh Posté le 04-05-2005 à 15:26:09    

Citation :

Est-ce que tu as déjà essayé de passer par une variable pour construire ton nom de fichier (et du chemin) et voir ce qu'il retourne dans cette variable?


c'est ce que j'ai dans la msgbox, et je retrouve bien mon user en dur dedans
 

Citation :


Essaie peut-être d'utiliser un nom de fichier/répertoire sans espaces pour tester: essaie de créer le fichier test.csv dans c:\tmp par exemple :)


Si j'utilise un chemin court, je n'ai plus besoin de variable, et là ça passe nickel, de la même manière que si je remplace la variable par le user en brut dans le chemin

Citation :


Sinon, ton erreur d'exécution, est-ce que tu es sûr qu'elle est sur le nom de fichier et non sur la DB? Peut-être que quand tu fais l'export, Access essaie de modifier qqch dans la DB et si elle est en lecture seule


Je pense pas, puisque la variable ne fait que rechercher à remplacer " & NomUtilisateur & " par le user en dur, et que lorsque je le met en dur justement (sans la variable) j'ai pas l'erreur et le fichier arrive au bon endroit
 
Le probleme doit venir de la variable en elle même...
Mais je comprend pas pourquoi dans ce cas, elle marche pour ma msgbox qui reprend exactement la même syntaxe que le chemin dans lequel je veux exporter mon doc
 
Pfiouuuu, j'crois que j'vais demander à ma boite plus qu'ue simple initiation à Access moi  :D  
 
Mais merci pour les reponses, ça me permet de mieux comprendre comment fonctionne Access  :jap:

Reply

Marsh Posté le 10-05-2005 à 09:37:20    

Rebonjour tout le monde
J'en suis malheureusement toujour au même point
Si une bonne âme avait une autre idée que celles qui ont été posées ici, je suis preneur.
Merci beaucoup

Reply

Marsh Posté le 10-05-2005 à 15:11:41    

Bon, je suis parti sur une autre base, le choix !
Après tout, l'utilisateur a son libre arbitre, alors profitons en !

Citation :


Private Sub cmdCreationExcelmajConditions_Click()
    MsgBox "Sélectionnez le répertoire de destination", vbInformation, "Export vers Excel"
    MsgBox EnregistrerUnFichier(Me.Hwnd, "Enregistrer Sous", "fichiers des mises à jour.csv", "C:\" )
    DoCmd.SetWarnings False
    DoCmd.OpenTable "Fichier des mises à jour", acNormal, acEdit
    DoCmd.RunCommand acCmdSelectAllRecords
    DoCmd.RunCommand acCmdDelete
    DoCmd.Close acTable, "Fichier des mises à jour"
    DoCmd.OpenQuery "Fichier export Excel pour mise à jour COB"
    DoCmd.TransferText acExportDelim, "Fichier des mises à jour Spécification d'exportation", "Fichier des mises à jour", "fichiers des mises à jour.csv", False, ""
    'Beep
    MsgBox "Transfert terminé", vbInformation, "Export vers Excel"
    DoCmd.SetWarnings True


Ca c'est pour le formulaire
 
Et ça c'est pour la fonction :

Citation :


Private Declare Function GetSaveFileName Lib "comdlg32.dll" _
        Alias "GetSaveFileNameA" (pOpenfilename As OPENFILENAME) _
        As Long
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
 
 
Function EnregistrerUnFichier(Handle As Long, Titre As String, _
                    NomFichier As String, Chemin As String) As String
 
Dim structSave As OPENFILENAME
 
With structSave
    .lStructSize = Len(structSave)
    .hWndOwner = Handle
    .nMaxFile = 255
    .lpstrFile = NomFichier & String$(255 - Len(NomFichier), 0)
    .lpstrInitialDir = Chemin
    .lpstrFilter = "Tous (*.*)" & Chr$(0) & "*.*" & Chr$(0)
    .Flags = &H4
End With
 
If (GetSaveFileName(structSave)) Then
    EnregistrerUnFichier = Mid$(structSave.lpstrFile, 1, InStr(1, structSave.lpstrFile, vbNullChar) - 1)
End If
 
End Function


 
 
Comme ça mon utilisateur choisi son repertoire, il lance le script, et zou, la table s'enregistre dans le répertoire qu'il a selectionné !
 
ps : Si quelqu'un à tout de même une solution je reste preneur, ça comblera ma curiosité !
Merci à toutes et tous !

Reply

Marsh Posté le 10-05-2005 à 15:11:41   

Reply

Marsh Posté le 27-12-2006 à 11:17:57    

Hello,
 
J'ai eu le même problème, et j'ai trouvé la solution en anglais :
 
http://support.microsoft.com/defau [...] GB;q306144
 
En gros, Access ne permet l'import/export que de certain type de fichier. Une clef de registre  
HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\Text\DisabledExtensions
contient les extensions des fichiers autorisés à être importés/exportés.
 
Soit tu rajoutes l'extension de ton fichier dans cette liste, soit tu remplace la liste par *, et plus de problèmes.
La dernière solution si tu ne veux pas aller toucher au registre, est d'enregistrer le fichier en .txt et de le renommer après. Je sais, c'est bête, mais ça fonctionne.
 
Amicalement


Message édité par sharpmao le 28-12-2006 à 08:33:13
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed