Fonction personnelle - Utilisation d'un range - MAJ auto des cellules

Bonjour à tous,

J'ai le problème suivant.

Je définis une fonction personnelle qui a pour mission de mettre un libellé dans la bonne langue.

Dans une des feuilles de mon classeur, j'ai un tableau de traduction. La première colonne est un code, les suivantes le libellé de ce code dans différentes langues.

J'utilise cette fonction personnelle dans différentes feuilles.

Dans cette fonction, je fais:

Set data_range = Sheets("Traduction").Range(Cells(3, 2), Cells(2000, 10))

Si j'appelle ma fonction dans la feuille Traduction, ça fonctionne. Si je l'appelle depuis une autre feuille, ça ne fonctionne pas. Le débugger s'arrête sur l'instruction citée plus haut.

Auriez-vous un avis sur la question?

Je vous remercie.

Bonjour,

A toutes fins utiles !...

Cdlt.

Bonjour Jean-Eric,

Je suis désolé, mais je n'ai pas pu répondre plus tôt. Je te remercie pour ton envoi. Néanmoins, je ne suis pas certain de tout comprendre à celui-ci car il dépasse mon niveau. S'agit-il bien d'utiliser Google Translate pour traduire? Si tel est le cas, ce n'est pas ce que je cherche.

Je souhaite utiliser mon dictionnaire. Celui-ci est dans un onglet. Les éléments à traduire sont dans d'autres onglets. Mon problème est que je n'arrive pas à traduire dès que l'élément à traduire est dans un autre onglet. Je ne réussis à traduire que ce qui est dans dans le même onglet que le dictionnaire.

Bonjour Schnorzul, Jean-Eric,

Au lieu de : Set data_range = Sheets("Traduction").Range(Cells(3, 2), Cells(2000, 10))

je te propose : Set data_range = [Traduction!B3:J2000]

C'est juste une façon d'écrire plus courte ; pour le reste, ça ne résoudra pas ton problème, et tu n'as pas donné assez d'infos pour aller plus loin ; note que si tu as une boucle pour parcourir toutes les lignes, avec un Range qui référence la colonne A, tu peux utiliser un .Offset(, k) pour prendre la valeur k colonnes à droite ; donc : k = 1 ➯ langue 1 ; k = 2 ➯ langue 2 ; k = 3 ➯ langue 3 ; etc...

dhany

Bonjour,

Voici un fonction perso :

Function Traduction(Code As Long, Pays As String) As String

    Dim Plage As Range
    Dim Cel As Range
    Dim Lig As Long

    'défini la plage sur toute la feuille à partir de A1
    'les codes étant en colonne A et les code pays en ligne 1
    With Sheets("Traduction")

        Set Plage = .Range(.Cells(1, 1), _
                    .Cells(.Cells.Find("*", .[A1], -4123, , _
                    1, 2).Row, .Cells.Find("*", .[A1], -4123, , _
                    2, 2).Column))

        Set Cel = Plage.Columns(1).Find(Code, , xlValues, xlWhole)

        If Cel Is Nothing Then Traduction = "#VALEUR!": Exit Function

        Lig = Cel.Row

        Set Cel = Plage.Rows(1).Find(Pays, , xlValues, xlWhole)

        If Cel Is Nothing Then Traduction = "#VALEUR!": Exit Function

        Traduction = .Cells(Lig, Cel.Column).Value

    End With

End Function

Elle fonctionne de la manière suivante :

Le code est recherché en colonne A et le code Pays est recherché en ligne 1 puis, si trouvé (les deux bien sûr) la fonction retourne la valeur à l'intersection !

Je pense qu'il est préférable d'utiliser les codes pays A = Autriche, B = Belgique, F = France, GB = Grande Bretagne, etc... ça serta plus parlant et de cette façon, tu n'as pas à t'inquiété pour l'ordre des colonnes dans la feuille "Traduction"

A adapter à tes besoins !

N'ayant pas réussi à m'en sortir avec les range, y compris en utilisant la syntaxe de Theze (With Sheets ...), mon code est devenu celui-ci.

' This function aims to translate management report's labels. Data nested in management report are imported in the right language.
Public Function translate_label(label_code As String, language As String) As String

Dim label_line As Long
Dim language_column As Long

label_line = Application.Match(label_code, Sheets("Traduction_Eric").Range("B3:B2000"), 0)
language_column = Application.Match(language, Sheets("Traduction_Eric").Range("B3:J3"), 0)

translate_label = Application.Index(Sheets("Traduction_Eric").Range("B3:J2000"), label_line, language_column)

End Function

J'ai une autre question. Etant donné le code ci-dessus, si je modifie une traduction dans la feuille Traduction_Eric, cela ne met pas à jour les cellules dans lesquelles la fonction translate_label est appelée. Sauf si la fonction est appelée dans la feuille Traduction_Eric.

Comment forcer le recalcul des cellules utilisant la fonction translate_label dans les autres feuilles que Traduction_Eric?

Bonjour,

En mettant "Application.Volatile" au début de ta fonction

Bonjour Theze,

C'est ce que j'avais fait après avoir cherché sur le net. Mais ça ne fonctionnait pas. D'où mon post. En lisant ta réponse, j'ai insisté. Et ça fonctionne, mais, malheureusement, de manière peu satisfaisante. Je m'explique.

Si je modifie un libellé dans la feuille Traduction_Eric, il ne se passe rien dans la cellule d'une autre feuille qui appelle la fonction personnelle translate_label sur le libellé en question (celui modifié). Je vais alors dans cette cellule et la valide. Elle est impactée de la modification. Maintenant, chaque fois que je modifie ce libellé dans la feuille Traduction_Eric, la cellule est bien mise à jour.

On dirait donc qu'il faut avoir 'réveillé' la cellule une fois, en la validant, pour qu'elle soit à l'écoute des modifications dans la feuille Traduction_Eric. Ca ne me satisfait donc pas trop, mais j'ai peut-être loupé quelque chose.

Mon code:

' This function aims to translate management report's labels. Data nested in management report are imported in the right language.
Public Function translate_label(label_code As String, language As String) As String

Dim label_line As Long
Dim language_column As Long

Application.Volatile

label_line = Application.Match(label_code, Sheets("Traduction_Eric").Range("B3:B2000"), 0)
language_column = Application.Match(language, Sheets("Traduction_Eric").Range("B3:J3"), 0)

translate_label = Application.Index(Sheets("Traduction_Eric").Range("B3:J2000"), label_line, language_column)

End Function

En fait, j'ai l'impression qu'Excel n'est pas rétroactif. En gros, il ne stocke l'information lui indiquant qu'il doit recalculer la fonction que si la fonction était volatile au moment où on a affecté cette fonction dans une cellule.

Si la fonction était déjà affectée à la cellule quand on rend la fonction volatile, rien ne se passe. Il faut éditer le contenu de la cellule et le revalider.

Rechercher des sujets similaires à "fonction personnelle utilisation range maj auto"