Incompatibilité de type [Résolu]

h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 12:48 - Dernière réponse : cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention
- 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 .....
Afficher la suite 

Votre réponse

17 réponses

cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 2 juil. 2007 à 21:02
+3
Utile
 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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_JMO
cs_Exploreur 4824 Messages postés lundi 11 novembre 2002Date d'inscription 15 novembre 2016 Dernière intervention - 2 juil. 2007 à 13:27
0
Utile
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

 
Commenter la réponse de cs_Exploreur
cs_MPi 3866 Messages postés mardi 19 mars 2002Date d'inscription 23 mai 2018 Dernière intervention - 2 juil. 2007 à 14:10
0
Utile
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
Commenter la réponse de cs_MPi
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 2 juil. 2007 à 14:37
0
Utile
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...)
Commenter la réponse de jmfmarques
h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 15:28
0
Utile
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 .....
Commenter la réponse de h_adil
h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 15:28
0
Utile
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 .....
Commenter la réponse de h_adil
cs_MPi 3866 Messages postés mardi 19 mars 2002Date d'inscription 23 mai 2018 Dernière intervention - 2 juil. 2007 à 15:54
0
Utile
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
Commenter la réponse de cs_MPi
h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 20:32
0
Utile
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 .....
Commenter la réponse de h_adil
h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 21:23
0
Utile
programation .....
Commenter la réponse de h_adil
h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 21:23
0
Utile
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 .....
Commenter la réponse de h_adil
cs_MPi 3866 Messages postés mardi 19 mars 2002Date d'inscription 23 mai 2018 Dernière intervention - 2 juil. 2007 à 21:34
0
Utile
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
Commenter la réponse de cs_MPi
h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 21:43
0
Utile
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 .....
Commenter la réponse de h_adil
cs_MPi 3866 Messages postés mardi 19 mars 2002Date d'inscription 23 mai 2018 Dernière intervention - 2 juil. 2007 à 21:46
0
Utile
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
Commenter la réponse de cs_MPi
h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 21:59
0
Utile
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 .....
Commenter la réponse de h_adil
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 2 juil. 2007 à 22:20
0
Utile
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
Commenter la réponse de cs_JMO
h_adil 231 Messages postés mercredi 27 avril 2005Date d'inscription 10 juin 2009 Dernière intervention - 2 juil. 2007 à 22:27
0
Utile
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 .....
Commenter la réponse de h_adil
cs_JMO 1850 Messages postés jeudi 23 mai 2002Date d'inscription 11 mai 2018 Dernière intervention - 2 juil. 2007 à 22:30
0
Utile
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
Commenter la réponse de cs_JMO

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.