Incompatibilité de type

Résolu
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009 - 2 juil. 2007 à 12:48
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 2 juil. 2007 à 22:30
  lorsque je compile mon code sur vba j'ai un message d'erreur "incompatibilité de type"
 strTabName=CDE20070702090603189.txt
je voudrais savoir comment il faut que je declare mon table pourqu'il prend en compte le format de strtabname.
merci
dim tableau
  If Len(strTabName(0)) >= 2 Then
          imax = imax + 1
          ReDim Preserve Tableau(2, imax)
          Tableau(1, imax) = strTabName(0)

programation .....

17 réponses

cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 26
2 juil. 2007 à 21:02
 Bonsoir [auteurdetail.aspx?ID=499829 h_adil]
,

Bonsoir Exploreur, MPI et Jacques,
Ne prenez pas peur au script proposé ci-dessous ....
Notre ami "h_adil" a eu la bienveillance d'ouvrir, pour son petit problème, de nombreux topics
qui se différencient par le nom des fichiers. Son but étant de les importer dans une base Access.
Si tous ses fichiers commencent par CDE,  il lui suffit d'adapter le script en vb6

Option explicit
Call TriRepertoire

Sub TriRepertoire()

Dim objFso, objShell
Dim strDesktop, strPath, strFile
Dim imax, i, j, k, bpermute  'liste
Dim Tableau()
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
strDesktop = objShell.SpecialFolders("Desktop")
strPath = objShell.SpecialFolders(4) & "\fichiercde"

imax = 0
For Each strFile In objFso.GetFolder(strPath).Files
    imax = imax + 1
    ReDim Preserve Tableau(imax)
    Tableau(imax) = strFile.Name
Next

bpermute = True                       
Do While bpermute = True             
   bpermute = False                 
   For j = 1 To imax - 1             
       If Tableau(j) > Tableau(j + 1) Then
          cprovisoire = Tableau(j)      
          Tableau(j) = Tableau(j + 1)     
          Tableau(j + 1) = cprovisoire 
          bpermute = True
       End If
   Next
Loop

'Affichage trié du répertoire
For k = 1 To imax
    'liste = liste & Tableau(k) &vbCrLf
    'If k = imax Then MsgBox "liste complète triée" &vbCrLf& liste
   
    DoCmd.TransferText acImport, "formatagetoto", _
          "TABLESOURCE", strPath & Tableau(k)
   
Next
End Sub

jean-marc
3
cs_Exploreur Messages postés 4822 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 14
2 juil. 2007 à 13:27
Salut,

Esssaye cela, car je ne vois pas comment est déclaré ta variable strTabName :

Dim strTabName As String

strTabName="CDE20070702090603189.txt"

A+
Exploreur

 Linux a un noyau, Windows un pépin

 
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 21
2 juil. 2007 à 14:10
Tu écris ceci
strTabName=CDE20070702090603189.txt
puis ceci
Tableau(1, imax) = strTabName(0)

Il faudrait savoir... C'est une variable String ou un tableau String ???

MPi
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 28
2 juil. 2007 à 14:37
Bonjour,

Sage question, MPI !

et, avant même de "poster", notre ami aurait pu avoir le réflexe de faire ceci :

Private Sub Command1_Click()
  strTabName = CDE20070702090603189.txt
  MsgBox Len(strTabName(0))
End Sub

pour décourvir l'incohérence, incohérence qui aurait été là également avec :

Private Sub Command1_Click()
  strTabName = "CDE20070702090603189.txt"
  MsgBox Len(strTabName(0))
End Sub

mais n'aurait pas, par exemple, été avec :

Private Sub Command1_Click()
  strTabName = Array("CDE20070702090603189.txt")
  MsgBox Len(strTabName(0))
End Sub

Mais voilà... il est tellement plus facile de crier "Bobo" que de tenter, sinon de comprendre, tout au moins ... de "vérifier" l'état des choses...
C'est, je le crains, devenu une habitude... que je déplore ...
J'arrive à comprendre que l'on ne sait pas encore. Mais je ne parviens pas à comprendre l'absence de réflexes naturels (voilà un pléonasme, tiens...)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009
2 juil. 2007 à 15:28
exemple de nom de fichier :
CDE20070702090603189.txt
CDE20070702090604189.txt
CDE200707020906031891.txt
CDE200707020906031892.txt
le strTabName c'est un tableau

For Each strFile In objFso.GetFolder(strPath).Files
    strTabName = Split(strFile.Name, ".txt")    If UBound(strTabName) 1 And UCase(Right(strFile.Name, 4)) ".TXT" Then
       If Len(strTabName(0)) >= 2 Then
         imax = imax + 1
          ReDim Tableau(1, imax) As String 'Preserve
          Tableau(1, imax) = strTabName(0)
          Tableau(2, imax) = strTabName(1)
         
       End If
    End If
Nex

programation .....
0
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009
2 juil. 2007 à 15:28
exemple de nom de fichier :
CDE20070702090603189.txt
CDE20070702090604189.txt
CDE200707020906031891.txt
CDE200707020906031892.txt
le strTabName c'est un tableau

Dim objFso, objShell
Dim strDesktop, strPath, strFile, strTabName
Dim i, imax, z, valeur, Cible, liste
Dim Tableau
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
strDesktop = objShell.SpecialFolders("Desktop")
strPath = objShell.SpecialFolders(4) & "\fichiercde"
For Each strFile In objFso.GetFolder(strPath).Files
    strTabName = Split(strFile.Name, ".txt")    If UBound(strTabName) 1 And UCase(Right(strFile.Name, 4)) ".TXT" Then
       If Len(strTabName(0)) >= 2 Then
         imax = imax + 1
          ReDim Tableau(1, imax) As String 'Preserve
          Tableau(1, imax) = strTabName(0)
          Tableau(2, imax) = strTabName(1)
         
       End If
    End If
Nex

programation .....
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 21
2 juil. 2007 à 15:54
En utilisant .txt comme délimiteur, ton tableau a un seul item, donc UBound = 1
>> strTabName = Split(strFile.Name, ".txt")

alors pourquoi inscrire 2 données ?
          Tableau(1, imax) = strTabName(0)
          Tableau(2, imax) = strTabName(1)  ' erreur attendue

Si, par contre, tu utilises le point dans ton Split, le tableau aura bien 2 items
    strTabName = Split(strFile.Name, ".")
    Tableau(1, imax) = strTabName(0)   ' nom du fichier

    Tableau(2, imax) = strTabName(1)   ' .txt

Mais encore là... à quoi ça sert de stocker le nom et l'extension ? et pourquoi utiliser un tableau à 2 dimensions ???

Et si tu lisais tous les fichiers ayant .txt comme extension, est-ce que ça causerait un problème ? Dois-tu ouvrir (ou sauvegarder) seulement certains de ces fichiers ? si oui, selon quels critères ?

MPi
0
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009
2 juil. 2007 à 20:32
en faite ce que je veux un programme capale d'importer des fichiers (que je connais pas le nombre) puis de deplacer ces fichiers après importation dans un autre repretoir (traité).

je suis pas un devellopeur pro, j'essaye de comprendre le programme puis je l'adapte.
est ce vous avez des idées pourquer sa serai plus simple je te remercié
programation .....
0
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009
2 juil. 2007 à 21:23
programation .....
0
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009
2 juil. 2007 à 21:23
MERCI BEUCOUP JEAN-MARC, en faite c'est ça ce que je veux.
j'ai juste une question : si je veut déplacer chaque fichier importer dans un autre repretoir historique  (couper/coller). j'utilise quelle synthaxe?

programation .....
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 21
2 juil. 2007 à 21:34
Voici un bout de code te permettant de lire chaque fichier .txt d'un répertoire et de le déplacer par la suite, sans devoir utiliser le FileSystemObject.

Sub LireLesFichiers()
    Dim CheminSource As String, CheminDest As String, Fichier As Variant
   
    'Changer les chemins selon les besoins - terminés par un \
    CheminSource = "C:"
    CheminDest = "D:"
   
    'Rechercher tous les fichiers .txt
    Fichier = Dir(CheminSource & " *.txt ")
    While Fichier <> ""
        'Traitement du fichier
       MsgBox Fichier
       
        'une fois traité on le déplace
        FileCopy CheminSource & Fichier, CheminDest & Fichier
        'une fois déplacé, on peut le détruire
        Kill CheminSource & Fichier
       
        Fichier = Dir  'recherche le suivant
    Wend
   
End Sub

MPi
0
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009
2 juil. 2007 à 21:43
je peux utilisé un movefile avec une boucle for i=1 to imax? je pense que c'est plus simple surtous je connais le nombre du fichier que j'ai dans mon repertoir. que pensez vous?

programation .....
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 21
2 juil. 2007 à 21:46
Salut Jean-Marc (et les autres...)
Effectivement, il y a eu plusieurs posts là-dessus et comme tu peux voir, je n'ai pas cherché à faire le traitement des fichiers... seulement la lecture des fichiers texte sans vérification de nom.

Perso, je préfère me passer du scrrun.dll (question de choix et de compatibilité...)

MPi
0
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009
2 juil. 2007 à 21:59
j'ai une question  j'ai insseré le filecopy et le kill dans la premiere procedure pour  faire le traitement dans la meme procedure. mais j'ai un message derreur chemin introuvable. et pourtant j'ai bien declarer mon chemin dorigine et mon chemin de destination

For k = 1 To imax
    'liste = liste & Tableau(k) &vbCrLf
    'If k = imax Then MsgBox "liste complète triée" &vbCrLf& liste
   
    DoCmd.TransferText acImport, "formatagetoto", _
          "TABLESOURCE", strPath & Tableau(k)
   
   
    FileCopy CheminSource & Tableau(k), CheminDest & Tableau(k)
    Kill CheminSource & Tableau(k)
Next

programation .....
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 26
2 juil. 2007 à 22:20
Re,

A partir de l'objFso ouvert, tu peux faire:

    DoCmd.TransferText acImport, "formatagetoto", _
          "TABLESOURCE", CheminSource & Tableau(k)
    
   msgbox CheminSource & Tableau(k) &vbcrlf& CheminDest & Tableau(k),,"Vérif Chemins"
  objFso.MoveFile CheminSource & Tableau(k), CheminDest & Tableau(k)

jean-marc
0
h_adil Messages postés 231 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 10 juin 2009
2 juil. 2007 à 22:27
oui je l'ai trouvé, c'etait pas evident mais je suis arrivé a faire ce que je voulais faire.
merci beaucoup pour votre aide
merci JEAN MARC
merci MPI
merci JMFMARQUES
merci EXPLOREUR

DONC  je vous montre mon code depuis le depuis jusqu'a la fin : (en esperant que demain fonctionne au travail )
le code suivant permet de changer l'extention d'un fichier, puis importer un par un les fichiers existant dans un dossier dans une base de données Accees. puis de faire les traitements dans access.
Sub TriRep()


Dim objFso, objShell
Dim strDesktop, strPath, strFile
Dim imax, i, j, k, bpermute  'liste
Dim Tableau()
Set objFso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
strDesktop = objShell.SpecialFolders("Desktop")
strPath = objShell.SpecialFolders(4) & "\dossier\traites"
CheminSource = "C:\Documents and Settings\adil\Desktop\dossier\traites"
CheminDest = "C:\Documents and Settings\adil\Desktop\dossier\old"


imax = 0
For Each strFile In objFso.GetFolder(strPath).Files
    imax = imax + 1
    ReDim Preserve Tableau(imax)
    Tableau(imax) = strFile.Name
Next


bpermute = True
Do While bpermute = True
   bpermute = False
   For j = 1 To imax - 1
       If Tableau(j) > Tableau(j + 1) Then
          cprovisoire = Tableau(j)
          Tableau(j) = Tableau(j + 1)
          Tableau(j + 1) = cprovisoire
          bpermute = True
       End If
   Next
Loop


'Affichage trié du répertoire
For k = 1 To imax
    'liste = liste & Tableau(k) &vbCrLf
    'If k = imax Then MsgBox "liste complète triée" &vbCrLf& liste
   
    DoCmd.TransferText acImport, "formatagetoto", _
          "TABLESOURCE", strPath & Tableau(k)
   
   
    FileCopy CheminSource & "" & Tableau(k), CheminDest & "" & Tableau(k)
    Kill CheminSource & "" & Tableau(k)
Next


DoCmd.RunMacro ("ECLATER")
DoCmd.RunMacro ("DECOMPOSER")
End Sub
juste pour info : pour excuter une commande MS dos a partir de vba il faut utiliser la synthaxe suivante :
'Dim RetVal
'RetVal = Shell("C:\Documents and Settings\adil\Desktop\dossier\transformerextention.bat", 1)
programation .....
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 26
2 juil. 2007 à 22:30
Re,

Dans mon exemple en vbs, j'ai ajouté:
strPath = objShell.SpecialFolders(4) & "\fichiercde"
strPathSauv = objShell.SpecialFolders(4) & "\sauvegarde_fichiercde"

If Not objFso.FolderExists(strPathSauv) Then objFso.CreateFolder(strPathSauv)

Salut MPI,
Je n'ai pas vb6, je scripte simplement en vbs. Donc pas de FileCopy, Kill ....
Access accepte-il le vb6 et le vbs ?

jean-marc
0