Macro VBA pour écrire du code Macro ImageJ

Macro VBA pour écrire du code Macro ImageJ - VB/VBA/VBS - Programmation

Marsh Posté le 17-11-2016 à 11:40:18    

Bonjour,
 
Alors pour commencer une petite explication du contexte :
Je suis apprenti dans une assez grosse entreprise, et je dois créer un outil de contrôle visual.
Le budget étant serré, je travaille avec ImageJ pour la partie traitement de l'image, et pour l'interface j'ai decide de me tourner vers VBA, le plus simple à mettre en place ici.
 
Voila grosso modo comment ça doit se comporter :
 
On crée toutes les couleurs grace à une macro VBA, les données sont reccueillis vers une feuille ("Couleurs" ) qui enregistre tout ce qui interesse ( paramètres pour le traitement ImageJ, nom de la couleur, etc... ) à l'aide d'un petit formulaire, cette partie la marche sans problèmes ( pour l'instant :o ).
 
Sur une autre feuille ("Opérateurs" ), on à une autre macro qui permet de lancer le traitement de l'image, donc en gros :  
 
0 - On nettoi la feuille de toutes les données précédentes
1 - On choisis une couleur dans la liste des couleurs crées
2 - Excel génère un fichier Macro.ijm ( format similaire à un fichier .txt, juste l'extension qui change ) qui donne les instructions à imageJ en function des données rentrées dans la feuille "Couleurs"
3 - Le fichier généré est lancé
4 - Le fichier généré est supprimé
5 - ImageJ crée à la fin de son traitement un fichier excel, dont les données sont recupérés par le fichier et intégrès dans la feuille opérateur
6 - Les stats sont affichées
 
Le plus gros soucis que j'ai c'est pour l'étape de la creation du fichier Macro.ijm, le fichier ressemble à ça en gros ( pour mieux voir, les valeurs variables sont entre 3 crochets [[[]]]) :
 

Code :
  1. run("Image Sequence...", "open=[C:\\Users\\PC-Portable-03\\Documents\\Compteur_de_dots\\Programme\\Image\\]" );
  2. run("Clear Results" );
  3. imgName=getTitle();
  4. selectWindow(imgName);
  5. run("Split Channels" );
  6. selectWindow(imgName + " ([[[FILTRE]]])" );
  7. close("\\Others" );
  8. setThreshold(0, [[[THRESHOLD]]]);
  9. run("Threshold" );
  10. roiManager("draw" );
  11. run("Analyze Particles...", "size=[[[TAILLE_MINI]]]-Infinity show=Masks summarize" );
  12. selectWindow("Summary" );
  13. saveAs("Text", "C:\\Users\\PC-Portable-03\\Documents\\Compteur_de_dots\\Programme\\Summary.xls" );
  14. selectWindow("Mask of Image ([[[FILTRE]]])" );
  15. close("\\Others" );


 
 
Pour l'instant, la solution la plus "simple" que j'ai trouvé c'est de rentrer chaque ligne dans une cellule puis de faire un :

Code :
  1. Print #1, Sheets("DATA" ).Cells(1, 1) & Chr(10) & Sheets("DATA" ).Cells(2, 1) & Chr(10) & Etc...


Sauf que dans l'affichage wordpad ça passé, mais en affichage bloc note simple ça rajoute que des espaces et non plus des sauts de lignes :/
 
Est ce que vous voyez d'autres solutions pour se problème ? Je suis totalement novice en programmation VBA, c'est la première fois que j'en fait et j'avance le projet avec un livre d'apprentissage VBA sur mon bureau et google qui tourne en permanence pour trouver les solutions, mais la je coince.
 
En tout cas merci aux courageux qui ont tout lu, je présente mes excuses pour les innombrables fautes qui doivent trainer, j'ai un correcteur anglais qui tourne et me fait des correction automatique en plus de faire scintiller tout le texte en rouge, ce qui n'aide pas  :whistle:  
 
Bonne journée  :hello:

Message cité 1 fois
Message édité par vylkor le 17-11-2016 à 11:54:51
Reply

Marsh Posté le 17-11-2016 à 11:40:18   

Reply

Marsh Posté le 17-11-2016 à 14:00:22    

vylkor a écrit :

Pour l'instant, la solution la plus "simple" que j'ai trouvé c'est de rentrer chaque ligne dans une cellule puis de faire un :

Code :
  1. Print #1, Sheets("DATA" ).Cells(1, 1) & Chr(10) & Sheets("DATA" ).Cells(2, 1) & Chr(10) & Etc...


Sauf que dans l'affichage wordpad ça passé, mais en affichage bloc note simple ça rajoute que des espaces et non plus des sauts de lignes :/


Connais rien au VBA moi, au pif: Chr(13) & Chr(10) (soit \r\n) pour un saut de ligne correct sous Windows.

Reply

Marsh Posté le 17-11-2016 à 15:55:57    

Merci beaucoup pour cette réponse claire et efficace, ça marche parfaitement :jap:  
 
Je reste néanmoins ouvert à toute suggestion pour améliorer le code, ma solution me parait malgré tout très... artisanale  :whistle:

Reply

Marsh Posté le 24-11-2016 à 12:54:38    

Hello, je relance le sujet, je fais face à un nouveau problem, mon code ressemble à ça pour l'instant :
 

Code :
  1. Open ThisWorkbook.Path & "\Macro.ijm" For Output As #1
  2. Print #1, Sheets("DATA" ).Cells(1, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(2, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(3, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(4, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(5, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(6, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(7, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(8, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(9, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(10, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(11, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(12, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(13, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(14, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(15, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(16, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(17, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(18, 1) & Chr(13) & Chr(10) & Sheets("DATA" ).Cells(19, 1)
  3. CreateObject("Shell.Application" ).Open (ThisWorkbook.Path & "\Macro.ijm" )


 
Avec 17 cellules à traiter, ça marchait très bien, mais j'ai modifié mon code macro et j'ai maintenant 4 lignes en plus et... Excel n'à pas le temps de génèrer le fichier, il ouvre le fichier avant et du coup se coupe lui même l'écriture... J'ai essayé de rajouter une tempo :

Code :
  1. Application.Wait Now + TimeValue("00:00:15" )


 
Mais même comme ça il prend pas le temps de finnir ce qu'il à commencé...
 
Des idées sur comment règler le problème ? Je me doute que ma structure n'est pas optimisée, mais je ne sais pas trop comment rendre ça plus rapide et éviter ça.
 
 
Si ça peut vous aider, voice le nouveau code macro :

Code :
  1. dir = getDirectory("ImageJ" );
  2. imagedir = dir + "\image\\";
  3. run("Image Sequence...", "open=["+imagedir+"]" );
  4. run("Clear Results" );
  5. imgName=getTitle();
  6. run("Duplicate...", "title=DUPLICATE.JPG" );
  7. saveAs("Jpeg", dir+"\small.jpg" );
  8. close();
  9. selectWindow(imgName);
  10. run("Split Channels" );
  11. selectWindow(imgName + " (blue)" );
  12. close("\\Others" );
  13. setThreshold(0, 35);
  14. run("Threshold" );
  15. run("Analyze Particles...", "size=25-Infinity display" );
  16. saveAs("Jpeg", dir+"\Masks.jpg" );
  17. selectWindow( "Results" );  <======( Généralement ici que se coupe le fichier )
  18. saveAs("Text", dir + "\Results.xls" );
  19. run("Close All" );


 
Merci de votre aide  :)

Reply

Marsh Posté le 24-11-2016 à 15:21:54    

 
            Bonjour !
 
            Le Bloc-Notes ne comprend que la séquence standard Windows pour une fin de ligne #13#10 (vbCrLf).
            Un fichier texte mal affiché avec ce Bloc-Notes le sera bien par tout autre éditeur. (WordPad, Word, NotePad++, …)
 
            Le Bloc-Notes n'étant donc pas une référence (à oublier) mieux vaut se préoccuper de quelle est la séquence attendue !
 
            Sinon tu as oublié de fermer le fichier généré avant de lancer l'exécution ‼
 

Code :
  1.     F% = FreeFile
  2.     M$ = ThisWorkbook.Path & "\Macro.ijm"
  3.     Open M For Output As #F
  4.     Print #F, Join(Application.Transpose(Worksheets("DATA" ).Cells(1).CurrentRegion.Columns(1).Value), vbCrLf)
  5.     Close #F
  6.     CreateObject("Shell.Application" ).Open M


             Astuce : double-cliquer dans le cadre du code ci-dessus avant le Copier / Coller …


Message édité par Marc L le 24-11-2016 à 15:34:46
Reply

Marsh Posté le 24-11-2016 à 16:32:05    

Mon dieu, je me sens extrêmement bête maintenant, la fonction "Close" corrige tout mon problème, et quand je vois aussi comment tu as simplifié le code, c'est impressionnant !
 
Donc vraiment, grand merci parce que ce problème de fichier coupé m'à cassé la tête longtemps... Je vais essayer "d'élargir" mes connaissances  en VBA, tellement de fonctions que je ne connais pas ou utilise mal encore.... et surtout tellement de possibilités  :D  
 
Et si ça peut rassurer, j'utilise Notepad++ quand je peux, juste qu'au boulot y à pas trop le choix...

Reply

Marsh Posté le 24-11-2016 à 19:14:56    

 
            Si dans la feuille DATA la colonne B est vide alors tu peux te passer du  .Columns(1)  de ma ligne de code #4 …
 
            Cette ligne récupère les valeurs de la colonne donc en deux dimensions (n lignes sur 1 colonne)
            mais comme la fonction  Join  ne gère qu'une seule dimension,
            la fonction de feuille de calculs  Transpose  convertit alors cette colonne en une ligne unidimensionnelle à laquelle est insérée
            entre chaque donnée via  Join  la séquence  vbCrLf  (placer le curseur texte dessus dans le code puis appuyer sur la touche F1) …
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed