Configuration automatique des itérations dans Excel

Anonyme
2015-11-23T10:43:05+00:00

Bonjour

C'est un problème un peu particulier que je souhaite vous soumettre (sous EXCEL 2010 minimum).

Je développe un programme EXCEL utilisant le calcul itératif pour de nombreuses boucles; le contenu des données de ce programme et le temps de traitement sont très variables d'une utilisation à l'autre obligeant trop fréquemment à redéfinir manuellement le nombre maximal d'itérations. je souhaiterais une configuration automatique.

Le nombre maximal d'itérations à configurer est manuel dans le menu "Fichier - Options - Formules".

Dans l'idéal, ce nombre maximal d'itérations serait à récupérer dans une cellule d'une feuille Excel et dont le contenu serait variable suivant la quantité de données de l'application à traiter. En cas d'absence de nombre dans la cellule, la configuration manuelle reprend la main.

A ma connaissance aucune instruction ne permet de réaliser cette configuration automatique du nombre maxi d'itérations.

Pour le moins serait-il possible de savoir comment et où récupérer la configuration d'Excel à l'ouverture d'un fichier (les informations de l'onglet "Options" paramétrables manuellement.

D'un niveau bien trop modeste en VBA, je recherche une macro qui permette cette configuration automatique à partir du contenu d'une cellule d'une feuille.

En remerciant d'avance celles et ceux qui pourraient m'aider à résoudre ce problème.

Microsoft 365 et Office | Excel | Pour la maison | Windows

Question verrouillée. Cette question a été migrée à partir de la Communauté Support Microsoft. Vous pouvez voter pour indiquer si elle est utile, mais vous ne pouvez pas ajouter de commentaires ou de réponses ni suivre la question.

0 commentaires Aucun commentaire

24 réponses

  1. DanielCo 107.1K Points de réputation
    2015-11-26T13:25:36+00:00

    Ce n'est pas correct. La macro :

    Private Sub Worksheet_Calculate()

        Application.MaxIterations = [Envoi!BX26].Value

    End Sub

    doit être placée ans le module de la feuille, comme dans mon exemple, pas au milieu d'une autre macro. Avec ton exemple, tu peux simplement faire :

    Sub test() <br><br>If [Envoi!BX2] <> "" Then i = 1Rem' BX2 <>0 si message original placé - BX26=6 <br><br>If [Envoi!BX3] <> "" Then i = 2Rem' BX3 <>0 si Nbre d'itérations max calculé par Excel - BX26= 145 par exemple <br><br>If [Envoi!BX4] <> "" Then i = 3Rem' BX2 <>0 si message codé présent - BX26= 10 <br><br>Application.MaxIterations = [Envoi!BX26].Value <br><br>End Sub

    Il n'y a pas lieu de faire une boucle. Ou j'ai mal compris ?

    Daniel

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  2. Anonyme
    2015-11-26T12:36:53+00:00

    Bonjour

    Après téléchargement de ton fichier et réglé les problèmes de sécurité des macros pour pouvoir le lancer, j'essaie de comprendre le test proposé et surtout son utilisation dans mon cas.

    J'ai bien compris que pour différentes valeurs de "i" le nombre maxi d'itérations es modifié (doublé dans ton exemple) et j'en constate bien en bas de page l'exécution.

    Cela suppose t-il qu'il me faut prévoir aussi un programme de test (en fonction de la valeur de "i") avant de configurer la configuration d'itérations max (2ème programme de la macro qui fonctionne très bien):

    Exemple:

    Si "i" contient une valeur correspondant à la 1ère configuration d'emploi (Message original placé), la macro test s'exécute puis le 1er nombre d'itérations max est configuré;

    puis Si "i" contient une valeur correspondant à la 2ème configuration d'emploi (Message original placé et Nbre d'itérations max calculé par Excel), la macro test se ré exécute puis le 2ème nombre d'itérations max est configuré;

    puis Si "i" contient une valeur correspondant à la 3ème configuration d'emploi (Message codé obtenu dans une cellule), la macro test se ré exécute puis le 3ème nombre d'itérations max est configuré;

    le programme test pourrait être le suivant:

    Sub test()<br><br><br>If [Envoi!BX2]<>""then i=1 Rem' BX2 <>0 si message original placé - BX26=6<br><br><br>If [Envoi!BX3]<>""then i=2 Rem' BX3 <>0 si Nbre d'itérations max calculé par Excel - BX26= 145 par exemple<br><br><br>If [Envoi!BX4]<>""then i=3 else 0 Rem' BX2 <>0 si message codé présent - BX26= 10<br><br><br>For i=0 to 3<br><br><br>Private Sub Worksheet_Calculate() <br><br>    Application.MaxIterations = [Envoi!BX26].Value <br><br>End Sub<br><br><br>Next i<br><br><br>End sub

    Est-ce correct ou non? Que me proposes -tu pour que le test de la macro s'effectue tout au long de la séquence d'utilisation et recommence lors d'une nouvelle utilisation?

    Merci d'avance

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  3. DanielCo 107.1K Points de réputation
    2015-11-25T12:27:04+00:00

    Bonjour,

    Regarde ce classeur exemple. La macro test, déclenchée par le bouton fait évoluer la valeur de BX25 de 1 à 100. la formule en BX26 est :

    =BX25*2

    Sub test() <br><br>    Application.MaxIterations = 1 <br><br>    For i = 1 To 100 <br><br>        [Envoi!BX25] = i <br><br>        [Envoi!BX13] = Application.MaxIterations <br><br>        Application.Wait Now + TimeValue("00:00:3") <br><br>    Next i <br><br>End Sub

    La valeur de MaxIterations (reportée en BX13) est modifiée par la macro :

    Private Sub Worksheet_Calculate() <br><br>    Application.MaxIterations = [Envoi!BX26].Value <br><br>End Sub

    https://www.dropbox.com/s/rmns85ok6meh00v/matysek35.xlsm?dl=0

    Daniel

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  4. Anonyme
    2015-11-25T10:32:53+00:00

    Merci encore de tes précieuses réponses; après plusieurs tests, voilà les résultats observés:

    * C'est parfait pour la lecture de la cellule BX26 et dont le contenu s'affiche bien  dans le Nbre d'itérations max observable dans Options, puis Formules.

    Par contre il me faut toujours relancer manuellement l'exécution de la macro pour que les nouveaux changements d'itérations soient pris en compte.

    Je vais t'apporter de nouvelles informations et observations pour faciliter ton analyse/

    Informations: Le logiciel que j'essaie de mettre au point depuis plusieurs années est un logiciel de codage (cryptage); il est constitué de 3 fichiers minimum (7 au total); 5 fichiers d'interface d'entrées -Sorties adaptés à chaque type de données (Message, Long texte, Tableau Excel, Formules mathématiques, Données sensibles de type carnet d'adresses) - 1 seul de ces fichiers est utilisé à la fois; s'ajoute 1 gros fichier d'analyse et de codage en 8 procédés différents successifs et 1 fichier de données ultra sensibles dont l'association lettres réelles et codes équivalents entre autre. (Si cela t'intéresse davantage...)

    Dans les essais effectués les fichiers suivants sont ouverts et bien sur tous reliés entre eux au niveau des liens.

    le fichier L d'interface ou l'on écrit ou colle son message et récupère le texte final codé; il possède une macro (Mot de passe d'enregistrement du fichier) visible uniquement dans l'onglet des développeurs d'Excel dans la fenêtre  de Microsoft Visual Basic sous:

    Workbook et Before save

    Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    MotDePasseEnregistrement = InputBox("Tapez le mot de passe pour enregistrement")

    If MotDePasseEnregistrement <> [Language!$A$200] Then

    MsgBox "Enregistrement non autorisé"

    Cancel = True

    End If

    End Sub

    le fichier M de codage ou décodage  il possède la macro qui nous concerne (Nbre d'itérations maxi) visible uniquement dans l'onglet des développeurs d'Excel dans la fenêtre  de Microsoft Visual Basic sous le programme que tu m'as proposé: (Aucune action manuelle n'est effectué dans ce fichier; seuls les liens assurent la modification du contenu des cellules et leur traitement bien sûr)

    (Général) puis Worksheet_Calculate

    Private Sub Worksheet_Calculate()

    Application.MaxIterations = [Envoi!BX26].Value

    End Sub

    A noter que pour les 2 fichiers précédents aucune macro n'est écrite dans la fenêtre macros de l'onglet développeur (je ne maîtrise pas suffisamment la différence entre les 2 fenêtres Visual Basic et Macros).

    En écrivant ce qui suit dans la fenêtre macro, une erreur est détectée à son enregistrement:

    Sub nommacro()

    Private Sub Worksheet_Calculate()

    Application.MaxIterations = [Envoi!BX26].Value

    End Sub

    End sub

    Le fichier X de données sensibles d'équivalence  possède une macro  (Détection de l'adresse IP du PC utilisé) visible uniquement dans l'onglet des développeurs d'Excel dans la fenêtre des Macros. Il n'est pas concerné par notre problème actuel et fonctionne très bien.

    L'observation du non fonctionnement est le suivant actuellement:

    Ecriture ou collage du message original dans 1 cellule spécifique (Quelques itérations configurées) puis bon fonctionnement de la macro avec la prise en compte du nombre assez élévé et précis d'itérations nécessaires pour le traitement automatique complet du codage

    Récupération par copiage du message codé

    Effacement du message original devenu inutile et là, dans ce cas seul l'ouverture de Visual basic ou se trouve ton programme et par le biais d'une exécution manuelle configure une configuration finale d'itérations pour libérer les cellules dans l'ensemble du programme; c'est en cela que le déroulement de ta macro n'est pas systématique.

    Excuse la longueur de ce post afin à distance de pouvoir mieux analyser ce que je ne maîtrise pas encore.

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire
  5. DanielCo 107.1K Points de réputation
    2015-11-24T13:13:12+00:00

    Avec cette syntaxe :

    Envoi.[BX26]

    "Envoi" représente le codename de la feuille. Si "Envoi" est son nom, il faut mettre :

    [Envoi!BX26]

    ou :

    Sheets("Envoi").range("BX26")

    > Par contre l'exécution a eu lieu 1 fois seulement et non de manière automatique régulièrement; pour le démontrer, une re configuration manuelle après exécution de la macro est prise en compte mais plus la valeur écrite dans la macro sauf re exécution de celle-ci alors que cette mise à jour devrait être permanente avec la valeur enregistrée.

    Non. Si tu changes la valeur avec la macro, la modif est permanente, sauf si tu la modifies manuellement. De même, 

     .MaxIterations = Envoi.[BX26]

    est valable au moment de l'exécution de cette ligne. Si la valeur en BX26 est modifiée après, MaxIterations n'est pas modifié. Tu peux pallier ceci :

    Si c'est une valeur qui se trouve en BX26, tu peux mettre dans le module de la feuille Envoi :

    Private Sub Worksheet_Change(ByVal Target As Range)

        If Target.Address = "$BX$26" Then Application.MaxIterations = Target.Value

    End Sub

    Si c'est une formule mets dans le module de la feuille Envoi :

    Private Sub Worksheet_Calculate()

        Application.MaxIterations = [Envoi!BX26].Value

    End Sub

    Daniel

    Cette réponse a-t-elle été utile ?

    0 commentaires Aucun commentaire