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

Macros et VBA Excel Discussion :

une constante venant d'un fichier


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut une constante venant d'un fichier
    Bonjour , dans un exercice on me demande d'écrire une fonction qui étant donnée une chaine de caractères composée de mots , renvoie aléatoirement l'un des mots .
    Cette liste de mots se trouve dans un fichier sur l'ordinateur . Et dans l'exercice ils disent : vous insérerez la chaine de caractères compris dans le fichier comme constante .

    Que veulent ils dire par là ? Que je dois recopier entièrement la longue chaine de caractères dans le module en déclarant avant dans le module :

    Public const chaine = ....

    ?

    Je vous remercie .

  2. #2
    Membre expérimenté
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Par défaut Constante , vous avez dit constante
    Pour moi l'énoncé est incorrect .

    Par définition la constante ne peut pas varier.
    au lieu de "
    vous insérerez la chaine de caractères compris dans le fichier comme constante" , il faudrait écrire :"vous insérerez la chaine de caractères compris dans le fichier comme variable".

    Sinon pour l'exercice , je te soumet le synoptique suivant :

    Dans la chaine récupérer , déterminer le nombre Y de mot ( en comptant le nombre de séparateur espcace virgule ... ).
    Ensuite générer un nombre aléatoire ( valeur entre 0 et 1) ; Multiplier ce nombre par le Y ; prendre la valeur entière Z de ce nombre ; Ensuite extraire
    le mot d'ordre Z dans la chaine.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    salut code , alors j'ai bossé sur ton algorithme , je pense avoir réalisé les 1eres étapes mais je bloque sur la dernière :

    comment extraire un mot d'ordre Z de la chaine ?

    Par exemple prenons une chaine de 4 noms :

    "roger;bob;jeanne;tutu;Fin"

    Si je veux extraire jeanne , donc le 3eme nom , je dois renvoyer la sous chaine qui va du 2eme au 3eme point virgule , pour cela dois je utiliser une fonction mid ou right ?

    Voici le début de mon code où je compte bien le nombre de mots et où je renvoie un entier compris entre 0 et le nombre de mots , qu'en dis tu :

    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
    Function Noms(ByVal name As String) As String
    Dim i As Integer, X As Integer, tux As Integer, al As Integer, C As String
        i = 0
        longueur = Len(name)
        X = 0
            Do
            X = X + 1
            If C = ";" Then
            i = i + 1
            Else
            i = i + 0
            End If
            Loop While X = longueur
        al = aleaEntre2(0, i)
     
    End Function
    i représente le nombre de points virgule , tux la longueur de la chaine , X est le compteur pour tôt ou tard sortir de la chaine , al contient la fonction qui renvoie un nombre aléatoire...

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Bonsoir,

    ouvre ton aide en ligne sur la fonction Split.
    Elle est ta solution.

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    je n'ai pas le droit de l'utiliser dsl .

    J'ai presque fini là en fait , j'arrive à compter le nombre de mots , générer un nombre aléatoire entre 0 et le nombre de mots , appelons ce nombre Z .
    Et il ne me reste plus qu'à extraire le mot ayant pour indice Z , mais comment faire...

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Ah...
    Va alors sur le forum VB6. Fais-y une recherche avec le mot Split.
    Tu y trouveras très vite une fonction de substitution (pour ceux qui ont VB5, non doté de cette fonction)...

  7. #7
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    re,

    Pas testé mais à adapter avec ton code et l'idée de UC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    al = RANDBETWEEN(1,i)
    Z = al * i
     MsgBox cherchenumero(name, Z, ";")
    RANDBETWEEN, c'est avec excel 2007, je ne sais pas pour autre version

    une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    al = RANDBETWEEN(1,i)
    Z = al * i 'inutile
     MsgBox cherchenumero(name, al, ";")
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    Bon je ne m'en sors pas alors on va faire plus simple , la fonction doit etre assez courte , j'ai cette chaine de caractères par exemple :

    "toto;roger;boris"

    Je veux extraire de cette chaine le nom roger ( ou un autre peu importe ) . Pour ça l'idée est d'utiliser la fonction mid qui serait ici :

    mid(chaine,position,nombre) , où position est la position du 1er caractère , donc r , nombre le nombre de lettres du noms , donc 5 et chaine ben toute la chaine .

    La fonction commence comme ceci et ce n'est pas négociable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function cherche(byval chaine as string)as string
    est ce que quelqu'un a une idée car je suis des heures dessus et je me perds dans des boucles interminables , or le programme doit faire à peine 10 lignes .

    position vaut en fait l'indice du 1er ";" + 1 ...

    Et là je suis perdu , quelqu'un peut il me guider précisément avec ce que j'ai dit ?
    Tout autre méthode est à exclure c'est pas moi qui dirige l'exercice .

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Désolé, ami, mais :

    - je veux bien comprendre que tu utilises dans ta fonction le caractère de séparation ";" et ne le lui passe donc pas comme paramètre.
    - je ne peux par contre pas comprendre que tu ne veuilles pas passer à ta fonction le paramètre rang du mot, mais uniquement la chaîne dans laquelle chercher !
    Si c'est pour également forcer le rang à 2 au sein même de ta fonction, tu t'écartes considérablement de l'esprit fondamental d'une fonction, faite en principe pour traiter tous les cas (au moins tous les rangs)....


    Je veux bien te suivre et t'aider, mais si c'est pour faire ainsi : non ! désolé ...

    Si, enfin, tu veux travailler caractère par caractère (et ralentir l'ensemble), la fonction Mid te le permet dans une boucle For
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 to len(chaine)
      msgbox mid(chaine,i,1)
    next
    si tu utilises un tel "bulldozer", toutefois, pense au moins à ne pas retraiter toute la chaîne à chaque fois (utilise une boucle While, étête ta chaine du 1er caractère à chaque passage dans la boucle et utilise la fonction Left)...

    Bonne étude et bonne chance.

  10. #10
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Bonjour Ucfoutu.

    J'avais pensé répondre et puis je pense comme toi que cela ne va pas dans le bon sens.

    Bonne journée.

  11. #11
    Membre expérimenté
    Inscrit en
    Juillet 2007
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 239
    Par défaut
    Bonjour shaku ,

    Comme j'avais donné hier une solution de synoptique , je te fourni un code correspondant :

    La fonction extraction_mot_aléatoire permet de sortir des mots d'ordre aléatoire d'une série de chaine qui seraient disposées sur les cellules A2:A5

    Dans mon exemple , le séparateur choisi est le "/" ( slach) ; Tu peux facilement en changer


    on a une fonction pour déterminer le nombre Y de mot

    et une fonction extraire_mot_ord pour extraire le Nième mot de la chaine ( N <= Y).

    ensuite on genere un nombre aléatoire que l'on multiplie par le nombre de mot . On prend la partie entière du nombre obtenu pour choisir le mot que l'on va extraire .



    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
     
     
    Public Function determiner_nombre_mot(chaine As Variant, separateur As String) As Integer
     
    determiner_nombre_mot = 0: pos = 1
    If Len(chaine) > 0 Then
    pos = 1
    Do
     pos = InStr(pos, chaine, separateur)
     If pos > 1 Then
            nb_mot = nb_mot + 1
     
    End If
     pos = pos + 1
    Loop While InStr(pos, chaine, separateur) > 0 And pos < Len(chaine)
     
    determiner_nombre_mot = nb_mot + 1
    End If
    End Function
     
     
    Public Function extraire_mot_ord(chaine As Variant, separateur As String, ordre As Integer) As String
     
    extraire_mot_ord = ""
    If ordre > 0 Then
    curseur = 1: pos = 1
    Do
     pos = InStr(pos, chaine, separateur)
     If pos > 1 Then curseur = curseur + 1
     pos = pos + 1
    Loop While curseur < ordre And InStr(pos, chaine, separateur) > 0
     
      If InStr(pos, chaine, separateur) > 0 Then pos2 = InStr(pos, chaine, separateur) Else pos2 = Len(chaine)
    extraire_mot_ord = Mid(chaine, pos, pos2 - pos)
    End If
     
    End Function
     
     
     
    Sub extraction_mot_aléatoire()
     
    Dim ordre_du_mot As Integer
    Dim separateur As String
     
     
    separateur = ";"
    For ligne = 2 To 5
         chaine = CStr(Trim(Cells(ligne, 1).Value))
         nb_mot = determiner_nombre_mot(chaine, separateur)
         '************************************************
         nombre_aléatoire = (Now() * 100000 - Int(Now() * 100000))
        '************************************************
    ordre_du_mot = CInt(nombre_aléatoire * nb_mot)
     
    mot_aléatoire = extraire_mot_ord(chaine, separateur, ordre_du_mot)
    MsgBox (" chaine : " & chaine & Chr(10) & CStr(nb_mot) & " mots : " & " Mot ordre : " & CStr(ordre_du_mot) & mot_choisis) & "    :  " & mot_aléatoire
    Next
     
     
    End Sub
    J'espère avoir rempli le cahier des charges .

    Dans mon prog j'utilise le code suivant ( trouvé sur MSDN) pour générer un nombre aléatoire < =1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     nombre_aléatoire = (Now() * 100000 - Int(Now() * 100000))
    Il doit y avoir une fonnction idoine dans Excel mais je ne l'a retrouve pas ...

  12. #12
    Membre confirmé
    Inscrit en
    Octobre 2008
    Messages
    203
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 203
    Par défaut
    codefacile je te remercie bcp mais les ordres sont les ordres ; la fonction doit faire à tout casser 10 lignes

    J'ai cherché toute la nuit et j'abandonne , si quelqu'un sait écrire une fonction qui dans ce type de chaine "toto;roger;bob;mike;jeanne;FIN" renvoie aléatoirement un nom je suis preneur .

    Je précise que la fonction ne doit pas dépasser 10 lignes , que la fonction du nombre aléatoire je l'ai déjà écrite donc ne vous ennuyez pas à la réécrire , et que les seules fonctions autorisées sont :

    Len , Mid , right , Instr et left .

    Si quelqu'un veut me guider en me proposant un algo avec comme seule autorisation les fonctions que j'ai cité , j'essayerais de le coder avec plaisir ...

    merci

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Par défaut
    Je veux bien faire la chose ...
    Je veux bien, également, n'utiliser que les fonctions que tu as indiquées...
    Je veux bien tout ce que tu veux ...
    Mais tes réponses précédentes (avant ton abandon) montraient que tu n'acceptais rien d'autre que TA manière, sans même envisager d'autres possibilités !
    Si tu as vraiment abandonné et si tu es prêt, à la fois, à tout, je te garantis que ton prof sera quelque peu surpris...
    Acceptes-tu (et clairement) ?
    Si oui, je m'y mets (et on va bien rigoler - tous, sauf ton prof...-)
    Si non : reste avec TES méthodes... et TON exercice ...
    Il est en règle très générale difficile d'être à la fois le demandeur et le maitre d'oeuvre ...
    Tu dis, donc...

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

Discussions similaires

  1. [Toutes versions] MACRO pour insérer une valeur venant d'un fichier fermé (nom fichier variable)
    Par Seb-1 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/01/2015, 15h48
  2. Réponses: 11
    Dernier message: 26/09/2012, 09h49
  3. faire un bouchon avec une constante ds un fichier HBM ?
    Par pcouas dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/07/2010, 12h01
  4. Inclusion de fichiers et portée d'une constante
    Par Djakisback dans le forum C
    Réponses: 14
    Dernier message: 13/05/2005, 13h19
  5. Partage d'une constante entre 2 fichiers en C
    Par elsargento dans le forum C
    Réponses: 6
    Dernier message: 29/09/2003, 22h17

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