Code:
1
2
3
4
5 If NombreDeSeparateurs = NombreAttendu Then ... ' traitement normal Else ... ' Traitement de l'erreur par écriture dans une table de log ou un fichier log End If
Version imprimable
Code:
1
2
3
4
5 If NombreDeSeparateurs = NombreAttendu Then ... ' traitement normal Else ... ' Traitement de l'erreur par écriture dans une table de log ou un fichier log End If
Bonsoirs,
Comme je l'ai dis plus comme Pierre également , si il n'y a pas de solution contournes la.
comme je te l'ai déjà suggéré je concatènerai autant de [;] qu'il y a. De champs si pour une raison obscure il n'y avait pas de ; le ubound ferrait erreur!
Rajouter autant de points virgules que de champs sous entend que le ubond retourne le double de la taille -1
Ce ai évite toute ambiguïté!
Maintenant si tu concatènes ton message champ avec autant se point virgule qu'il y a de champs, tu peux vérifier si tel champs est un numérique, si tel champ est un prénom si tel champ est un nom et si il n'y a qu'un prénom décider arbitrairement ue c'est le nom!
Pour cela il te faut un dictionnaire de prénom.
J'avais trouvé tout le prénom connus à l'état civil belge ça me faisait un bonne échantillon!
je n'arrive pas à placer mon if rst!Position_CSV=i then (traitement normale)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
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 ligne = oTxt.ReadLine strArray = Split(ligne, ";") For i = LBound(strArray) To UBound(strArray) strArray(i) = Replace(Trim(strArray(i)), """", "") ' replace " by nothing Next DoCmd.RunSQL "UPDATE Champ SET Position_CSV = -1 WHERE Table = '" & TableName & "'" Set rst = CurrentDb.OpenRecordset("SELECT * FROM Champ WHERE Table = '" & TableName & "' Order by OrderIndex") If rst.RecordCount > 0 Then rst.MoveFirst Do While Not rst.EOF 'Debug.Print rst!Champ For i = LBound(strArray) To UBound(strArray) ' find index in the array If rst!Champ = strArray(i) Then DoCmd.RunSQL "UPDATE Champ SET Position_CSV = " & i & " WHERE Table = '" & TableName & "' AND Champ = '" & rst!Champ & "'" End If Next rst.MoveNext Loop End If ' insert values Set rst = CurrentDb.OpenRecordset("SELECT * FROM Champ WHERE Position_CSV <> -1 AND Table = '" & TableName & "' Order by OrderIndex") If rst.RecordCount > 0 Then While Not oTxt.AtEndOfStream ligne = oTxt.ReadLine strArray = Split(ligne, ";") Set rst2 = CurrentDb.OpenRecordset(TableName) rst2.AddNew rst.MoveFirst Do While Not rst.EOF data = Replace(strArray(rst!Position_CSV), """", "") End If If strArray(rst!Position_CSV) <> "" And strArray(rst!Position_CSV) <> """""" Then rst2(rst!Champ).Value = data End If rst.MoveNext Loop rst2.Update Wend End If oTxt.Close End Function Function Traitement_Fichier_M(PathF, NameF, Index) If Index = 8 Then Set rst = CurrentDb.OpenRecordset("SELECT DISTINCT Table FROM Champ ") If rst.RecordCount > 0 Then rst.MoveFirst Do While Not rst.EOF If InStr(1, NameF, rst!Table & "_") = 1 Then ' starts with TableName_ End If rst.MoveNext Loop End If End If End Function
else msg box("non traité")
end if
si jamais vous avez des idees
merci
Bonjour,
imaginons qu tu est 3 champs!
Pièce jointe 220818Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 Sub test() ligne = String(1, ";") 'ici j'ai 2 champs et pas 3 strArray = Split(ligne & String(2, ";"), ";") If UBound(strArray) < 4 Then MsgBox "ne pourra pas être traité!" 'plus petit que 5 champs vue que le tabeau commence à 0 else for i=0 to 2 next ' For i = LBound(strArray) To UBound(strArray) ' find index in the array ' If rst!Champ = strArray(i) Then ' DoCmd.RunSQL "UPDATE Champ SET Position_CSV = " & i & " WHERE Table = '" & TableName & "' AND Champ = '" & rst!Champ & "'" ' End If ' Next end if End Sub
Vraisemblablement tu n'as pas compris ce que j'ai voulu dire car ça ne devrait pas planté car tubas le message et data = Replace(strArray(rst!Position_CSV), """", "") devrait ce trouvé dans le else!
Bien sur ils faut tenir compte du nombre de ;,dans ton split.
En d'autre terme tu as x champs matérialiste par de ; compte le nombre max possible -1.
C'est vraiment trop difficile de donner le contenu de strArray et de rst!Position_CSV? Et tu affectes le résultat à une variable nommée data? D'où sort-elle, cette variable? Elle n'est pas déclarée dans ta procédure. As-tu la déclaration obligatoire des variables (Ligne Option Explicit en tout début de module)? Et tant qu'on y est, donner le message d'erreur, c'est parfois une bonne idée!
Tu crois qu'on a une boule de cristal où une connexion fantôme vers ton pc?
48 messages pour un problème qui est probablement basique simplement parce que tu ne nous aides pas à t'aider!
il me faut absolument la valeur depour lire la valeur ouvre la fenêtre d’exécution raccourci [Ctrl] + [G] et execute le programme en pas à pas touche [F8]Code:
1
2 ligne = oTxt.ReadLine debug.print ligne
si le données sont confidentiel replace les par des valeur bidon mais il me faut absolument le nombre de [;] dans un cas de figure qui fonctionne
pour information,comme le disait Pierre, il est difficile d'aider quelqu'un qui ne fournit pas d'information.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 ' insert values Set rst = CurrentDb.OpenRecordset("SELECT * FROM Champ WHERE Position_CSV <> -1 AND Table = '" & TableName & "' Order by OrderIndex") If rst.RecordCount > 0 Then While Not oTxt.AtEndOfStream ligne = oTxt.ReadLine 'Debug.Print Ligne strArray = Split(ligne & ";", ";") If UBound(strArray) < 3 Then 'si tu as 3 champs MsgBox "ne pourra pas être traité!" Else strArray = Split(ligne , ";") Set rst2 = CurrentDb.OpenRecordset(TableName) rst2.AddNew rst.MoveFirst Do While Not rst.EOF data = Replace(strArray(rst!Position_CSV), """", "") If strArray(rst!Position_CSV) <> "" And strArray(rst!Position_CSV) <> """""" Then rst2(rst!Champ).Value = data End If rst.MoveNext Loop rst2.Update End If Wend End If oTxt.Close End Function
De plus tu nomes tes objet de façon incohérente en regard du langage usuel.
Il ma fallu du temps pour comprendre que Champ était une table alors que Tb_Champ ne laisse aucune ambiguïté!
Préfixe tes objet (Tb_,Rq_,Fm_,Et_) pour (table,requête,formulaire,état)!
hello,
trouvé finalement c'était juste un pb de boucle il fallait inversé les arguments
voici le progo si ca peut aidé :
merci bcq de votre aideCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 If UBound(strArray) = i Then 'si tu as 3 champs strArray = Split(ligne, ";") Set rst2 = CurrentDb.OpenRecordset(TableName) rst2.AddNew rst.MoveFirst Do While Not rst.EOF data = Replace(strArray(rst!Position_CSV), """", "") If strArray(rst!Position_CSV) <> "" And strArray(rst!Position_CSV) <> """""" Then rst2(rst!Champ).Value = data Else rst2(rst!Champ).Value = "0" End If rst.MoveNext Loop
le fichier txt est également réussi grace à ce code :
Merci encoreCode:
1
2
3
4
5
6
7
8
9
10
11
12 Function Export_Txt() Dim rs As DAO.Recordset Open "d:\export.txt" For Output As #1 Set rs = CurrentDb.OpenRecordset("contact") Do While Not rs.EOF Print #1, rs.Fields("id") & ";"; rs.Fields("Prenom") & ";" & rs.Fields("nom") rs.MoveNext Loop Close #1 End Function
Bonjour,
Le temps d'exécution de macro me semble lent, n'existe-il pas un moyen d'optimiser celui ci?
Car une boucle qui parcours plusieurs fichiers pour chercher les données
merci
Bonjour,
Code:
1
2
3
4
5
6
7
8
9
10
11 Function Export_Txt() Dim rs As DAO.Recordset,txt as string Set rs = CurrentDb.OpenRecordset("contact") Do While Not rs.EOF txt=txt & rs.Fields("id") & ";" & rs.Fields("Prenom") & ";" & rs.Fields("nom") & vbcrlf rs.MoveNext Loop Open "d:\export.txt" For Output As #1 Print #1,txt Close #1 End Function
Re,
c'est surtout le code d'avant
MerciCode:
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 insert values Set rst = CurrentDb.OpenRecordset("SELECT * FROM Champ WHERE Position_CSV <> -1 AND Table = '" & TableName & "' Order by OrderIndex") If rst.RecordCount > 0 Then While Not oTxt.AtEndOfStream ligne = oTxt.ReadLine 'Debug.Print Ligne strArray = Split(ligne & ";", ";") If UBound(strArray) < 3 Then 'si tu as 3 champs MsgBox "ne pourra pas être traité!" Else strArray = Split(ligne , ";") Set rst2 = CurrentDb.OpenRecordset(TableName) rst2.AddNew rst.MoveFirst Do While Not rst.EOF data = Replace(strArray(rst!Position_CSV), """", "") If strArray(rst!Position_CSV) <> "" And strArray(rst!Position_CSV) <> """""" Then rst2(rst!Champ).Value = data End If rst.MoveNext Loop rst2.Update End If Wend End If oTxt.Close End Function
déjà ton code me paris énormément complique pour ce que j'ai compris et je ne vois as la notion de fichier et de répertoire!
oui mais d'ou vient Mais quand me programme parcours toutes les tables (tables name comme variable)
nous ne trayons que sur un code qui me parais à la base bazarroîd , sur lequel nous ne savons ni les tenants et les aboutissant!
je ne peux pas te proposer de solution optimisé!