Changer l'extension de fichier par VBA

bonjour tout le monde,
voila j’ai un problème de clé primaire c’est à dire que l’importation dont je parle dans ce sujet, je doit le réaliser sur plusieur table dans un même bouton(ca pas de souci). Mon problème c’est que je doit créer un champ de type NumeroAuto (ca je sait fer) qu’il soit clé primaire pour chaque table.(Pour le moment je m’occupe que de 4 table, j’en aurais encore2). Mais le probléme c’est que le champ ne se créer pas, donc je me pose 2 question à propose de ce problème :
1) est-il vraiment possible d’insérer 2 champ NumeroAuto dans différente table sous un même bouton??
2) es-ce que je me trompe pas dans mon code pour les clé primaires??!!??

Private Sub Impor_Bpss_Ipms_Click()
On Error GoTo Err_Impor_Bpss_Ipms_Click
     
    'Ajoute comme référence Microsoft Scripting Runtime
    Dim Fso, Fi
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Dim NomFile As String
    Dim rep As String
    Dim X As String
    Dim oInd1, oInd2, oInd3, oInd4  As dao.Index
    Dim oFld1, oFld2, oFld3, oFld4 As dao.Field

    If Dir("X:\Comptes Utilisateurs\stagebeluc\Loïc\*.ls0") > "" Then
        rep = "X:\Comptes Utilisateurs\stagebeluc\Loïc\"
        For Each Fi In Fso.GetFolder(rep).Files
            If UCase(Fso.GetExtensionName(Fi.Name)) = "LS0" Then
                NomFile = Mid(Fi.Name, 1, InStrRev(Fi.Name, "."))
                'Copie le fichier True = Ecrase si exsite
                Call Fi.Copy(rep & NomFile & "txt", True)
            End If
        Next
         MsgBox ("la modification des extractions à été effectuées")
        Set Fso = Nothing
        Set Fi = Nothing
        X = Dir("X:\Comptes Utilisateurs\stagebeluc\Loïc\*.txt") ' ou ce que tu veux exactement comme étendue
        While X <> ""
            X = "X:\Comptes Utilisateurs\stagebeluc\Loïc\" + X
            DoCmd.TransferText acImportDelim, "Ipms_icxs_pves_epms_iens_ha Spécification d'importation", "ipms_icxs_pves_epms_iens_ha", X, True
            DoCmd.RunSQL "ALTER TABLE Ipms_icxs_pves_epms_iens_ha ADD COLUMN Numero COUNTER;"
            Set oInd1 = CurrentDb.TableDefs("Ipms_icxs_pves_epms_iens_ha").CreateIndex("PrimaryKey")
            Set oFld1 = oInd1.CreateField("Numero")
            oInd1.Fields.Append oFld1
            oInd1.Primary = True
            oInd1.Unique = True
            CurrentDb.TableDefs("Ipms_icxs_pves_epms_iens_ha").Indexes.Append oInd1
            Set oInd1 = Nothing
            Set oFld1 = Nothing
            
            DoCmd.TransferText acImportDelim, "Ipms_icxs_pves_epms_iens_ha_naz Spécification d'importation", "ipms_icxs_pves_epms_iens_ha_naz", X, True
            DoCmd.RunSQL "ALTER TABLE Ipms_icxs_pves_epms_iens_ha_naz ADD COLUMN Numero COUNTER;"
            Set oInd2 = CurrentDb.TableDefs("Ipms_icxs_pves_epms_iens_ha_naz").CreateIndex("PrimaryKey")
            Set oFld2 = oInd2.CreateField("Numero")
            oInd2.Fields.Append oFld2
            oInd2.Primary = True
            oInd2.Unique = True
            CurrentDb.TableDefs("Ipms_icxs_pves_epms_iens_ha_naz").Indexes.Append oInd2
            Set oInd2 = Nothing
            Set oFld2 = Nothing
            
            DoCmd.TransferText acImportDelim, "Ipms_icxs_pves_epms_iens_fab Spécification d'importation", "ipms_icxs_pves_epms_iens_fab", X, True
            DoCmd.RunSQL "ALTER TABLE Ipms_icxs_pves_epms_iens_fab ADD COLUMN Numero COUNTER;"
            Set oInd3 = CurrentDb.TableDefs("Ipms_icxs_pves_epms_iens_fab").CreateIndex("PrimaryKey")
            Set oFld3 = oInd3.CreateField("Numero")
            oInd2.Fields.Append oFld3
            oInd2.Primary = True
            oInd2.Unique = True
            CurrentDb.TableDefs("Ipms_icxs_pves_epms_iens_fab").Indexes.Append oInd3
            Set oInd3 = Nothing
            Set oFld3 = Nothing
            
            DoCmd.TransferText acImportDelim, "Ipms_icxs_pves_epms_iens_fab_naz Spécification d'importation", "ipms_icxs_pves_epms_iens_fab_naz", X, True
            DoCmd.RunSQL "ALTER TABLE Ipms_icxs_pves_epms_iens_fab_naz ADD COLUMN Numero COUNTER;"
            Set oInd4 = CurrentDb.TableDefs("Ipms_icxs_pves_epms_iens_fab_naz").CreateIndex("PrimaryKey")
            Set oFld4 = oInd4.CreateField("Numero")
            oInd2.Fields.Append oFld4
            oInd2.Primary = True
            oInd2.Unique = True
            CurrentDb.TableDefs("Ipms_icxs_pves_epms_iens_fab_naz").Indexes.Append oInd4
            Set oInd4 = Nothing
            Set oFld4 = Nothing
            X = Dir()
        Wend
        
        
        MsgBox ("les importations ont été réalisées")
    Else
        MsgBox ("erreur")
    End If
     
Exit_Impor_Bpss_Ipms_Click:
    Exit Sub

Err_Impor_Bpss_Ipms_Click:
    MsgBox err.Description
    Resume Exit_Impor_Bpss_Ipms_Click
    
End Sub

lorsque j’effectue cela, j’ai un message d’erreur qui s’affiche, c’est le suivant :

merci d’avance pour vos aides!!

Il faut voir où dans le code du as l’erreur, ça ira beaucoup plus vite !

Apparemement il y a la propriété “MaxLocksPerFile” que tu peux changer.
(voir aussi peut-être ça: www.commentcamarche.net…)

Je pense que le souci vient de la commande “TransferText”.
Vérifie si tu ne dois pas fermer proprement la connexion quelque part entre chaque import de fichier, pour éviter qu’ils restent tous en mémoire.

ben j’ai fais en pas à pas et le probléme provient qu’apré avoir créé le premier champ, ben il se bloke 'est à dire qu’il va sur la ligne :

Mais la dernière ligne exécutée (celle où à lieu l’erreur) c’est “DoCmd.TransferText” (pour le deuxième fichier/champ) ou avant ?

hein, j’ai pas compris, peux-tu rexpliquer s’il te plais??

Je voudrait savoir exactement à quelle ligne se produit l’erreur (dernière ligne exécutée avant MsgBox err.Description) !
DoCmd.TransferText … ?

ben en faite en mode pas à pas ça fait :

  1. X = Dir(“X:“Comptes Utilisateurs"stagebeluc"Loïc”*.txt”)
  2. DoCmd.TransferText acImportDelim, “Ipms_icxs_pves_epms_iens_ha Spécification d’importation”, “ipms_icxs_pves_epms_iens_ha”, X, True
  3. ensuite l’importation s’effectue
  4. DoCmd.RunSQL “ALTER TABLE Ipms_icxs_pves_epms_iens_ha_naz ADD COLUMN Numero COUNTER;”
  5. ensuite ça réfléchi
  6. MsgBox err.Description
  7. le message que je té parlé tout t’a l’heure
  8. Resume Exit_Impor_Bpss_Ipms_Click

Euhhhh :riva:

Peut-être des pistes ici: www.thescripts.com…

Il doit essayer de modifier la structure de la table alors que le transfert n’est pas terminé.
Pour le confirmer, mets un msgbox entre les deux provisoirement, et attends quelques secondes avant de valider.
et dis nous ce que ca donne

t’aurai pas pu me trouver un site en français!!LOL. j’ai pas tout compris ce qu’il dise sur ce site!!lol; MAIS Jai regaré ce qu’il disé et je n’est rien vu


ok gcc, tu ve ke je mette un MsgBox entre les 2 quoi??

Ouais pourquoi pas. Ou un DoEvents, parfois ça aide…

La taille du fichier que tu importes est grande (Mb/lignes)?

et les mecs, jcomprends rien a ske vous me raconter??!!lol.
ben je sait qu’il y a pas mal de ligne ds chasque fichier donc oui je pense!!

donc je fais quoi pour nous aider??

Y a aussi 2-3 trucs ici (en français, puisque môssieur est exigent :icon_biggrin:): www.developpez.net…
Essaie de “jouer” avec DBEngine.SetOption dbMaxLocksPerFile, …


[quote="loic20h28"] et les mecs, jcomprends rien a ske vous me raconter??!!lol. ben je sait qu'il y a pas mal de ligne ds chasque fichier donc oui je pense!!

donc je fais quoi pour nous aider??
[/quote]

Ben c’est stupide mais parfois un msgbox entre deux instruction oblige VBA a complètement terminer l’opération précédente et libérer de la mémoire avant de passer à la suite.

La commande DoEvents est censée avoir à peu près le même effet mais ça marche pas toujours.

Mais ici apparemment c’est plutôt un souci à l’accès des données par Access, donc je ne pense pas que ça va marcher, mais essaie !

mais non c’est pas que sui exigeant, j’avais juste envie de t’embéter un ti peu!!rolaalalalaa fo rire défoi!!MDR.
ben ok, jve bien joué avec : [quote=""]
ssaie de “jouer” avec DBEngine.SetOption dbMaxLocksPerFile, …
[/quote]
mais je le place ou?? ca sert à quoi??(au moin que je comprenne car la pour le moment je comprend pas gd chose!!lol

Dans l’aide on trouve que la valeur par défaut est: MaxLocksPerFile= 9500

MaxLocksPerFile:
Ce paramètre empêche les transactions de Microsoft Jet de dépasser la valeur spécifiée. Si le verrou d’une transaction tente de dépasser cette valeur, la transaction est divisée en deux parties ou plus et entérinée partiellement. Ce paramètre a été ajouté pour éviter que le serveur Netware 3.1 se bloque si la limite du verrou Netware spécifié est dépassée, et pour améliorer les performances de Netware et NT.

Alors tu peux essayer de mettre au début de ton code:

DBEngine.SetOption dbMaxLocksPerFile, 20000

Par exemple.

Et si tu veux faire quelque chose de très propre et remettre les options d’origine enuite, et bien à la fin il faut mettre:

DBEngine.SetOption dbMaxLocksPerFile, 9500

Edit: pour trouver ces infos, recherche "SetOption" (sous DBEngine) dans l'aide. Tu auras ensuite un lien vers "Initialisation du moteur de base de données Microsoft Jet x.x Engine"

tout d’abord merci jray pour tes explication et aussi de prendre de ton temps pour m’aider!! j’ai mit : [quote=""]
Code :DBEngine.SetOption dbMaxLocksPerFile, 20000
[/quote]
en tout début de mon code mais maintenant ca me met : “argument invalide”

Effectivement il y a un souci j’ai pas trouvé pourquoi.

Ce que j’ai lu ici c’est que poru contourné le problème il faut ouvrir la table, enregistrer/modifier 9000 enregistrement, fermer la table, puis recommencer avec la suite.

Mais ça n’est pas valable si tu utilise une commande d’importation automatique comme TransferText, dans ce cas tu dois tout faire manuellement.

Essaie de chercher un exemple d’utilisation de DBEngine.SetOption, là je dois aller dîner !

Entre “DoCmd.TransferText acImportDelim,…” et "DoCmd.RunSQL “ALTER TABLE …”
Le but c’est d’introduire une tempo, comme l’a expliqué plus loin jray

jray -> doevents() : là tu brûles les étapes. C’est effectivement ce à quoi je pensais ensuite, mais d’abord confirmer le défaut.

Je pense que le problème se situe plus au niveau du nombre d’enregistrements de la table. C’est déconseillé de modifier une structure sur une table volumineuse. Mieux vaut créer une structure vide et faire ensuite un append
Tu as combien d’enregistrements dans ta table ?

Effectivement.

Mais là je dirais que le problème vient déjà de TransferText, pas le ALTER TABLE. Si c’était ça, on pourrait contourner assez facilement, mais si le problème c’est l’import avex TransfertText, il risque de ne pas y a voir d’autre solution que de réaliser l’import manuellement (enregistrement par enregistrement).

ben avec un MsgBox comme tu me la demandé gcc, je sait pas pourquoi mé depui ke g mi le DBEngine… de jray ben ca m’affiche “Invalid Argument” alors que j’ai enlevé le DBEngine…!! bizarre!!
mais j’ai du mal a comprendre pourquoi le problème sera du “Transfert…” alors que sans le code pour la clé primaire donc pour la création d’un nouveau champ, l’importation fonctionné impeccablement donc personnellemen si j’essaye d’être logique, je trouve ca bizarre que ce soit au niveau du transfert!!