Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
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!
Dernière modification par Invité ; 21/09/2016 à 00h37.
je n'arrive pas à placer mon if rst!Position_CSV=i then (traitement normale)
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 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!
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 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
Dernière modification par Invité ; 21/09/2016 à 14h06.
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!
"Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
---------------
Mes billets de blog sur DVP
Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
---------------
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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 ' 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)!
Dernière modification par Invité ; 22/09/2016 à 08h47.
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 aide
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 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 encore
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Merci
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 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!
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager