Changer de Feuilles avec une commande sur autre feuille

S'agit-il d'un tableau Excel ?

Selon l'Aide, les paramètres de tri sont enregistrés avec le classeur pour un Tableau, pas pour une plage ordinaire....

Bonjour et merci de la réponse,

C'est un tableau dans une feuille de classeur Excel

Je joins le fichier avec 2 onglets et les ' sur les 4 premiers codes

1 pour le tri

1 pour le tableau d'origine

20vba-excel-tri2.xlsm (21.31 Ko)

Bonjour,

Je suis toujours en mode initiation pour VBA.

J'ai trouvé un exemple avec If :

If Workbooks(I).Name = Wb$ Then TestPresent = 1: Exit For

Je ne comprends pas la fin " : Exit For " et je ne savais pas que c'était possible.

Ensuite j'ai un problème avec des valeurs Publics.

Quand je travaille avec le fichier ouvert je n'ai pas de problème.

Quand je ferme et ouvre mon fichier, mes variables se sont mises à zéro pour les nombres et à blanc pour les textes.

Existe-t-il un code pour garder les valeurs en mémoires pour utilisation à la réouverture du fichier

Où as-tu pêché cette ânerie : ...= Wb$... ?

Pour le reste en prenant les choses au début, cela répondrait à tes questions...

Re, et merci de la réponse

Sur un exemple du forum :

Sub Classeur_Ouvert()

Dim Wb$, I%, TestPresent%

Wb$ = "Classeur1.xlsx" : TestPresent = 0 'boucle pour trouver le bon classeur nommé en variable Wb$

For I = 1 To Workbooks.Count 'si Wb$ est trouvé alors on sort en donnant validant TestPresent à 1

If Workbooks(I).Name = Wb$ Then TestPresent = 1: Exit For

Next 'on active le classeur trouvé.

If TestPresent = 1 Then 'présent

MsgBox Wb$ & " est présent !"

Workbooks(Wb$).Activate

Else 'non présent, donc on load le fichier

MsgBox Wb$ & " n'est présent... alors on l'ouvre"

Workbooks.Open Filename:="C:\xxx\xxxxxx\xxxxx\" & Wb$

End If

End Sub

Pour les variables de module ça va, mais pour le classeur, j'ai un problème avec les variables textes

Bon ! Quelques petites mises au point !

Dim Wb$ déclare une variable Wb de type String, $ est le caractère de déclaration de type signifiant : As String.

Par la suite il convient donc d'utiliser Wb (et non Wb$) dans le reste du code...

TestPresent = 0 est inutile. La variable a été déclarée comme variable de type Integer (% = As integer). Sans initialisation la valeur qu'elle renverra est 0. Il est donc inutile de lui affecter cette valeur qu'elle a déjà !

La sortie de la boucle par Exit For est normale une fois qu'on a trouvé, inutile de continuer pour rien !

De plus, cela permettrait de se passer de la variable TestPresent, car il suffit alors de tester la variable i qui si l'on n'a pas trouvé aura la valeur Workbooks.Count+1 à l'arrêt de la boucle :

If i > Workbooks.Count Then
    'On n'a pas trouvé le classeur, il faut l'ouvrir
Else
    'On a trouvé, on l'active !
End If

Il n'y a pas de variable de niveau Module dans le code que tu cites.

Re et merci,

Ok pour le code de test.

Pour les variables publics ou modules c'est dans un exemple que j'essaie.

J'ai une macro dans un fichier "Test_Fichier_1.xlsm" qui appelle une Sub Affichage_XXX() dans le module 1 :

La variable prends le nom d'un fichier et appelle une autre Public Sub Classeur_Ouvert() dans le module 2 pour tester dans Sub Affichage_XXX() si le fichier "Test_Fichier_2.xlsm" est ouvert.

Les 2 fichiers sont joints sauf que dans le chemin pour ouvrir le fichier j'ai mis des "xxxxx"

12test-fichier-1.xlsm (18.51 Ko)
Dim Wb As String

Sub Affichage_XXX()
    Wb = "Test_Fichier_2.xlsx"
    Classeur_Ouvert Wb
End Sub

Sub Classeur_Ouvert(wbk As String)
    Dim i%
    For i = 1 To Workbooks.Count
        If Workbooks(i).Name = Wb Then Exit For
    Next
    If i <= worksbooks.Count Then
        MsgBox wbk & " Classeur ouvert"
        Workbooks(wbk).Activate
    Else
        MsgBox wbk & " Classeur non ouvert... alors on l'ouvre"
        Workbooks.Open "C:\xxxx\xxxxx\xxxxx\" & wbk
    End If
End Sub

Ceci est un peu mieux ! Sauf qu'une variable module n'est nullement justifiée...

[Inutile de s'escrimer à mettre des Public Sub, une Sub est toujours publique quand elle n'est pas privée, exactement l'inverse des variables !]

Mais ceci est également efficace :

Sub Affichage_XXY()
    Ouvrir_Classeur "Test_Fichier_2.xlsx"
End Sub

Sub Ouvrir_Classeur(wbk As String)
    On Error GoTo ouvrir
    Workbooks(wbk).Activate
    'autres instructions
    Exit Sub
ouvrir:
    Workbooks.Open "C:\xxxx\xxxxx\xxxxx\" & wbk
    Resume Next
End Sub

Cordialement

Re, Merci

Par contre, je ne comprends pas le Wbk dans Classeur_Ouvert(wbk As String)

et Wb dans Classeur_Ouvert Wb

Je ne savais pas que l'on pouvait écrire entre les parenthèses d'une Sub

Re,

Dans la 1ière solution j'ai un beug :

"If i <= worksbooks.Count Then"

Dans la 2ième solution, je souhaiterais pour avoir une variable prenant différent nom de classeur

Les parenthèses sont destinées à accueillir les arguments passés à la Sub. Quand il y en a, ils doivent être passés lors de l'appel (sauf s'ils sont optionnels, on peut s'en dispenser)

J'ai bien dit qu'en commençant au début tu n'obligerais pas à expliquer des rudiments que tu es censé savoir pour écrire de telles lignes de commande...

wbk est une variable utilisée comme argument de la procédure.

Classeur_Ouvert Wb est l'appel de la proc. avec l'argument obligatoire qui doit lui être passé.

Quant à worksbooks ! tu rectifies la faute de frappe et tu auras Workbooks qui ne déclenchera pas d'erreur !

Re et Merci,

Je n'avais pas vu pour Workbooks pourtant j'ai regardé plusieurs fois

Rechercher des sujets similaires à "changer feuilles commande feuille"