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 :

Traduction Excel / VBA inopérante [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut Traduction Excel / VBA inopérante
    Bonjour,

    Je suis toujours débutant et je me heurte à un souci. En voici la description:

    J'utilise avec succès en Excel une formule qui me permet de trouver l'emplacement du dernier point dans un nom de fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CHERCHE("µ";SUBSTITUE(A3;".";"µ";NBCAR(A3)-NBCAR(SUBSTITUE(A3;".";""))))
    Je l'ai fait traduire par 2 traducteurs (VBA et http://fr.excel-translator.de) ils sont d'accord et cela donne ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Search("µ", Substitute(A3, ".", "µ", Len(A3) - Len(Substitute(A3, ".", ""))))
    Je l'ai aménagé pour les besoins du programme en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nPoint = Search("µ", Substitute(A3, ".", "µ", Len(A3) - Len(Substitute(A3, ".", ""))))
    Mais lorsque je lance VBA, il met le second "Substitute" en surbrillance et affiche ce message d'erreur :
    Erreur de compilation: Sub ou Fonction non définie
    J'ai l'impression que le seul obstacle est mon inculture, mais je ne trouve pas la solution. Quelqu'un peut m'aider ?

    Merci d'avance.

    Henri

  2. #2
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    Salut,
    simplement par ce que subtitute ne doit pas être une méthode VBA.

    utilise la méthode StrReverse qui va retourner la chaine, par exemple si tu as azerty.exe, il va te donner exe.ytreza
    A partir de là, tu utilise la méthode InStr pour trouver le premier point de ta chaine, et tu finis par une soustraction de la longueur de la chaine originale - la position + 1 pour obtenir l'index du dernier caractere "."

    Ce qui peut donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Len("maChaine.txt") - InStr(StrReverse("maChaine.txt"), ".") + 1

  3. #3
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Le substitute en VBA est "replace"

  4. #4
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    également, je viens de remarquer, mais ton convertisseur a convertie ta formule francaise en formule anglaise.
    Le subtitute n'existe pas en vba, le search non plus.

  5. #5
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    Pour ma part, dans vba, "replace" traduit la meme chose que substitute (en anglais) ou substitue (en francais) dans excel.

    si je fais le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub testtxt()
    Dim vartxt As String
     
    vartxt = "asd"
    vartxt = Replace(vartxt, "s", "w")
     
    Debug.Print vartxt
     
    End Sub
    cela transforme bien "asd" en "awd"

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut
    Génial ! Ça fonctionne très bien !
    Tous mes remerciements pour votre aide.
    Donc, si je comprends bien toutes les fonctions disponibles en Excel ne le sont pas en VBA ?

    Une sous-question:
    Quelle est l'instruction qui permet de faire appel depuis une macro à une autre macro ?
    Exemple, la macro me permet de savoir si je suis dans un fichier XLS ou XLSX et donc de varier la hauteur de mes colonnes en fonction des cas.
    C'est typiquement le genre de fonctionnalité qui se réutilise.
    Plutôt que de la copier/coller à chaque fois, comment fais-je pour l'exécuter, tout en modifiant la variable cCol, depuis la macro en cours ?
    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
     
    Sub LongueurColonne()
    Dim cNomFichier As String
    Dim cCol As String
    Dim cFond As String
    Dim nPoint As Long
     
    cNomFichier = ActiveWorkbook.Name
    nPoint = Len(cNomFichier) - InStr(StrReverse(cNomFichier), ".") + 1
     
    cCol = "C"
    If Len(cNomFichier) - Point = 4 Then
    cFond = cCol & "1048576"
    Else
    cFond = cCol & "16384"
    End If
     
    End Sub

  7. #7
    Membre expérimenté Avatar de vanhoa
    Homme Profil pro
    Analyste Financier
    Inscrit en
    Octobre 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Analyste Financier
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 117
    Par défaut
    non pas toutes, il n'y a pas longtemps j'ai cherche un equivalent de indirect, sans succes :-(
    Mais pour tes fonctions, CHERCHE c'est worksheetfunction.search et SUBSTITUE c'est replace.
    Pour les utiliser, utilise l'aide excel qui te dit quels sont les arguments. cela traduit la meme chose que ce que tu cherchais.

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub testtxt()
    Dim vartxt As String
     
    vartxt = "asd"
    vartxt = Replace(vartxt, "s", "w")
     
    msgbox vartxt     'ma variable vartxt est bien devenue "awd"
    msgbox WorksheetFunction.Search("w", vartxt, 1)  'cela me donne 2, soit l'emplacement du "w" dans "awd"
     
    End Sub

    Pour ta sous question, tu peux directement inscrire le nom de ta procedure (donc de ton autre macro) dans la premiere macro.

    Sinon d'apres ton exemple, tu veux simplement pouvoir modifier cCol sans devoir reecrire la macro n fois si tu a n valeurs differentes de cCol c'est bien ca?
    si c'est ca, tu peux mettre en debut de ta procedure l'instruction "inputbox" qui va te demander d'ecrire une valeur.
    exemple essaie:

    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
    Sub LongueurColonne()
    Dim cNomFichier As String
    Dim cCol As String
    Dim cFond As String
    Dim nPoint As Long
     
    inputbox("valeur cCol","cCol = ",2)
     
    cNomFichier = ActiveWorkbook.Name
    nPoint = Len(cNomFichier) - InStr(StrReverse(cNomFichier), ".") + 1
     
    cCol = "C"
    If Len(cNomFichier) - Point = 4 Then
    cFond = cCol & "1048576"
    Else
    cFond = cCol & "16384"
    End If
     
    End Sub

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut oui, mais...
    Merci pour la réponse.

    Pour ce qui concerne la sous-question, si j'ai bien compris, si le nom de la macro récurrente est LongueurColonnes(), il suffit de taper LongueurColonnes() dans ma macro d'origine pour que LongueurColonnes() s'exécute et qu'ensuite la suite de la procédure de la macro d'origine continue son exécution ?

    Pour ce qui est de la colonne, c'est plus compliqué.
    Je souhaite créer une macro réutilisable dans toutes les petites macro que je développe.
    Entre autres, si je veux définir un nom, il me faut connaître la plage de cellules concernées. Le seul moyen que j'ai trouvé pour être sûr de connaître la dernière cellule utilisée de la colonne, est de descendre à la dernière ligne de la colonne et de remonter. En code, ça donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Range("C1", Range(cFond).End(xlUp)).Select
        Names.Add Name:=Range("$C$1"), RefersTo:="='" & ActiveSheet.Name & "'!" & Selection.Address
    Ça fonctionne très bien, pas de souci.
    Mais mon cFond peut tantôt être valorisé à 16384 ou à 1048576 en fonction du type de fichier dans lequel je suis.
    Raison d'être de la petite macro ci-dessous.

    Par ailleurs, cette procédure est susceptible d'être reprise plusieurs fois dans la même macro, il me faut donc pouvoir changer de colonne (d'où ma question de tout à l'heure).
    La solution de l'inputbox est intéressante, mais elle ne convient pas dans ce cas-ci où tout se passe en automatique, sans intervention de l'utilisateur.

    Je dois donc valoriser ma variable dans ma macro d'origine et l'envoyer en paramètres vers LongueurColonnes().

    Comprends-tu ma douleur ? As-tu une solution ?

    Encore merci pour ton aide...

    Henri

  9. #9
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793
    Par défaut
    Effectivement, quand on traite des fichiers excel, on est souvent confronté a trouver la derniere ligne d'une colonne.

    Dans ce cas, je te propose de créer une function qui sera appelé d'ou tu veux et qui prends deux paramètres : la feuille sur laquelle il faut regarder et la colonne, ensuite tu créé simplement une function a part dans ton module comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function derniereLigne(ByVal pWS As Worksheet, pColumn As Integer) as integer
        derniereLigne = pWS.Cells(65534, pColumn).End(xlUp).Row
    End Function
    dans ta méthode main tu peux l'appeler comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public sub laMethodePrincipale()
     
       MsgBox "La dernière ligne utilisée de la feuille 1 en colonne 1 est : " & derniereLigne(Sheets(1), 1), vbOKOnly
     
    end sub
    Si tu veux être plus générique, tu peux carrement renvoyer la cellule, avec toute les propriete que ca implique (address, value, text, size etc.etc.)

    Au quel cas il faut adapter le type de retour de la function derniereLigne et son usage dans la méthode main.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Salut,

    Citation Envoyé par Henri1830 Voir le message
    ...
    Je l'ai aménagé pour les besoins du programme en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nPoint = Search("µ", Substitute(A3, ".", "µ", Len(A3) - Len(Substitute(A3, ".", ""))))
    Mais lorsque je lance VBA, il met le second "Substitute" en surbrillance et affiche ce message d'erreur :


    J'ai l'impression que le seul obstacle est mon inculture, mais je ne trouve pas la solution. Quelqu'un peut m'aider ?
    ...
    Citation Envoyé par Henri1830 Voir le message
    Donc, si je comprends bien toutes les fonctions disponibles en Excel ne le sont pas en VBA ?
    Essai comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub EvalFunction()
        nPoint = [= Search("µ", Substitute(A3, ".", "µ", Len(A3) - Len(Substitute(A3, ".", ""))))]
    End Sub
    Cela fonctionne, par contre, je n'ai pas vérifié ce que fait la fonction elle-même. Elle fait ici la même chose que ta 1ère fonction Excel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =CHERCHE("µ";SUBSTITUE(A3;".";"µ";NBCAR(A3)-NBCAR(SUBSTITUE(A3;".";""))))

  11. #11
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 187
    Par défaut @ Nouveau2
    Merci pour la variante, c'est très intéressant.
    A la manière dont elle est présentée, cela peut servir pour tous les cas du genre où VBA n'a pas d'équivalent, je me trompe ?

    Bien à vous

    Henri

  12. #12
    Membre très actif Avatar de Nako_lito
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2008
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 793

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

Discussions similaires

  1. [XL-2007] Traduction code excel vba
    Par bird007 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/06/2010, 19h56
  2. Traduction en VBA de formule Excel
    Par m93.fred dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/12/2009, 11h35
  3. EXcel VBA analyse de sharpe
    Par vanima dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/02/2005, 13h07
  4. [Excel - VBA] Problème de suppression de lignes...
    Par beholder2 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/01/2005, 17h27

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