Incompatibilité de type [Résolu]

Signaler
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009
-
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
  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

Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
 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
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
12
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

 
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
23
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...)
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009

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 .....
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009

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 .....
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009

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 .....
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009

programation .....
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009

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 .....
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009

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 .....
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
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
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009

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 .....
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
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
Messages postés
231
Date d'inscription
mercredi 27 avril 2005
Statut
Membre
Dernière intervention
10 juin 2009

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 .....
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
25
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