Probleme avec Function Match / Sheet Location

Résolu/Fermé
Van Hoa - 18 déc. 2013 à 05:40
 Van Hoa - 19 déc. 2013 à 09:05
Bonjour,

Je vous explique mon probleme.
Sur la ligne 1, j'ai le nom des mois (Jan, Fev, Mar.... Dec) qui sont mis au hasard les un apres les autres. Sur la ligne 2 j'ai disons 4 prenoms (Jean, Paul, Martin, Sophie) qui alternent successivement, et au hasard.

J'aurais donc par exemple (je ne connais pas sur combien de colonne s'etend ma ligne!)
Ligne 1: Mar - Dec - Fev - Sep - Apr - Jan - Fev - Apr - Jun - Jun - Nov
Ligne 2: Paul - Jean - Soph - Mart - Paul - Jean - Jean - Paul - Mart - Soph - Mart

J'ai cree un Userform qui me donne 2 listes deroulantes, la premiere choisi le mois et la deuxieme le prenom. Quand je valide, cela cree 2 variables notees "var1" et "var2".

A la suite je continue mon code, et mon but est de trouver quel est le numero de ma colonne pour laquelle j'ai en meme temps var1 et var2.
exemple pour var1 j'ai choisi "Fev" et var2 "Jean"

J'ai pense passer par une boucle Do Loop avec la fonction Match:


'mon code quand j'active le formulaire

Private Sub CommandButton1_Click()

Dim var1 As String, var2 As String
var1 = ComboBox1.Value
var2 = ComboBox2.Value

Unload Me

Dim xa As Integer, xb As Integer

xa = 1
xb = 0

Do

xb = xb + 1
xa = WorksheetFunction.Match(var1, Worksheets("Sheet3").Range(Cells(1, xb), Cells(2, 1000)), 0)

Loop While Cells(2, xa).Value = var2

End Sub



1er probleme:

Si j'ai var1 = Fev et var2 = Jean, j'aimerais pouvoir recuperer la valeur de xa = 7
Car l'association Fev et Jean est en 7eme position.
Malheureusement, j'obitent toujours 3, comme si ca faisait seulement ma fonction Match, sans prendre en compte ma boucle.

2eme probleme:

Dans le code, on remarque que mes 2 lignes contenant les mois et prenoms sont dans le Sheet3. Mais si ma cellule active est dans un autre Sheet, par exemple Sheet1, j'ai une erreur: Run-time error '1004': Application-defined or object-defined error.
J'imagine qu'il faut ecrire quelque chose dans mon code, juste apres Unload Me, pour pouvoir acceder a mon Sheet3 non? Mais je ne sais pas quoi.


Voila, merci beaucoup pour votre aide!!

Van Hoa

3 réponses

melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
Modifié par melanie1324 le 18/12/2013 à 09:55
Bonjour,

une solution :

Private Sub CommandButton1_Click()

    Dim var1 As String, var2 As String
        var1 = ComboBox1.Value
        var2 = ComboBox2.Value

    Unload Me

    Dim xa As Integer, xb As Integer

        xa = 0
        xb = 1

        Do while xa <> 0

      if sheets("Sheets 3").cells(1,xb) =var1 and sheets("Sheets 3").cells(2,xb) = var2 then

         xa = xb
      end if
xb=xb+1
        Loop 
End Sub

1
Merci pour ta reponse Melanie.

Cependant, dans le code, ne voudrais-tu pas dire:
Do While xa = 0 ?
Car sinon, si je mets <> la boucle ne s'execute pas non?

Saurais-tu egalement pourquoi mon code ne marche pas? J'aimerais vraiment comprendre ce qui cloche :-(

Et aussi, concernant mon deuxieme probleme, sais-tu pourquoi si je suis dans un Sheet different du Sheet3, l'erreur suivante s'affiche?
Run-time error '1004': Application-defined or object-defined error

Merci beaucoup pour ton aide Melanie!

Van Hoa
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
Modifié par melanie1324 le 18/12/2013 à 10:31
Bonjour,

Pour mon code, tu as totalement raison
c'est bien do while xa = 0

Par contre, je ne connais pasla fonction Match donc peux pas dire.

Pour palier au second, tu peux faire comme ca :
sheets("Sheets 3").select
xa = WorksheetFunction.Match(var1, Worksheets("Sheet3").Range(Cells(1, xb), Cells(2, 1000)), 0)

Mon code te permet de contourner le pb.
0
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
Modifié par melanie1324 le 18/12/2013 à 10:49
Re,

j'ai trouvé le pb avec ton code, c'était le même pb qu'avec avec le mien :


'mon code quand j'active le formulaire

Private Sub CommandButton1_Click()

    Dim var1 As String, var2 As String
        var1 = ComboBox1.Value
        var2 = ComboBox2.Value

    Unload Me

    Dim xa As Integer, xb As Integer

        xa = 1
        xb = 0

        Do

            xb = xb + 1
            xa = WorksheetFunction.Match(var1, Worksheets("Sheet3").Range(Cells(1, xb), Cells(1, 1000)), 0) 'la fonction Match ne peut fonctionner que sur une ligne ou une colonne

        Loop While Cells(2, xa).Value <> var2 'tu avais mis de continuer tant que la cellule est égale. Or, toi, tu veux continuer la boucle tant que c'est différent.

End Sub
0
aaaah ok lol
Comme d'habitude je n'utilisais pas Do Loop mais plutot les autres types de boucles, la je pensais que la boucle Do - Loop While ca traduisait: Faire la boucle et s'arreter quand + condition, donc en gros je pensais que le Loop While c'etait "s'arreter quand" alors que c'est "continuer quand" lol! J'avais regarder dans le dico pour traduire Loop et s'etait marque "boucler, fermer" d'ou mon erreur de conprehension!

En tout cas merci beaucoup car je pense que je serais reste longtemps dans mon erreur sans ton aide!
0
Aussi, est-ce que tu sais pourquoi j'ai une erreur qui s'affiche si ma cellule active est dans un autre Sheet que le Sheet3?
Est ce que ca vient du fait que je suis dans un Userform?
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
18 déc. 2013 à 11:00
Bonjour

mon but est de trouver quel est le numero de ma colonne pour laquelle j'ai en meme temps var1 et var2.
Ici on affiche la lettre de la colonne.

Si c'est le numéro, il faut modifier la ligne 15 comme ceci

MsgBox i


Private Sub CommandButton1_Click()
Dim var1 As String, var2 As String
Dim dercol As Long
Dim i As Long

    var1 = ComboBox1.Value
    var2 = ComboBox2.Value
    dercol = Worksheets("Sheet3").Range("A1").End(xlToRight).Column

    Unload Me

    For i = 1 To dercol
        If Worksheets("Sheet3").Cells(1, i).Value = var1 And Worksheets("Sheet3").Cells(2, i).Value = var2 Then
       '--- Affiche la colonne 
            MsgBox IIf(i > 26, Chr(64 + i \ 26) & Chr(64 + i Mod 26), Chr(64 + i))
        End If
    Next i
    
End Sub

1
Merci beaucoup pour ton aide Polux31!

Je ne connais pas encore la fonction Chr, mais je vais me pencher dessus, et ca me fera une nouvelle chose a connaitre!

Pour ton code, sur ma ligne, en realite, elle n'est pas continue, il y a des cellules vides parfois donc avec le End(xlToRight) ca ne prendra pas toutes mes cellules contenant des info.

Melanie a souleve le probleme dans mon code, maintenant ca marche.

Par contre, concernant mon deuxieme probleme, on remarque que mes 2 lignes contenant les mois et prenoms sont dans le Sheet3. Mais si ma cellule active est dans un autre Sheet, par exemple Sheet1, j'ai une erreur: Run-time error '1004': Application-defined or object-defined error.

Sais-tu pourquoi?

Merci encore pour ton aide!

Van Hoa
0
Est ce que ca vient du fait que je suis dans un Userform?
0
en fait non, mon code ne marche toujours pas, malgre la remarque de Melanie :(
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
19 déc. 2013 à 03:37
Remplace :

dercol = Worksheets("Sheet3").Range("A1").End(xlToRight).Column


Par

dercol = Worksheets("Sheet3").Range("A" & Columns.Count).End(xlToLeft).Column
0
Merci,

Mais ca me donne la lettre, et j'aurais besoin de recuperer le numero de la colonne.
Le code de Melanie marche finalement. Mais je me demande vraiment pourquoi mon code avec la fonction Match n'a pas marche :-(

et encore, pour mon 2eme probleme, on remarque que mes 2 lignes contenant les mois et prenoms sont dans le Sheet3. Mais si ma cellule active est dans un autre Sheet, par exemple Sheet1, j'ai une erreur: Run-time error '1004': Application-defined or object-defined error.

Sais-tu pourquoi? Est-ce que ca vient du fait d'etre dans un Userform?

Merci encore pour ton aide!

Van Hoa
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
19 déc. 2013 à 08:45
Salut,

Pour la seconde question, la première étant résolue, il suffit de placer l'objet Worksheet (Sheet3) dans un bloc With-End With, et d'y référencer les objets Range qui lui appartiennent.

Comme ceci : [j'ai repris une partie du code de Mélanie]

Do
    xb = xb + 1
    With Worksheets("Sheet3")
        xa = WorksheetFunction.Match(var1, .Range(Cells(1, xb), Cells(1, 1000)), 0)
    End With
Loop While Cells(2, xa).Value <> var2 


A noter : Le point devant Range(Cells blabla...) permet de "rattacher" l'objet Range à l'objet WorkSheets("Sheet3") référencé dans le bloc With.
1
Ok! Parfait!

Merci a tous pour votre aide!
0