IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AppleScript Discussion :

Ecrire sur un fichier excel en applescript


Sujet :

AppleScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Ecrire sur un fichier excel en applescript
    Bonjour,

    Malgré mes recherches sur la toile, je n'ai pas trouvé la solution à mon problème.
    Etant sur Mac et ayant excel 2008, version 12, je pense qu'applescript pourrait m'aider.
    En outre, sur ce forum, j'ai déjà "échafauder une usine à gaz" mais très pratique et très efficace grâce à des contributeurs très actif, PBell pour ne pas le nommer.

    Voici le but que j'aimerais atteindre :

    J'ai une base de données excel enregistrée en .txt (ce format est nécessaire pour pouvoir être lu par un autre logiciel).

    J'aurais aimé savoir s'il était possible d'avoir un script ainsi :
    J'ouvre le script, ma base de données excel, contenant déjà des données et enregistrée en .xlsx, s'ouvre en arrière plan.
    Le script fait apparaitre une boite de dialogue au premier plan qui me propose un champ de saisie et 2 boutons : OK et Annuler
    Dans le champ de saisie, j'entre un nom de dossier (ex : Dossier01) et celui-ci s'inscrit dans la première cellule disponible de la colonne A et B.
    D'office s'inscrit sur la même ligne un chemin d'accès A en colonne D et un autre chemin d'accès B en colonne E (ces chemins d'accès sont différents ; je pense donc qu'il faudrait les noter "en dur" dans le script).
    Enfin, soit je valide (et les données sont écrites dans le fichier excel), soit j'annule et le boite de dialogue disparait et le fichier excel se ferme.
    Si je valide, le fichier xlsx procèdeà un tri par ordre croissant se fait, le fichier excel crée une copie en .txt (ce fichier écrasant l'ancien existant déjà au même endroit) et va se copier dans un autre dossier se trouvant à : Application/Logiciel, écrasant aussi l'ancien fichier .txt portant le même nom. Les fichier excel .xlsx se referme et la boite de dialogue applescript disparait.

    Est-ce que cela est possible en applescript ?

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    Voici le script ci-dessous qui réponds à ton besoin, à quelques nuances près, liées à quelques imprécisions:

    1) j'ai supposé que le nom du dossier que tu demandes est un dossier qui doit exister. J'utilise donc la commande "choose Folder" qui est appropriée. Si ton dossier est un nom quelconque, il faut remplacer par un display dialog correspondant.
    2) tu demandes à ouvrir la base xlsx d'abord et la refermer si tu annules. J'ai préféré te laisser choisir et annuler ou valider d'abord, avant d'ouvrir. Si tu annules, rien d'autre ne se passe. Si tu valides, alors toutes les instructions demandées sont exécutées.
    3) Tu ne dis rien sur la base et son format (nb de colonnes), donc j'ai supposé qu'elle débutait en A1 et que les données sont continues: "used range" est l'équivalent VBA de "current region".
    4) Enfin, tu ne précises par sur quelle colonne faire le tri. j'ai supposé sur la colonne A !

    J'ai testé le script avec le fichier txt enregistré sur mon bureau.
    J'ai un doute quant à l'accès de ton utilisateur sur le dossier Applications qui est à la racine du disque et donc qui nécessite le niveau administrateur !

    A toi de mettre les bonnes valeurs sur les 4 premières lignes ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    set Chemin_A to "mon chemin A"set Chemin_B to "mon chemin B"
    set FichierTXT to "HD:Users:Moi:Application:Logiciel:Fichier_Copy.txt"
    set XLBase to "HD:Users:Moi:Desktop:Base de test.xlsx" -- nom et chemin de la base XL
    
    
    
    
    set Mon_Dossier to choose folder with prompt "Choisissez un dossier" -- selection d'un dossier existant
    tell application "Finder"
        set Dos_Nom to name of Mon_Dossier
    open XLBase
    end tell
    
    
    
    
    tell application "Microsoft Excel"
    activate front document
        set Ma_Base to used range of active sheet
        set Nb_Lignes to (count of rows of Ma_Base)
        repeat with I from 1 to Nb_Lignes
            if value of cell ("A" & I) is equal to "" then exit repeat
        end repeat
        if value of cell ("A" & I) is not equal to "" then set I to I + 1 -- si pas de cellule vide on insère une en bas
    -- i est la première ligne dont la cellule A est vide
        set value of cell ("A" & I) to Dos_Nom
        set value of cell ("A" & I) to Dos_Nom
        set value of cell ("B" & I) to Dos_Nom
        set value of cell ("D" & I) to Chemin_A
        set value of cell ("E" & I) to Chemin_B
        set Ma_Base to used range of active sheet
    select cell "A1"
    sort Ma_Base key1 range "A1" order1 sort ascending
    save
    save as worksheet 1 of active workbook filename FichierTXT file format current platform text file format with overwrite
    quit saving no
    end tell
    Cordialement

  3. #3
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Merci, je vois ça et te tiens au courant
    Salut PBell,

    Merci pour ton aide, je vois ça et te tiens au courant.
    A bientôt.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Script testé - En bonne voie
    Salut PBell,

    J'ai testé ton script et il y a quelques soucis dûs à mes imprécisions
    Ci-dessous mon code adpaté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    set Chemin_A to "mon chemin A"
    set Chemin_B to "mon chemin B"
    set FichierTXT to "HDD:TRAVAUX:Test.txt"
    set XLBase to "HDD:Users:Martinez:Desktop:Test.xlsx" -- nom et chemin de la base XL
     
    set Dos_01 to "HDD:TRAVAUX:ActionDossierTravauxEnCours:AFC:00-TRAVAUX EN COURS" -- création du Nom Client dans dans 01DossierTravauxEnCours
     
     
    tell application "Finder"
    	-- boucle de saisie du nom de client jusqu'à ce que Mon_OK soit vrai (= la saisie n'est pas vide et la dossier n'existe pas déjà)
    	set Mon_Dossier to false
    	repeat until Mon_Dossier
    		set Dos_Nom to "Nom_Client"
    		set Saisie to (display dialog "Saisissez le nom du client" default answer Dos_Nom)
    		set Dos_Nom to text returned of Saisie
    		if not (Dos_Nom is "") then if not (exists (Dos_01 & Dos_Nom)) then set Mon_Dossier to true
    		if not Mon_Dossier then display dialog "Le nom saisi est vide ou ce nom existe déjà !" & return & "Veuillez resaisir un nom."
    	end repeat
    	open XLBase
    end tell
     
     
    tell application "Microsoft Excel"
    	activate front document
    	set Ma_Base to used range of active sheet
    	set Nb_Lignes to (count of rows of Ma_Base)
    	repeat with I from 1 to Nb_Lignes
    		if value of cell ("A" & I) is equal to "" then exit repeat
    	end repeat
    	if value of cell ("A" & I) is not equal to "" then set I to I + 1 -- si pas de cellule vide on insère une en bas
    	-- i est la première ligne dont la cellule A est vide
    	set value of cell ("A" & I) to Dos_Nom
    	set value of cell ("A" & I) to Dos_Nom
    	set value of cell ("B" & I) to Dos_Nom
    	set value of cell ("D" & I) to Chemin_A
    	set value of cell ("E" & I) to Chemin_B
    	set Ma_Base to used range of active sheet
    	select cell "A1"
    	sort Ma_Base key1 range "A1" order1 sort ascending
    	save
    	quit saving no
    end tell
    Ton script va tout à fait dans le sens que je souhaitais : je peut écrire dans un fichier excel, le tri sur la colonne A se fait. Le fichier excel s'enregistre et excel quitte.

    Toutefois, quelques petits dysfonctionnements :
    1) : effectivement je voulais plutôt un display dialog, ce que j'ai inséré en ligne
    En fait j'ai repris les lignes de code du précédent script (concernant la discussion précédente Création de Dossier) (voir lignes 10 à 18) mais je pense que cette partie de code peut être nettoyée (si je ne déclare pas la valeur Dos_01 en ligne 6 ça ne marche pas et pourtant cette valeur n'a rien à faire ici.
    2) : Si j'entre un dossier déjà présent dans le fichier excel, je ne suis pas averti et une 2° ligne portant le même nom saisi est créée (malgré la ligne 17). Je voudrais être averti pour éviter de rentrer 1 2° fois ce nom de dossier.
    3) : Enfin, un fichier .txt est bien créé au chemin d'accès que je souhaite (pour l'instant j'indique un autre chemin que celui du dossier application) mais il est vide. Je voudrais en fait qu'après chaque nouvelle entrée dans le fichier .xlsx, celui-ci se transforme en .txt (donc contenant toutes les infos).

    Penses-tu qu'on peut résoudre ces soucis ?

  5. #5
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    La valeur Dos_01 doit être initialisée, tout simplement parce que tu testes son existence en ligne 16, dans ta boucle !
    Je suggère que tu testes l'existence de Dos_01 (si c'est nécessaire), avant la saisie du nom de client (donc avant ta boucle).
    En effet, si ce dossier n'existe pas, ton utilisateur est bloqué dans la boucle lignes 12 à 18 , sans possibilité d'en sortir !

    A propos l'existence, il faut bien définir si tu veux tester l'existence du nom dans le Finder (c'est le cas en ligne 16) ou si tu veux tester dans la liste Excel.
    Tu peux penser que c'est la même chose, mais pas du tout car un utilisateur peut créer ou supprimer un dossier du Finder sans passer pas ton application, donc, sans que Excel n'en sache rien !

    Ton fichier Excel ne se sauvegarde pas en txt, car dans la version de ton script, tu as supprimé la ligne 35 de mon script ("save as worksheet 1....")...qui sauvegarde en txt.
    Tu n'as gardé quer le "save" qui, lui, enregistre en xlsx.

    Cordialement

  6. #6
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Pas loin du but
    Salut PBell,

    Merci de ta réponse qui m'a été précieuse.
    J'avance à grands pas et je touche au but.
    J'ai fignolé ton code original. DU coup, excel ne quitte plus mais les documents se ferment (gardant l'app Excel ouvert).
    Le fichier XLSX s'enregistre, se transforme en .TXT et ce dernier se copie ailleurs.

    Mais je bloque encore.
    J'ai fait une boucle pour vérifier si le nom de dossier entré dans le tableau excel n'existait pas dans un dossier bien précis. Ceci marche bien.
    Mais je voudrais que cette vérification se fasse également sur le tableau Excel. Donc lors de la saisie du nom de dossier, le script doit vérifier aussi si le nom entré n'est pas déjà présent dans le tableau. Si c'est le cas, un message averti l'utilisateur et lui donne la possibilité de rentré un nouveau nom.
    J'ai essayé de la faire avec un display dialogue (ligne 29 à 31). Je suis bien averti du doublon mais je n'ai pas la possibilité d'entrer un nouveau nom.
    Où me suis-je planté ?
    Peux-tu encore m'aider ?


    Ci-dessous mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    set Chemin_A to "mon chemin A"
    set Chemin_B to "mon chemin B"
    set FichierTXT to "HDD:TRAVAUX:Test.txt"
    set XLBase to "HDD:Users:Martinez:Desktop:Test.xlsx" -- nom et chemin de la base XL
    set FichierXLSXTXT to "HDD:Users:Martinez:Desktop:Test.txt"
    set Dos_01 to "HDD:TRAVAUX:" -- création du Nom Client dans dans 01DossierTravauxEnCours
     
     
    tell application "Finder"
    	-- boucle de saisie du nom de client jusqu'à ce que Mon_Dossier soit vrai (= la saisie n'est pas vide et la dossier n'existe pas déjà)
    	set Mon_Dossier to false
    	repeat until Mon_Dossier
    		set Dos_Nom to "Nom_Client"
    		set Saisie to (display dialog "Saisissez le nom du client" default answer Dos_Nom)
    		set Dos_Nom to text returned of Saisie
    		if not (Dos_Nom is "") then if not (exists (Dos_01 & Dos_Nom)) then set Mon_Dossier to true
    		if not Mon_Dossier then display dialog "Le nom saisi est vide ou ce nom existe déjà dans le dossier TRAVAUX !" & return & "Veuillez resaisir un nom."
    	end repeat
    	open XLBase
    end tell
     
     
    tell application "Microsoft Excel"
    	activate front document
    	set Ma_Base to used range of active sheet
    	set Nb_Lignes to (count of rows of Ma_Base)
     
     
    	repeat with I from 1 to Nb_Lignes
    		if value of cell ("A" & I) is equal to Dos_Nom then display dialog "Le nom saisi est vide ou ce nom existe déjà dans le TABLEAU EXCEL !" & return & "Veuillez resaisir un nom."
    	end repeat
     
     
    	repeat with I from 1 to Nb_Lignes
    		if value of cell ("A" & I) is equal to "" then exit repeat
    	end repeat
    	if value of cell ("A" & I) is not equal to "" then set I to I + 1 -- si pas de cellule vide on insère une en bas
    	-- i est la première ligne dont la cellule A est vide
    	set value of cell ("A" & I) to Dos_Nom
    	set value of cell ("A" & I) to Dos_Nom
    	set value of cell ("B" & I) to Dos_Nom
    	set value of cell ("D" & I) to Chemin_A
    	set value of cell ("E" & I) to Chemin_B
    	set Ma_Base to used range of active sheet
    	select cell "A1"
    	sort Ma_Base key1 range "A1" order1 sort ascending
    	save
    	save as worksheet 1 of active workbook filename FichierXLSXTXT file format current platform text file format with overwrite
    	save as worksheet 1 of active workbook filename FichierTXT file format current platform text file format with overwrite
    	close active workbook saving yes
    	end tell

  7. #7
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    tu as placé ta vérification d'existence du dossier dans les cellules Excel entre les lignes 29 et 31 de ton code.
    Elles sont , de ce fait, exclues de la boucle de saisie du nom de dossier située entre les ligne 12 et 18.

    Il faudrait insérer ce test d'existence, à l'intérieur de la boucle 12/18.

    Si tu n'as pas beaucoup de dossier dans ta liste Excel, tu peux sans doute lire chaque cellule de la colonne A pour mettre la valeur dans une liste Applescript et tu n'as ensuite qu'à tester si la valeur saisie fait déjà partie de la liste.
    si oui, tu re-boucles pour une nouvelle saisie.

    Cordialement

  8. #8
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Boucle de vérification dans tableau excel ne fonctionne pas
    Bonjour,

    J'ai essayé d'inclure entre la ligne 12 et 18 la boucle qui vérifie si dans le tableau excel le nom de dosser entré existe ou pas et ça m'affiche des messages d'erreur.
    En effet, la variable Nb_Lignes est définie plus bas et donc n'est pas reconnue. J'ai essayeé de la définir plus haut mais ça ne marche pas.

    Quant à ta 2° proposition j'avoue que je ne sais pas trop comment procéder. Faire une liste applescript c'est au delà e mes compétences. Dnas l'absolu, ce tableau excel devrait contenir au maximum 500 lignes. Donc est-ce que ça pourrait marchez ?

    Peux-tu m'aiguiller ?

    3 autres petites questions :
    - Est-il possible d'inclure dans une boite de dialogue une signature (non modifiable pas l'utilisateur) ?
    - Lorsque j'insère mon nom de dossier dans dans la tableau xlsx., est-il possible de faire en sorte que le fond de la cellule soit d'une certaine couleur et le texte saisi d'un autre couleur ?
    - Sur la tableau excel, est-il possible de "condamner" la 1° ligne (car je souhaiterais y insérer les titres des colonnes avec des filtres). Donc les boucles de vérification devraient exclure cette ligne.

    Merci d'avance de ton aide.

  9. #9
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonsoir,
    En fait, ce que tu demandes en terme de vérification est un peu plus compliqué. Il faut :
    1) vérifier que l'utilisateur ne clique pas sur annuler -> sinon on quitte
    2) vérifier que la saisie n'est pas vide -> sinon on affiche un message et on boucle en re-demandant une saisie
    3) vérifier que la saisie n'existe pas déjà dans le fichier -> sinon on affiche un message et on boucle
    4) vérifier que la saisie non vide, qui n'existe pas dans le fichier, n'existe pas non plus en tant que dossier dans DOS_01


    Cela représente désormais la partie la plus longue du script avec les messages adéquats et les tests.

    De plus, plutôt que d'utiliser les listes (500 objets c'est parfois long), j'ai utilisé la méthode "Find" de Excel, plus propre.
    Dans cette recherche, j'ai condamné la ligne d'entête (voir le "find after "A1")
    J'ai également mis en couleur le fond de la cellule ajoutée, avec un texte en gras, comme tu l'as demandé (la couleur est faite de 3 chiffres de 0 à 255 pour les valeur RGB).

    Enfin, je suis perplexe sur ta demande d'inclure une signature dans la boite de dialogue...que veux tu dire ?

    Voici le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    set Chemin_A to "mon chemin A"set Chemin_B to "mon chemin B"
    
    
    set FichierTXT to "HDD:TRAVAUX:Test.txt"
    set XLBase to "HDD:Users:Martinez:Desktop:Test.xlsx" -- nom et chemin de la base XL
    set FichierXLSXTXT to "HDD:Users:Martinez:Desktop:Test.txt"
    set Dos_01 to "HDD:TRAVAUX:" -- création du Nom Client dans dans 01DossierTravauxEnCours
    
    
    
    
    -- ouverture fichier Excel
    tell application "Microsoft Excel"
        try
    open XLBase
        on error
            display dialog "impossible d'ouvrir le fichier Excel " & XLBase
            return
        end try
    -- lecture nombre de lignes de la base
    activate front document
        tell active sheet
            set Ma_Base to used range of active sheet
            set Nb_Lignes to (count of rows of Ma_Base)
            set Index_range to range ("A2:A" & Nb_Lignes)
    -- boucle de saisie du nom de lient jusqu'à ce que soit Annuler, soit dossier n'existe pas ni dans XLBase colonne A , ni dans le dossier DOS_01
            set SaisieOK to false
            set Dos_Nom to "Nom_Client"
            repeat until SaisieOK
                set Saisie to (display dialog "Saisissez le nom du client" default answer Dos_Nom buttons {"Annuler", "Ajouter"})
                if button returned of Saisie is "Annuler" then
                    display alert "Fin du script. Merci"
                    return -- fin du script
                end if
                set Dos_Nom to text returned of Saisie
                if Dos_Nom is "" then
                    set Dos_Nom to "Nom_Client" -- on remet le nom par defaut et on boucle
                else -- le nom saisi n'est pas vide
    -- recherche dans la base XL
                    set Nouveau to false
                    try
                        set Trouve_Range to find (Index_range) after "A1" what Dos_Nom look at whole with match case
                    on error
                        set Nouveau to true
                    end try
                    if Nouveau then -- Le dossier n'existe pas dans Excel , on cherche dans le finder le dossier
    -- cherche si le dossier n'existe pas dans Dos_01
                        tell application "Finder"
                            if folder (Dos_01 & Dos_Nom) exists then
                                display alert "Le dossier " & Dos_Nom & " existe déjà dans dossier de travail." & return & "Veuillez saisir un nouveau nom !"
                            else
                                set SaisieOK to true--le dossier est nouveau partout !! tout va bien on sort de la boucle
                            end if
                        end tell
                    else
                        display alert Dos_Nom & " existe déjà dans la base Excel." & return & "Veuillez saisir un nouveau nom !"
                    end if -- if Nouveau
                end if -- if Dos_Nom is ""
            end repeat
    -- A ce stade le dossier saisi n'est pas vide, l'utilisateur n'a pas annulé et le dossier n'est pas dans la base Excel ni dans le Finder
            repeat with I from 1 to Nb_Lignes
                if value of cell ("A" & I) is equal to "" then exit repeat
            end repeat
            if value of cell ("A" & I) is not equal to "" then set I to I + 1 -- si pas de cellule vide on insère une en bas
    -- i est la première ligne dont la cellule A est vide
            set value of cell ("A" & I) to Dos_Nom
            set value of cell ("A" & I) to Dos_Nom
            set value of cell ("B" & I) to Dos_Nom
            set value of cell ("D" & I) to Chemin_A
            set value of cell ("E" & I) to Chemin_B
            set font style of font object of cell ("A" & I) to "Bold" -- text en gras
            set color of interior object of cell ("A" & I) to {141, 180, 226} -- couleur de fond en RGB
            set Ma_Base to used range
    sort Ma_Base key1 range "A1" order1 sort ascending
        end tell -- active sheet
        
    save
    save asworksheet 1 of active workbookfilenameFichierXLSXTXTfile formatcurrent platform text file format with overwrite
    save asworksheet 1 of active workbookfilenameFichierTXTfile formatcurrent platform text file format with overwrite
    closeactive workbooksavingyes
    end tell -- Microsoft Excel
    Cordialement

  10. #10
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Super... je te tiens au courant
    Salut PBell,

    Effectivement gros boulot pour coller au plus près à ce que je souhaite.
    Je teste ça et te tiens au courant.

    A+ et merci.

  11. #11
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Explication plus précises
    Salut PBell,

    J'ai donc testé ton nouveau script mais j'ai des soucis.
    Sur le fichier excel, le fond de la cellule est bien bleu comme définit dans le script mais le nom entré n'est pas en gras. Comment faire ?
    En outre, le tri par ordre croissant se fait jusqu'à la première ligne alors que je voudrais que celle-ci soit exclue du tri. En effet, je voudrais attribuer à chacune des cellules de la première ligne la possibilité de faire des tris ou autre.

    Mais le gros problème est que le script ne détecte pas si dans le tableau excel le nom entré existe déjà ou pas, du coup on pourrait avoir des doublons.
    Voilà comment je vois les choses :
    Si le nom du dossier entré (dossier X) dans la boite de dialogue existe déjà dans le dossier travail
    et si
    si ce même nom de dossier existe déjà dans la tableau excel
    Alors on aurait une boite de dialogue disant le dossier (on récupère le nom du dossier dossier X) existe déjà et un bouton annuler qui annulerait la procédure et refermerait le tableau excel (sans quitter excel)
    SINON c'est que le dossier (dossier X) existe déjà dans la dans le dossier travail et n'existe pas dans le tableau excel
    DONC LÀ on aurait une boite de dialogue qui récupère le nom de ce dossier (dossier X) dans le dossier travail avec le message : Voulez-vous créer la ligne "Dossier X" avec un bouton OK ou annuler
    SINON, c'est à dire si le nom de dossier entré (dossier X) n'existe pas dans le dossier travail ni dans le tableau excel, on peut rentrer le nom du dossier dans le tableau excel.

    Voilà, c'est vrai qu'il est difficile de mettre par écrit un raisonnement conditionnel.

    Penses-tu que cela soit faisable ?

  12. #12
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Je ne vois pas pourquoi ta cellule ne se met pas en gras. Cela fonctionne chez moi.
    La ligne 71 met en gras et la ligne 72 met le fond de couleur. Comme tu as bien le fond de couleur, cela signifie que l'adresse de la cellule est correcte.
    Seule hypothèse valide (faute d'autres données) est que tu utilises peut être une police sans option "gras"...? Certes c'est peu probable, mais je ne vois pas d'autre explication.

    Pour l'option de tri, il faut ajouter en fin de ligne 74 (sort) les mots "with header" pour spécifier que le bloc de données comporte des entêtes à exclure du tri.

    Encore une fois, tout ceci fonctionne parfaitement chez moi.
    Attention toutefois, à l'importance de la ligne 23 "used range of active sheet". En effet cela suppose que tes données soient contiguës comme dans tout tableau Excel.
    Si tes données sont : entêtes en ligne 1, lignes 2 à 10 remplies, puis ligne 11 vide et d'autres données à partir de la ligne 12, alors Excel ne verra que les ligne de 1 à 10. ceci tant pour le find que pour le sort !! C'est peut être ton problème. Pour simplifier, j'ai fait une correction en ligne 24 pour compter directement le nombre de lignes.


    Pour les vérifications, le programme fonctionne chez moi sans problème, mais pour ajouter ce que tu demandes, il faut inverser l'ordre des tests (faire d'abord l'existence du dossier, puis l'existence dans Excel et valider selon le résultat d'un dialogue)
    J'ai modifié les tests pour ne pas faire de tests "emboîtés", c'est à dire avec des if, else if, else if...
    Je définis maintenant les 2 variables Finder_Existe et Excel_Existe et je traite les 4 cas possibles. Ainsi, si tu veux faire des modifications, cela sera plus lisible pour toi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    set Chemin_A to "mon chemin A"set Chemin_B to "mon chemin B"
    
    
    set FichierTXT to "HDD:TRAVAUX:Test.txt"
    set XLBase to "HDD:Users:Martinez:Desktop:Test.xlsx" -- nom et chemin de la base XL
    set FichierXLSXTXT to "HDD:Users:Martinez:Desktop:Test.txt"
    set Dos_01 to "HDD:TRAVAUX:" -- création du Nom Client dans dans 01DossierTravauxEnCours
    
    
    -- ouverture fichier Excel
    tell application "Microsoft Excel"
        try
    openXLBase
        on error
            display dialog "impossible d'ouvrir le fichier Excel " & XLBase
            return
        end try
    -- lecture nombre de lignes de la base
    activate front document
        tell active sheet
    selectcell "A1"
            set Nb_Lignes to (count of rows of used range)
            set Index_range to range ("A2:A" & Nb_Lignes)
    -- boucle de saisie du nom de lient jusqu'à ce que soit Annuler, soit dossier n'existe pas ni dans XLBase colonne A , ni dans le dossier DOS_01
            set SaisieOK to false
            set Dos_Nom to "Nom_Client"
            repeat until SaisieOK
                set Saisie to (display dialog "Saisissez le nom du client" default answer Dos_Nom buttons {"Annuler", "Ajouter"})
                if button returned of Saisie is "Annuler" then
                    display alert "Fin du script. Merci"
                    return -- fin du script
                end if
                set Dos_Nom to text returned of Saisie
                if Dos_Nom is "" then
                    set Dos_Nom to "Nom_Client" -- on remet le nom par defaut et on boucle
                else -- le nom saisi n'est pas vide : on recherche dans le Finder
                    tell application "Finder" to set Finder_Existe to (folder (Dos_01 & Dos_Nom) exists)
                    set Excel_Existe to true-- on recherche dans Excel
                    try
                        set Trouve_Range to find (Index_range) whatDos_Nomlook atwhole with match case
                    on error
                        set Excel_Existe to false
                    end try
                    
    -- on teste les 4 cas possibles  Finder_Existe et Excel_Existe
                    if Finder_Existe and Excel_Existe then
                        display alert "Le dossier " & Dos_Nom & " existe déjà dans la base Excel et dans le dossier de travail" buttons {"Fin du script"}
                        return
                    end if
                    if Finder_Existe and (not Excel_Existe) then
                        set Choix to display dialog "Le dossier " & Dos_Nom & " existe déjà dans le dossier de travail." & return & "Voulez-vous l'ajouter à la base Excel ?" buttons {"Ajouter", "Abandonner"}
                        if button returned of Choix is "Abandonner" then
                            return
                        else
                            set SaisieOK to true
                        end if
                    end if -- Finder_Existe and Nouveau_Excel
                    if (not Finder_Existe) and (not Excel_Existe) then set SaisieOK to true-- n'existe ni dans Excel, ni dans le dossier : on va ajouter dans Excel
                    if (not Finder_Existe) and Excel_Existe then
    -- le dossier n'existe pas, mais il existe déjà dans Excel ! que faire ? Je suppose qu'on ne fait rien !!
                        display alert "Le dossier " & Dos_Nom & " existe déjà dans la base Excel mais pas dans le dossier de travail" buttons {"Fin du script"}
                        return
                    end if
                    
                end if -- if Dos_Nom is ""
            end repeat --until SaisieOK
    -- A ce stade le dossier saisi n'est pas vide, l'utilisateur n'a pas annulé et le dossier n'est pas dans la base Excel ni dans le Finder
            repeat with I from 1 to Nb_Lignes
                if value of cell ("A" & I) is equal to "" then exit repeat
            end repeat
            if value of cell ("A" & I) is not equal to "" then set I to I + 1 -- si pas de cellule vide on insère une en bas
    -- i est la première ligne dont la cellule A est vide
            set value of cell ("A" & I) to Dos_Nom
            set value of cell ("A" & I) to Dos_Nom
            set value of cell ("B" & I) to Dos_Nom
            set value of cell ("D" & I) to Chemin_A
            set value of cell ("E" & I) to Chemin_B
            set font style of font object of cell ("A" & I) to "Bold" -- text en gras
            set color of interior object of cell ("A" & I) to {141, 180, 226} -- couleur de fond en RGB
            set Ma_Base to used range
    sortMa_Basekey1range "A1" order1sort ascending with header
        end tell -- active sheet
        
    save
    save asworksheet 1 of active workbookfilenameFichierXLSXTXTfile formatcurrent platform text file format with overwrite
    save asworksheet 1 of active workbookfilenameFichierTXTfile formatcurrent platform text file format with overwrite
    --close active workbook saving yes
    end tell -- Microsoft Excel
    Cordialement

  13. #13
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Super... merci beaucoup, ça marche nickel...
    Salut PBell,

    En l'état, ton dernier script est conforme à ce que je souhaitais.
    Tu as tout à fait compris mon cheminement, mais en fait, j'ai mis du temps à t'exposer ce que je voulais réellement.
    Dès que c'était clair pour toi... comme par hasard le bon script a pointé le bout de son nez.

    Bref, je suis super content, ça fonctionne nickel.

    Seul bémol : le texte entré n'apparait toujours pas en gras. Alors j'ai définis sur excel que la colonne A soit tout en Verdana gras (le gras est prévu chez Verdana) mais malgré ça on voit bien qu'il s'inscrit en gras, le tri se fait et, subrepticement, avant que le fichier excel se referme j'arrive à repérer le nom entré mais il n'est plus en gras. Et effectivement, quand je réouvre le fichier (puisque le script le referme), il n'est pas en gras. Mais, bon c'est pas grave, je vais essayé de creuser.

    Je reviendrais vers toi sur la possibilité donnée à l'utilisateur d'entrer un autre nom de dossier dans le cas où le nom entré existe déjà dans le dossier travail et dasn le dossier excel. En effet, je pense qu'on doit prévoir l'éventualité où l'utilisateur ait pu se tromper en entrant son nom de dossier. En effet, parfois on attribue des noms très semblables à des dossiers différents... mais ils restent différents...

    EN tout cas, merci pour tout, encore une fois tu a su répondre à un défi, en tout cas le mien, c'est à dire créer une mini application qui va faciliter la vie au quotidien d'une dizaine de personne.
    Je vais entrer dans les détails du script et te tiens au courant.

    3 questions connexes :
    Jusqu'où va le script pour vérifier l'existence ou pas du dossier présent dans le dossier travail.
    En l'espèce, le dossier travail est "HDD:TRAVAUX:". Je voudrais que la recherche s'arrête là et n'aille pas jusque dans les sous-dossiers éventuels présent des dossiers déjàa présent.
    Ex : si 1 dossier "X" (qui contient des sous-dossiers") est présent dans "HDD:TRAVAUX:", je ne voudrais pas que le script aille vérifier si le nom entré existe déjà dans le dossier X. Est-ce le cas ?
    Tu comprends je ne voudrais pas que la vérification dure trop longtemps.

    Autre question : la signature dont je te parlais, serait un texte non éditable mais qui figurerait sur les boites de dialogue. Aucune envie de s'approprier une certaine gloire mais juste indiquer la date de création du script en vue d'une évolution ultérieure.

    Dernière question :
    Je suis sur Tiger (et oui !) et X Code ne fonctionne pas très bien (il plante souvent). Connais-tu ce problème ?

    Merci encore PBell, à bientôt.

  14. #14
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Septembre 2010
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 602
    Points : 1 239
    Points
    1 239
    Par défaut
    Bonjour,
    Je suis content que cela fonctionne comme tu le souhaites.
    Je suis toujours perplexe sur le texte en gras, mais comme cela fonctionne chez moi, je ne peux t'aider davantage.

    La fonction "Exists folder" du Finder s'arrête au niveau où elle est appelée. Donc elle va se limiter aux seuls dossiers directement sous le dossier HDD:TRAVAUX et ignorer les éventuels dossiers qui pourraient se situer dans des sous dossiers

    Dans le cas où l'utilisateur a saisi un nom existant déjà dans le Finder et dans Excel, il te suffit de changer les lignes 47 et 48 : le ligne 47 en changeant le dialog et le bouton pour être plus explicite et la ligne 48, en la supprimant !! (ou tu peux la transformer en commentaire avec "--" devant ). Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    display alert "Le dossier " & Dos_Nom & " existe déjà dans la base Excel et dans le dossier de travail" & return & "Voulez-vous corriger votre saisie ? "
    -- return
    Comme SaisieOK ne sera pas "true", le script bouclera pour demander une nouvelle saisie, en affichant la dernière saisie de l'utilisateur.

    Pour la partie signature, tu ne peux pas changer les fenêtres de dialogue Applescript.
    C'est une limite inhérente à ce langage, sauf à faire appel à des bibliothèques externes type Satimage qui permettent des dialogues plus élaborés.
    Si tu veux rester simple, tu peux partiellement contourner la difficulté en créant un icône qui contient nom & date et ajouter "with icon alias xx" sur chaque ligne de display dialog, en prenant soin que XX soit le nom de ton icône avec son chemin d'accès; par exemple Set XX to "HDD:TRAVAUX:Mon_Icone.icns"
    Ton icône s'affichera alors sur chaque fenêtre (sauf, je crois, les display Alert !).

    Enfin désolé pour Tiger, je n'ai plus qu'un vieux G5 bipro sur Tiger sur lequel je n'utilise plus xCode depuis des lustres !

    Cordialement

  15. #15
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut Ça fonctionne parfaitement
    Salut,

    Merci PBell, ça fonctionne bien.
    Ça ne se met pas en gras, mais ce n'est pas grave.
    Pour la signature, j'ai testé avec des icones et là aussi j'obtiens ce que je voulais (sur les boites de dialogue car pour les display alert effectivement ça ne semble par marcher).
    Je laisse la discussion encore ouverte le temps de le tester en configuration réelle.

    Merci encore pour la précieuse contribution.

    A bientôt.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Graphiste
    Inscrit en
    Décembre 2013
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Graphiste
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2013
    Messages : 82
    Points : 24
    Points
    24
    Par défaut C'est résolu
    Bonjour à tous,

    Ce script fonctionnant parfaitement, je note cette discusion comme résolue.
    Merci pour l'aide précieuse de PBell.

    A bientôt.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ecrire sur un fichier Excel, par du code C#
    Par hazem2410 dans le forum C#
    Réponses: 3
    Dernier message: 31/05/2011, 11h19
  2. Réponses: 2
    Dernier message: 27/05/2011, 09h27
  3. lire ecrire sur un fichier Excel
    Par mrkinfo dans le forum C#
    Réponses: 3
    Dernier message: 17/09/2008, 12h01
  4. [Excel] Travailler sur un fichier excel existant
    Par scoder dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 26/10/2004, 12h54
  5. Extraction de données sur des fichiers excel
    Par iupgeii dans le forum MFC
    Réponses: 3
    Dernier message: 23/01/2004, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo