Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
971 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] problème dans une boucle

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

[VBA] problème dans une boucle

n°1913291
foxley_gra​vity
Posté le 10-08-2009 à 10:24:47  profilanswer
 

Bonjour ,  
 
J'ai un petit probleme ... j'ai un grand nobmre d'instruction à longue à réiterer ..  : plusieuer fiche txt a convertir en xls .  
Ma macro cré un fichier xls , copie le fichier txt dedans , le converti , puis renomme le fichier xls avec le même nom du fichier txt qu'elle vient de convertir...
J'arrive à le faire pour 1 fichier mais quand j'essaye avec des boucles , je me perds un peu ... merci de m'aider  
 
Voici le fichier qui marche pour 1 document
 
 

Code :
  1. 'création fichier cible (vide) dans le fichier que l'utilisateur à créer pour mettre les fichiers du SI txt
  2.  
  3. Set xlApp = CreateObject("Excel.Application" )
  4. Set xlBook = xlApp.Workbooks.Add
  5.  
  6.  
  7.  
  8. NomFichier = nom & "P37784.xls"
  9. xlBook.SaveAs NomFichier
  10. xlBook.Close
  11. xlApp.Quit
  12.  
  13. Set xlBook = Nothing
  14. Set xlApp = Nothing
  15.  
  16.  
  17. 'On définit les fichiers sources et cible
  18.  
  19. SourceFichier = nom & "P37784.txt" ' Définit le nom et le chemin(ici E:\test) du fichier source.
  20. DestinationFichier = nom & "P37784.xls" ' Définit le nom du fichier et le nouveau chemin (ici E:\new) cible.
  21.  
  22.  
  23.  
  24. 'Copie le fichier source dans le fichier cible
  25.  
  26. FileCopy SourceFichier, DestinationFichier
  27.  
  28. Workbooks.Open Filename:=nom & "P37784.xls"
  29.  
  30. Workbooks("P37784.xls" ).Worksheets(1).Activate
  31.  
  32. With ActiveSheet
  33.  
  34.  
  35.    Columns("A:A" ).Select
  36.    With Selection.Font
  37.        .Name = "Courier New"
  38.        .FontStyle = "Normal"
  39.        .Size = 10
  40.        .Strikethrough = False
  41.        .Superscript = False
  42.        .Subscript = False
  43.        .OutlineFont = False
  44.        .Shadow = False
  45.        .Underline = xlUnderlineStyleNone
  46.        .ColorIndex = xlAutomatic
  47.    End With
  48.    Selection.TextToColumns Destination:=Range("A1" ), DataType:=xlDelimited, _
  49.        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
  50.        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
  51.        :="|", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  52.    ChDir "D:\Documents and Settings\x7001\Bureau"
  53.    
  54.    
  55.    'On enregistre le nouveau document au format xls créer
  56.    
  57.    ActiveWorkbook.SaveAs Filename:= _
  58.        nom & "P37784.xls", FileFormat:=xlNormal _
  59.        , Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
  60.        CreateBackup:=False
  61.  
  62. End With


 
 
Voci le code que j'essaye de faire marche  : j'aimerais convertir 7 documents avec des noms différents ( les i )  
merci d'avance cordialement  
 
 

Code :
  1. Dim i As string
  2.  
  3.  
  4.  
  5. 'création fichier cible (vide) dans le fichier que l'utilisateur à créer pour mettre les fichiers du SI txt
  6.  
  7. Set xlApp = CreateObject("Excel.Application" )
  8.  
  9. ' un truc du genre
  10. do  while i=P37784,P37786,P37792,P37796,P37810,P4GPOBS,P4GPRV1
  11.  
  12. NomFichier(i) = nom & i & ".txt"
  13.  
  14.  
  15.  
  16. Set xlBook(i) = xlApp.Workbooks.Add
  17. xlBook(i).SaveAs NomFichier(i)
  18. xlBook(i).Close
  19. xlApp.Quit
  20. Set xlBook(i) = Nothing
  21. Set xlApp = Nothing
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28. 'On définit les fichiers sources et cible
  29.  
  30. SourceFichier(i) = nom & i & ".txt" ' Définit le nom et le chemin(ici E:\test) du fichier source.
  31. DestinationFichier(i) = nom & i & ".xls" ' Définit le nom du fichier et le nouveau chemin (ici E:\new) cible.
  32.  
  33.  
  34.  
  35.  
  36. 'Copie le fichier source dans le fichier cible
  37.  
  38. FileCopy SourceFichier(i), DestinationFichier(i)
  39.  
  40. Workbooks.Open Filename:=nom & i & ".xls"
  41.  
  42. Workbooks(i & ".xls" ).Worksheets(1).Activate
  43.  
  44. With ActiveSheet
  45.  
  46.  
  47.    Columns("A:A" ).Select
  48.    With Selection.Font
  49.        .Name = "Courier New"
  50.        .FontStyle = "Normal"
  51.        .Size = 10
  52.        .Strikethrough = False
  53.        .Superscript = False
  54.        .Subscript = False
  55.        .OutlineFont = False
  56.        .Shadow = False
  57.        .Underline = xlUnderlineStyleNone
  58.        .ColorIndex = xlAutomatic
  59.    End With
  60.    Selection.TextToColumns Destination:=Range("A1" ), DataType:=xlDelimited, _
  61.        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
  62.        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
  63.        :="|", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  64.    ChDir "D:\Documents and Settings\x7001\Bureau"
  65.    
  66.    
  67.    'On enregistre le nouveau document au format xls créer
  68.    
  69.    ActiveWorkbook.SaveAs Filename:= _
  70.        nom & i & ".xls", FileFormat:=xlNormal _
  71.        , Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
  72.        CreateBackup:=False
  73.  
  74. End With
  75.  
  76.  Next i
  77.  
  78.  
  79. End Sub


mood
Publicité
Posté le 10-08-2009 à 10:24:47  profilanswer
 

n°1913293
Deamon
Posté le 10-08-2009 à 10:31:22  profilanswer
 

Code :
  1. Dim i As string
  2. do  while i=P37784,P37786,P37792,P37796,P37810,P4GPOBS,P4GPRV1
  3. ...
  4. Next i


 
Ca ne veut rien dire du tout !
Déjà regarde la définition de l'instruction Do While dans l'aide de VBA.
Et puis lis quelques cours de programmation ça fera pas de mal car c'est vraiment incohérent.
 
Et avec ton i ça ne peut pas marcher comme ça. Il faut que tu stockes tes valeurs textes dans un tableau de string. i tu le mets en Integer et ça sera l'indice du tableau que tu vas parcourir.

n°1913296
foxley_gra​vity
Posté le 10-08-2009 à 10:34:23  profilanswer
 

lol , ben on m'avait di avec un do while quand on voulait fixer en dur ... des variables , mais peut etre qu'il faudrait les mettre dans un tableau ...
et désolé j'avais mi un for au début , j'ai oublié de rectifier ... en faite le gros du probleme est la .... !

n°1913369
_xme_
Posté le 10-08-2009 à 12:04:26  profilanswer
 

merde je t'ai encore répondu en vbs   :lol:  
Alors d'avance, je réponds en VBS, les 3/4 des instructions sont quivalente en VBA et tu as un très bon debuggeur pour voir sur quel ligne ca plante ;)
 
Maintenant que je vois ton code je m'aperçois que ce que tu appelais boucle ne correspond pas du tout à ce que j'attendais  :ouch:  
Une boucle n'est pas égale à juste plusieur fois les mêmes instructions en faisant varier un paramètre.
Une boucle est égale à plusieur fois les mêmes instruction okai, mais avec une relation logique entre 2 tours de boucle!!!
Soit cette relation est très simple i=i+1 soit soit cela peut être l'énumération d'un ensemble .
Dans le cas de l'énumération, il me semble qu'il existe en VBA un for each qui marche très bien
 
Là dans ton cas, il n'y a aucune relation logique entre les noms, ils sont tous sans exception défini à l'avanc donc je dirais que tu devrais plutôt déclarer une fonction
 

Code :
  1. Public Function mafonction(monparam)
  2. ...
  3. 'L'ensemble des instruction
  4. ...
  5. End function


et donc

Code :
  1. Do while i=P37784,P37786,P37792,P37796,P37810,P4GPOBS,P4GPRV1


Deviens:

Code :
  1. Call mafonction P37784
  2. Call mafonction P37786
  3. ....


De plus pour être exacte en VBS
Un do while ce fait comme ceci:

Code :
  1. Do while i=1 or i=2 or i=3 or i=4 etc..
  2. Loop ' et non pas Next


Et surtout en vbs un = entre chaine de charactere ne marche pas il faut faire un StrComp ("chaine1", "chaine2" ) si c'est égale à 0 alors les chaine sont identique


Message édité par _xme_ le 10-08-2009 à 12:12:16
n°1913410
foxley_gra​vity
Posté le 10-08-2009 à 12:42:59  profilanswer
 

ok merci beucoup mais ici il faut un call ou un do while ...et sinon les modif que j'ai fais dans mon sont bonnes ?  
Je sais pas trop si j'ai le drois de faire  des DestinationFichier(i) par exemple ... cdt

n°1913427
_xme_
Posté le 10-08-2009 à 13:45:20  profilanswer
 

:heink:  :heink:  :heink:  
Je dois avoir du mal à m'exprimer  :ange:  
 

Citation :

Là dans ton cas, il n'y a aucune relation logique entre les noms, ils sont tous sans exception défini à l'avance donc je dirais que tu devrais plutôt déclarer une fonction  


Si on déclare une fonction c'est pour l'appeler dans la suite donc call
 
je regarde, les modifs et j'edite
 
Edit: c'est un carnage :pfff:
Je ne sais pas par ou commencer...
bon d'abord on va prendre le bout de code qui fonctionne.
L'as-tu réellement écris ou as-tu seulement fait des copié/collé à droite à gauche car là, ca maqneu vraiment de cohérence :sweat:  
 
D'ou tires-tu l'idée de nommer ta variable qui indique le chemin nom  :pt1cable:  
Comment esperes-tu relire après, si les variables ne décrivent pas ce qu'elles contiennent?
 
Ensuite tu commences par créer un excel, es tu sur qu'il n'existe pas déjà dans le dossier?
 
Redondance des variable Nomfichier=DestinationFichier
Une variable pour une info sinon on s'en sort plus ;)
 
Tu crées une variable DestinationFichier =nom & "P37784.xls"
Pourquoi dans la suite refais-tu 2 fois cette concaténation?
 
tu me fais un

Code :
  1. Workbooks.Open Filename:=nom & "P37784.xls"


ca marche car tu es en VBA et tu coup le workbook qui est pris est celui dans laquelle la macro est contenue.
mais ou est l'interet de  

Code :
  1. Workbooks("P37784.xls" ).Worksheets(1).Activate?


Je ne connais rien en VBA mais il me semble illogique d'avoir ensuite besoin de Workbooks("P37784.xls" ).
 
Ensuite vis-à-vis de ça pourquoi  

Code :
  1. Set xlApp = CreateObject("Excel.Application" )
  2. Set xlBook = xlApp.Workbooks.Add  
  3. NomFichier = nom & "P37784.xls"
  4. xlBook.SaveAs NomFichier
  5. xlBook.ClosexlApp.Quit
  6. Set xlBook = NothingSet
  7. xlApp = Nothing


Ca c'est du vbs  
 
En fait plus je lis, plus je me demande pourquoi tu fais une macro? :??: .
J'ai l'impression que tu n'interviennes pas sur l'excel qui est ouvert pour lancer la macro?
t'es sur que c'est pas plutôt du vbs que tu devrais faire?
 
Ensuite pour la suite:
si tu fais une fonction tu ne changes quasiment rien au code qui marche pour un fichier:

Code :
  1. Set xlBook(i) = xlApp.Workbooks.Add
  2. xlBook(i).SaveAs NomFichier(i)
  3. xlBook(i).ClosexlApp.QuitSet
  4. xlBook(i) = NothingSet
  5. xlApp = Nothing


tout ca non
c'est :

Code :
  1. Set xlBook = xlApp.Workbooks.Add
  2. xlBook.SaveAs NomFichier
  3. xlBook.ClosexlApp.QuitSet
  4. xlBook = NothingSet
  5. xlApp = Nothing


Le seul truc qui dépend de i c'est NomFichier

Code :
  1. NomFichier=chemin & i


Message édité par _xme_ le 10-08-2009 à 15:17:36
n°1913454
foxley_gra​vity
Posté le 10-08-2009 à 14:38:36  profilanswer
 

Tu as besoin d'information supplémentaire ?  
Rappel  : en gros je dois excuté autant de fosi que de nom ma procédure déja écrite qui marche ... en adaptant les noms des fichiers...

n°1913456
Deamon
Posté le 10-08-2009 à 14:41:29  profilanswer
 

T'as essayé de stocker les chaines de caractères dans un tableau/collection pour les utiliser ensuite dans ta boucle For ?

n°1913460
foxley_gra​vity
Posté le 10-08-2009 à 14:45:33  profilanswer
 

Non ...j'ai jamais fait ca ... mais adapte un ex avec mon probleme , j'aimerais apprendre avec plaisir :)

n°1913464
Deamon
Posté le 10-08-2009 à 14:51:30  profilanswer
 

Faut vraiment que tu t'achètes un bouquin de VBA et d'algorithme car sans connaissances je vois pas ce que tu vas pouvoir faire tout(e) seul(e).
 

Code :
  1. Dim item as Variant
  2. Dim c as Collection
  3. set c = new Collection
  4. c.add("ABC001" )
  5. c.add("DEF002" )
  6. ...
  7. For each item in c
  8.   'CStr(each) est respectivement à chaque itération "ABC001","DEF0002",...
  9. Next

mood
Publicité
Posté le 10-08-2009 à 14:51:30  profilanswer
 

n°1913467
foxley_gra​vity
Posté le 10-08-2009 à 14:59:59  profilanswer
 

ok donc tu ajoute plein d'objet dans un tableau , mais je vous pas en quoi ca devient plus simple , tu veux pas te pencher quelques minute sur le code que j'ai écris qui marche pas( le 2eme en haut ) et me dire tout ce qu'il cloche en admettant qu'il y est les fameux  
Call mafonction P37784Call mafonction P37786
en te remerciant bcp  
cdt

n°1913469
Deamon
Posté le 10-08-2009 à 15:02:14  profilanswer
 

non mais oublie les Call. Ca marche aussi mais c'est une autre solution (que je trouve moins jolie, désolé xme :p ).
 
L'intérieur du For est l'intérieur du Do while que tu avais mis en changeant les i par CStr(each).

n°1913471
foxley_gra​vity
Posté le 10-08-2009 à 15:05:20  profilanswer
 

hein lol ?!  
peux tu écrires plutot ce que tu dis dans le code , a mon niveau , la beauté , c'est pas trés important , vba me prendra avec tt ma laideur :p  
 
mais promis des que je deviens un beau gosse du vba , je ferais des macro splendides^^

n°1913474
Deamon
Posté le 10-08-2009 à 15:08:33  profilanswer
 

Non mais sois tu fais ma solution sois tu fais celle de xme. Les 2 fonctionnent mais faut choisir.
 
J'ai juste remplacer ta boucle do while par mon For c'est tout. C'est quoi que tu comprends pas ?

n°1913476
_xme_
Posté le 10-08-2009 à 15:11:18  profilanswer
 

