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

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Macro VBA pour écrire du code Macro ImageJ

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Macro VBA pour écrire du code Macro ImageJ

n°2291994
vylkor
Posté le 17-11-2016 à 11:40:18  profilanswer
 

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
mood
Publicité
Posté le 17-11-2016 à 11:40:18  profilanswer
 

n°2292004
rat de com​bat
attention rongeur méchant!
Posté le 17-11-2016 à 14:00:22  profilanswer
 

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.

n°2292040
vylkor
Posté le 17-11-2016 à 15:55:57  profilanswer
 

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:

n°2292654
vylkor
Posté le 24-11-2016 à 12:54:38  profilanswer
 

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  :)

n°2292669
Marc L
Posté le 24-11-2016 à 15:21:54  profilanswer
 

 
            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
n°2292677
vylkor
Posté le 24-11-2016 à 16:32:05  profilanswer
 

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...

n°2292683
Marc L
Posté le 24-11-2016 à 19:14:56  profilanswer
 

 
            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) …
 


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

  Macro VBA pour écrire du code Macro ImageJ

 

Sujets relatifs
Code HTML interprété différent chez OVH[PYTHON] VBA & Formules Excel vers site web Python
besoin d'un code java EE pour authentifier un login et un passwordCreer un bouton macro plusieurs feuilles d'un classeur
Supprimez le fichier image uploded utilisant le code d'ajax[DM Code]en fait un système permettant de définir des nombres premiers
Novice en VBA (Projet Excel)faire une somme avec nom d'onglet et ligne variable en VBA
Code php qui safficheColoration de code dans un texte
Plus de sujets relatifs à : Macro VBA pour écrire du code Macro ImageJ


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