salut je viens enfin de finir d'éditer mon post
(désolé je suis tombé sur un mastermind sur le net, j'ai pas résister :D)

n°1913481
_xme_
Posté le 10-08-2009 à 15:15:41  profilanswer
 

Deamon a écrit :

T'as essayé de stocker les chaines de caractères dans un tableau/collection pour les utiliser ensuite dans ta boucle For ?


yop j'y avais pensé également mais là vu de ou on part on va peut être faire simple  :D  
Car oui je suis d'accord le plus beau, d'après moi, faire un dico avec les différentes chaines de caracteres et appelé une fonction avec en parametre les valeurs du dico, mais cool on commence par la fonction :D
Ou alors j'ai pas compris et il a besoin de faire mumuse avec tout ces fichiers excel en même temp ou si j'ai bien compris il a juste besoin de les créer, de les editer et de les sauvegarder les uns à la suite des autres.

n°1913482
foxley_gra​vity
Posté le 10-08-2009 à 15:16:05  profilanswer
 

il est ou ton psot que j'attendais avec impatience lol ?
 moi mon péché mignon c'est les echec :)

n°1913489
_xme_
Posté le 10-08-2009 à 15:19:57  profilanswer
 

ben je sais pas peut être en dessus des tiens?
j'ai dit, j'ai édité.
c'est celui qui est vraiment plus long que d'habitude

foxley_gravity a écrit :

il est ou ton psot que j'attendais avec impatience lol ?
 moi mon péché mignon c'est les echec :)


vu le code ton péché est une bombe sexuelle :D

Message cité 1 fois
Message édité par _xme_ le 10-08-2009 à 15:21:19
n°1913500
foxley_gra​vity
Posté le 10-08-2009 à 15:28:51  profilanswer
 

petite info = la variable nom est le chemin d'acces , que l'utilisateur chosii auparavant avec un bouton ... désolé de pas l'avoir mis , et oui tous le caca du code ca vient de moi :)

n°1913513
Deamon
Posté le 10-08-2009 à 15:37:44  profilanswer
 

_xme_ a écrit :

vu le code ton péché est une bombe sexuelle :D


 [:ddr555] Me suis retenu de faire une blague dessus moi.  :ange:

n°1913523
_xme_
Posté le 10-08-2009 à 15:42:47  profilanswer
 

Je dois vraiment ne pas écrire français  :(  

Citation :

D'ou tires-tu l'idée de nommer ta variable qui indique le chemin nom  :pt1cable:  
Comment esperes-tu relire après, si les variables ne décrivent pas ce qu'elles contiennent?


alors je sais pas comme ça c'est mieux?

Citation :

D'ou tires-tu l'idée de nommer ta variable qui indique le chemin "nom"  :pt1cable:  
Comment esperes-tu relire après, si les variables ne décrivent pas ce qu'elles contiennent?


 :D  
donc oui j'avais compris je te faisais juste la remarque et même la repproche que si tu fais ça, c'est bien plus de boulot à lire, à relire et à entrenir.  
Et puis au passage ça donne pas envie d'aider quand le code n'a pas de sens ;)
Bon aussi conseil, faut aussi faire des pauses quand tu prog, histoire de laisser les idées décanter.
C'est vraiment pas magique l'info, c'est de la pratique ;)
Donc j'ai quand même encore quelques questions:
Peux tu me récapituler le but de ton script?
dois tu avoir les différentes feuilles excel dans un même classeur ou dans des excel différent?

Deamon a écrit :


 [:ddr555] Me suis retenu de faire une blague dessus moi.  :ange:


Moi pas :D


Message édité par _xme_ le 10-08-2009 à 15:43:28
n°1913536
foxley_gra​vity
Posté le 10-08-2009 à 15:54:38  profilanswer
 

ok récapitulons avant que je saute du 1er étage :(  
 
l'utilisateur choisi un dossier , contenant toujours  7 fichier txt dont les noms sont invariables
 
la macro va venir les copier dans un fichier excel , lesconvertir en xls et les renommer ( même nom que les .txt sauf maitenant ca sera des .xls)

n°1913538
foxley_gra​vity
Posté le 10-08-2009 à 15:56:15  profilanswer
 

voici le nouveau code , dite moi si il vous convient ...  
maisi il plante au niveau do while etc  
merci encore xx
 

Code :
  1. Private Sub CommandButton1_Click()
  2.  
  3.  
  4. 'L'utilisateur vient sélectionner le répertoire
  5.  
  6. Dim xlApp As New Excel.Application
  7. Dim xlBook As Workbook
  8. Dim NomFichier As String
  9.  
  10. Dim Repertoire As FileDialog
  11. Dim nom As String
  12. Dim SourceFichier, DestinationFichier
  13.  
  14. Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
  15. Repertoire.Show
  16.  
  17. 'Affichage dans la fenêtre texte du répertoire demandé
  18. TextBox1.Value = Repertoire.SelectedItems(1)
  19.  
  20.  
  21. 'Ouverture des fichiers TXT envoyés par le SI (le nom reste invariable)
  22.  
  23. nom = TextBox1.Value & "\"
  24.  
  25.  
  26.  
  27. 'création fichier cible (vide) dans le fichier que l'utilisateur à créer pour mettre les fichiers du SI txt
  28.  
  29.  
  30. Set xlApp = CreateObject("Excel.Application" )
  31. Set xlBook = xlApp.Workbooks.Add
  32.  
  33. Do while i=P37784,P37786,P37792,P37796,P37810,P4GPOBS,P4GPRV1
  34.  
  35. NomFichier = nom & i & ".xls"
  36. xlBook.SaveAs NomFichier
  37. xlBook.Close
  38. xlApp.Quit
  39.  
  40. Set xlBook = Nothing
  41. Set xlApp = Nothing
  42.  
  43.  
  44. 'On définit les fichiers sources
  45.  
  46. SourceFichier = nom & i & ".txt" ' Définit le nom et le chemin(ici E:\test) du fichier source.
  47.  
  48.  
  49.  
  50. 'Copie le fichier source dans le fichier cible
  51.  
  52. FileCopy SourceFichier, NomFichier
  53.  
  54.  
  55.  
  56. With ActiveSheet
  57.  
  58.  
  59.    Columns("A:A" ).Select
  60.    With Selection.Font
  61.        .Name = "Courier New"
  62.        .FontStyle = "Normal"
  63.        .Size = 10
  64.        .Strikethrough = False
  65.        .Superscript = False
  66.        .Subscript = False
  67.        .OutlineFont = False
  68.        .Shadow = False
  69.        .Underline = xlUnderlineStyleNone
  70.        .ColorIndex = xlAutomatic
  71.    End With
  72.    Selection.TextToColumns Destination:=Range("A1" ), DataType:=xlDelimited, _
  73.        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
  74.        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
  75.        :="|", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  76.    ChDir "D:\Documents and Settings\x7001\Bureau"
  77.    
  78.    
  79.    'On enregistre le nouveau document au format xls créer
  80.    
  81.    ActiveWorkbook.SaveAs Filename:= _
  82.        nom & i & ".xls", FileFormat:=xlNormal _
  83.        , Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
  84.        CreateBackup:=False
  85.  
  86. End With
  87.  
  88. Loop
  89.  
  90.  
  91. End Sub

n°1913548
_xme_
Posté le 10-08-2009 à 16:00:19  profilanswer
 

ne pas cliquer

Spoiler :

Avant de sauter monte de quelques étages, histoire d'être sur. Sérieux si tu finis à l'hopistal, ça nous embêtes tous, pour toi t'es blessé pour nous euh comment dire t'es.... :D


 
Bon ok alors on reprend du tout début
 

Citation :


l'utilisateur choisi un dossier , contenant toujours  7 fichier txt dont les noms sont invariables  
 
la macro va venir les copier dans un fichier excel , lesconvertir en xls et les renommer ( même nom que les .txt sauf maitenant ca sera des .xls)  


Est ce que c'est tout ce qu'il fait?
Pourquoi fais-tu celà par une macro. a quoi te sers l'excel que tu lances?
 
Edit : je viens de voir ton nouveau post
monte de 5 étage au moins s'il te plait :)
non sérieux, j'ai le choix entre "tu ne lis pas mes posts" ou "te ne comprends pas le français"
Je veux bien ne pas être clair parfois mais là, c'éjà la troisième fois que je te donne la solution sur le même bout de code

Citation :


Là dans ton cas, il n'y a aucune relation logique entre les noms, ils sont tous sans exception défini à l'avanc donc je dirais que tu devrais plutôt déclarer une fonction
 

Code :
  1. Public Function mafonction(monparam)
  2. ...
  3. 'L'ensemble des instruction
  4. ...
  5. End function


et donc

Code :
  1. Do while i=P37784,P37786,P37792,P37796,P37810,P4GPOBS,P4GPRV1


Deviens:

Code :
  1. Call mafonction P37784
  2. Call mafonction P37786
  3. ....


De plus pour être exacte en VBS
Un do while ce fait comme ceci:

Code :
  1. Do while i=1 or i=2 or i=3 or i=4 etc..
  2. Loop ' et non pas Next


Et surtout en vbs un = entre chaine de charactere ne marche pas il faut faire un StrComp ("chaine1", "chaine2" ) si c'est égale à 0 alors les chaine sont identique


donc par pitié fait moi au moins une boucle do while correcte
que tu n'ai pas compris pourquoi il ne faut pas faire une boucle do while, okai mais que tu la fasse tjs pas correctement...
En plus je t'ai mp en te disant que si tu as trop de comparaison il fallait faire une fonction annexe et uncase, je t'ai même quasiment donné cette fonction


Message édité par _xme_ le 10-08-2009 à 16:06:28
n°1913557
foxley_gra​vity
Posté le 10-08-2009 à 16:06:05  profilanswer
 

heu , ben excel que je lance sers à rien ,c'est juste pour avori accés à usal form... lol en même temps je connais  :( ...
 mais seirieux , j'ai fais toutes les modfis que tu m'avais dit ... regarde bien ..

n°1913561
foxley_gra​vity
Posté le 10-08-2009 à 16:10:07  profilanswer
 

a oui merde lol j'ai oublié de modifié le while désolé .... désolé  ,  
 

Code :
  1. Private Sub CommandButton1_Click()
  2.  
  3.  
  4. 'L'utilisateur vient sélectionner le répertoire
  5.  
  6. Dim xlApp As New Excel.Application
  7. Dim xlBook As Workbook
  8. Dim NomFichier As String
  9.  
  10. Dim Repertoire As FileDialog
  11. Dim nom As String
  12. Dim SourceFichier, DestinationFichier
  13.  
  14. Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
  15. Repertoire.Show
  16.  
  17. 'Affichage dans la fenêtre texte du répertoire demandé
  18. TextBox1.Value = Repertoire.SelectedItems(1)
  19.  
  20.  
  21. 'Ouverture des fichiers TXT envoyés par le SI (le nom reste invariable)
  22.  
  23. nom = TextBox1.Value & "\"
  24.  
  25.  
  26.  
  27. 'création fichier cible (vide) dans le fichier que l'utilisateur à créer pour mettre les fichiers du SI txt
  28.  
  29.  
  30. Set xlApp = CreateObject("Excel.Application" )
  31. Set xlBook = xlApp.Workbooks.Add
  32.  
  33. call i=P37784
  34. call i=P37786
  35. call i=P37792
  36. 'etc..
  37.  
  38. NomFichier = nom & i & ".xls"
  39. xlBook.SaveAs NomFichier
  40. xlBook.Close
  41. xlApp.Quit
  42.  
  43. Set xlBook = Nothing
  44. Set xlApp = Nothing
  45.  
  46.  
  47. 'On définit les fichiers sources
  48.  
  49. SourceFichier = nom & i & ".txt" ' Définit le nom et le chemin(ici E:\test) du fichier source.
  50.  
  51.  
  52.  
  53. 'Copie le fichier source dans le fichier cible
  54.  
  55. FileCopy SourceFichier, NomFichier
  56.  
  57.  
  58.  
  59. With ActiveSheet
  60.  
  61.  
  62.    Columns("A:A" ).Select
  63.    With Selection.Font
  64.        .Name = "Courier New"
  65.        .FontStyle = "Normal"
  66.        .Size = 10
  67.        .Strikethrough = False
  68.        .Superscript = False
  69.        .Subscript = False
  70.        .OutlineFont = False
  71.        .Shadow = False
  72.        .Underline = xlUnderlineStyleNone
  73.        .ColorIndex = xlAutomatic
  74.    End With
  75.    Selection.TextToColumns Destination:=Range("A1" ), DataType:=xlDelimited, _
  76.        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
  77.        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
  78.        :="|", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  79.    ChDir "D:\Documents and Settings\x7001\Bureau"
  80.    
  81.    
  82.    'On enregistre le nouveau document au format xls créer
  83.    
  84.    ActiveWorkbook.SaveAs Filename:= _
  85.        nom & i & ".xls", FileFormat:=xlNormal _
  86.        , Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
  87.        CreateBackup:=False
  88.  
  89. End With
  90.  
  91. Loop
  92.  
  93.  
  94. End Sub

n°1913562
_xme_
Posté le 10-08-2009 à 16:11:19  profilanswer
 

non
tu as peut être changé le next en loop
mais tu n'a tjs pas écrire un do while correctment
les , ca se remplace par des or et surtout tu réécris à chaque fois la condition

Code :
  1. do while i=1 or i=2 or i=3


Et pour la 4 ieme fois en VBS et donc je présume en VBA tu ne fais pas de comparaison de chaine avec un égale!!!!
Je te l'ai marqué en gras des ma première correction
Il y aune fonction pour ça StrComp
Alors soit tu me fais l'immense plaisir de me dire que je me trompe car ce que je te dis n'ai vrai qu'en VBS soit tu relis tout les post de moi et deamon et tu réfléchis
 
Ensuite si comme tu viens de me le dire ton Excel ne servait à rien, c'est pas mal de le dire dès le début.
Alors pour info ton code tu pouvais le faire en VBS.
L'avantage tu aurais choisi l'interface pour ma part j'utilise plus souvent une page internet qu'un classeur excel comme interface ;)
Mais bon on s'arrete là j'ai pas encie de tout reprendre et de tout façon je ne le ferrais pas.
On reste en VBA même si c'est pas forcément le plus adapté.
En fait je viens de voir ça :

Citation :

call i=P37784
call i=P37786
call i=P37792
'etc..


tu te fous de moi? :o  
pourquoi tu me copie le etc et que tu ne le remplace par correctement
Relis tout réfléchis, si tu change pas réellement ton prochain code, j'arrete


Message édité par _xme_ le 10-08-2009 à 16:17:47
n°1913565
Deamon
Posté le 10-08-2009 à 16:13:41  profilanswer
 

Ca me désespère...
 [:dur]

n°1913569
_xme_
Posté le 10-08-2009 à 16:19:03  profilanswer
 

Deamon a écrit :

Ca me désespère...
 [:dur]


non moi c'est plus desespoir là j'ai l'impression d'avoir quelqu'un qui se paye ma tête.  :sarcastic:  
*je fais le lourd jusqu'à qu'on fasse mon boulot*
ben sans moi dans ce cas là

n°1913571
foxley_gra​vity
Posté le 10-08-2009 à 16:22:47  profilanswer
 

Ok les gars désolé je voulais pas vous blesser , je suis désolé d'avori été super lourd etc ..chacun à des domaines de prédilections , je suis une vrai daube en informatique , mais je suis bon en math et au echec  
:(  
alors excuse moi , je vais éssaye de bien tout relire ,de tout comprendre etc , je vous proposerais demain mon travail , merci encore de votre aide ...
 
cdt  

n°1913586
_xme_
Posté le 10-08-2009 à 16:39:38  profilanswer
 

Il n'est pas question d'être une daube ou pas.  :non:  
J'ai juste l'impression que tu ne cherches pas et dans ce cas, c'est sans moi.
Je bosse en paralelle, j'ai vraiment autre chose à faire que répondre tout les 10 min à une question
Donc c'est pour ça réfléchis
Je pense l'avoir dit suffisament
tu dois déclarer une fonction, je t'ai même donner la synthaxe déclararion
Ou est la fonction dans ton code?
 
Je t'ai dit qu'une fois déclaré, tu l'appelais
Cool tu as mis les Call comme je te l'avais dit -_-
à oui ca ser bcp sans fonction  :ouch:  
et puis je ne sais pas ou tu as vu une affectation de variable dans mes call  :??:  
bon voila ton code manque beaucoup trop de logique,  
Je doute que tu l'ai écris, j'ai le choix entre un pompage du net ou un macro excel déjà faite.
Dans tout les cas, avant de vouloir modifier un code, il faut le comprendre, ce l'approprier et s'approprier la synthaxe.
Ca ne m'a clairement pas l'air d'être le cas ici
Donc bon travail
 
Ps: d'avance désolé si tu me trouve abrut mais là ...
non désolé je ne crois pas que tu es écris ce code.
Et surtout je ne crois pas que tu es ouvert une documentation VBS


Message édité par _xme_ le 10-08-2009 à 16:43:01
n°1913842
foxley_gra​vity
Posté le 11-08-2009 à 09:48:19  profilanswer
 


 
 
Bonjour désolé encore pour hier ...  
Je ne connaissais pas du tout call
 
"Pour appeler une procédure Sub depuis une autre procédure, tapez le nom de la procédure sans oublier les valeurs des arguments obligatoires. L'instruction Call n'est pas obligatoire, mais si vous l'utilisez, vous devez mettre les éventuels arguments entre parenthèses."
 

Code :
  1. Sub toto()
  2.  
  3. Call CommandButton1_Click(P37784)
  4. Call CommandButton1_Click(P37786)
  5. Call CommandButton1_Click(P37792)
  6. Call CommandButton1_Click(P37796)
  7.  
  8. End Sub
  9.  
  10. Private Sub CommandButton1_Click(i As String)
  11.  
  12. 'L'utilisateur vient sélectionner le répertoire
  13.  
  14. Dim xlApp As New Excel.Application
  15. Dim xlBook As Workbook
  16. Dim NomFichier As String
  17.  
  18. Dim Repertoire As FileDialog
  19. Dim nom As String
  20. Dim SourceFichier, DestinationFichier
  21.  
  22. Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
  23. Repertoire.Show
  24.  
  25. 'Affichage dans la fenêtre texte du répertoire demandé
  26. TextBox1.Value = Repertoire.SelectedItems(1)
  27.  
  28.  
  29. 'Ouverture des fichiers TXT envoyés par le SI (le nom reste invariable)
  30.  
  31. nom = TextBox1.Value & "\"
  32.  
  33.  
  34. 'création fichier cible (vide) dans le fichier que l'utilisateur à créer pour mettre les fichiers du SI txt
  35.  
  36. Set xlApp = CreateObject("Excel.Application" )
  37. Set xlBook = xlApp.Workbooks.Add
  38.  
  39.  
  40. NomFichier = nom & i & ".xls"
  41. xlBook.SaveAs NomFichier
  42. xlBook.Close
  43. xlApp.Quit
  44.  
  45. Set xlBook = Nothing
  46. Set xlApp = Nothing
  47.  
  48. SourceFichier = nom & i & ".txt"
  49. FileCopy SourceFichier, NomFichier
  50.  
  51.  
  52. Workbooks.Open Filename:=nom & i & ".xls"
  53.  
  54. Workbooks(i & ".xls" ).Worksheets(1).Activate
  55.  
  56. With ActiveSheet
  57.  
  58.  
  59.    Columns("A:A" ).Select
  60.    With Selection.Font
  61.        .Name = "Courier New"
  62.        .FontStyle = "Normal"
  63.        .Size = 10
  64.        .Strikethrough = False
  65.        .Superscript = False
  66.        .Subscript = False
  67.        .OutlineFont = False
  68.        .Shadow = False
  69.        .Underline = xlUnderlineStyleNone
  70.        .ColorIndex = xlAutomatic
  71.    End With
  72.    Selection.TextToColumns Destination:=Range("A1" ), DataType:=xlDelimited, _
  73.        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
  74.        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
  75.        :="|", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  76.    ChDir "D:\Documents and Settings\x7001\Bureau"
  77.    
  78.    
  79.    'On enregistre le nouveau document au format xls créer
  80.    
  81.    ActiveWorkbook.SaveAs Filename:= _
  82.        nom & i & ".xls", FileFormat:=xlNormal _
  83.        , Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
  84.        CreateBackup:=False
  85.  
  86. End With
  87.  
  88.  
  89. End Sub

n°1913846
Deamon
Posté le 11-08-2009 à 09:54:51  profilanswer
 

Et donc ça marche ?

n°1913851
foxley_gra​vity
Posté le 11-08-2009 à 10:09:11  profilanswer
 

non mais j'ai résolu pas mal de probleme , remplacer le bouton par function...  
 
type argument byref incompatible  pour CommandButton1_Click(P37784)

n°1913872
Deamon
Posté le 11-08-2009 à 10:57:44  profilanswer
 

Call CommandButton1_Click(P37784)
 
--> P37784 est une chaine de caractères ! Donc il faut mettre "P37784"

n°1913878
_xme_
Posté le 11-08-2009 à 11:11:28  profilanswer
 

Bon ca commence à ressembler à quelquechose
Comme je l'ai dit depuis le début je ne fais que du vbs, il faut adapter mes codes.
Bon donc call n'est pas obligatoire, et je viens de vérifier le StrComp n'est pas obligatoire en VBA, j'aurais appris un truc, mais bon ça m'a pris 2sec à vérifier -_-
 
Bon sinon change

Code :
  1. Workbooks.Open Filename:=nom & i & ".xls"


par

Code :
  1. Workbooks.Open Filename:=NomFichier


et  

Code :
  1. ActiveWorkbook.SaveAs Filename:= nom & i & ".xls", FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False


par

Code :
  1. ActiveWorkbook.SaveAs Filename:= NomFichier, FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False


Comme dit plus haut les variables c'est fait pour qu'on s'en serve ;)
 
Ensuite je me pose sérieusement la question si ton  

Code :
  1. FileCopy SourceFichier, NomFichier


marche  :??:  
As-tu essayé ensuite d'ouvrir tes Excel car je vois pas quand le système réencoderait les données au format excel  :??:  
 
Ensuite après avoir fait la modif de demaon, est-ce que ca marche et si non ou ca plante?

n°1913889
foxley_gra​vity
Posté le 11-08-2009 à 11:37:12  profilanswer
 

ok merci de toute ton aide , tu vois je commence  à y arriver , attend un peu le prochain windows :p ,  
FileCopy SourceFichier, NomFichier marche ...  
à vaincre sans péril on triumphe sans gloire ..^^ imaginez un peu la votre :p  
 
 

Code :
  1. 'Sub toto()
  2.  
  3.  
  4. Call lolo("P37786" )
  5. Call lolo("P37792" )
  6. Call lolo("P37796" )
  7.  
  8. 'End Sub
  9.  
  10. Function lolo(i As String)
  11.  
  12. 'L'utilisateur vient sélectionner le répertoire
  13.  
  14. Dim xlApp As New Excel.Application
  15. Dim xlBook As Workbook
  16. Dim NomFichier As String
  17.  
  18. Dim Repertoire As FileDialog
  19. Dim nom As String
  20. Dim SourceFichier, DestinationFichier
  21.  
  22. Set Repertoire = Application.FileDialog(msoFileDialogFolderPicker)
  23. Repertoire.Show
  24.  
  25. h = "D:\Documents and Settings\x7001\Bureau"
  26.  
  27.  
  28. 'Ouverture des fichiers TXT envoyés par le SI (le nom reste invariable)
  29.  
  30. nom = h & "\"
  31.  
  32.  
  33. 'création fichier cible (vide) dans le fichier que l'utilisateur à créer pour mettre les fichiers du SI txt
  34.  
  35. Set xlApp = CreateObject("Excel.Application" )
  36. Set xlBook = xlApp.Workbooks.Add
  37.  
  38.  
  39. NomFichier = nom & i & ".xls"
  40. xlBook.SaveAs NomFichier
  41. xlBook.Close
  42. xlApp.Quit
  43.  
  44. Set xlBook = Nothing
  45. Set xlApp = Nothing
  46.  
  47. SourceFichier = nom & i & ".txt"
  48. FileCopy SourceFichier, NomFichier
  49.  
  50.  
  51. Workbooks.Open Filename:=NomFichier
  52.  
  53. Workbooks(i & ".xls" ).Worksheets(1).Activate
  54.  
  55. With ActiveSheet
  56.  
  57.  
  58.    Columns("A:A" ).Select
  59.    With Selection.Font
  60.        .Name = "Courier New"
  61.        .FontStyle = "Normal"
  62.        .Size = 10
  63.        .Strikethrough = False
  64.        .Superscript = False
  65.        .Subscript = False
  66.        .OutlineFont = False
  67.        .Shadow = False
  68.        .Underline = xlUnderlineStyleNone
  69.        .ColorIndex = xlAutomatic
  70.    End With
  71.    Selection.TextToColumns Destination:=Range("A1" ), DataType:=xlDelimited, _
  72.        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
  73.        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
  74.        :="|", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  75.    ChDir "D:\Documents and Settings\x7001\Bureau"
  76.    
  77.    
  78.    'On enregistre le nouveau document au format xls créer
  79.    
  80.    ActiveWorkbook.SaveAs Filename:= _
  81.        NomFichier, FileFormat:=xlNormal _
  82.        , Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
  83.        CreateBackup:=False
  84.  
  85. End With
  86.  
  87.  
  88. End Function

n°1913897
_xme_
Posté le 11-08-2009 à 11:45:48  profilanswer
 

Et ca marche?


Message édité par _xme_ le 11-08-2009 à 11:46:00
n°1914020
foxley_gra​vity
Posté le 11-08-2009 à 15:30:25  profilanswer
 

Re désolé du retard , les nouvelles du front sont moyennes :(  
donc il arrive à ouvrir le fichier à convertir , le copie dans le bon répertoire mais il ne le convertit pas et m'affiche erreur 1004  erreur d'exécution
 merci de votre aide

n°1914040
Deamon
Posté le 11-08-2009 à 15:47:57  profilanswer
 

Si tu nous disais la ligne où il plante déjà...

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA] problème dans une boucle

 

Sujets relatifs
problème de loginmode avec sqlserver 2005probleme session php - header tout ca.
problème de durée avec mktime()[VBA]ouvrir un page internet et inscrire un code pour ouvrir undossier
PROBLEME d'if comportant un lienVBA Graphiques
Problème tableauProduct could not be found: Probleme de Manifest.mf?
[VBA] ouvrir un fichier dont le repertoire est choisi par lutilisateurProblème boucle de recherche sous VBA sur Excel
Plus de sujets relatifs à : [VBA] problème dans une boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR