Croisement ligne/colonne

JohnBill

XLDnaute Occasionnel
Bonjour et bonne fête nationale à tout le forum.

Malgré une longue recherche sur les archives du forum, je n'ai pu trouver de solution à mon petit problème (Du moins pour les grands hommes et femmes que vous ètes).

Dans la première colonne d'un classeur, j' ai des noms et sur la première ligne, des dates.
Je recupère un nom et une date par un userform.
Je voudrais sélectionner la cellule à l'intersection du nom et de la date.
Quelqu'un pourrait il m'aider ?
Je joint un morceau du fichier.
Merci d'avance à tous.
 

Pièces jointes

  • Classeur1.xlsm
    15.2 KB · Affichages: 155
  • Classeur1.xlsm
    15.2 KB · Affichages: 136
  • Classeur1.xlsm
    15.2 KB · Affichages: 146

Gorfael

XLDnaute Barbatruc
Re : Croisement ligne/colonne

Salut JohnBill et le forum
Je ne crois pas que tu sois dans la bonne voie :
Code:
Intersect(Range(Nom), Range(Jour))
intersection entre la plage "Nom" et la plage "Jour" = rien dans ton cas.
Intersect, veut dire commun aux deux :
Code:
intersect(Range("A1:C2"), Range("B1:D3"))
Donnera B1:C2.

Pour ton cas, il faut procéder de la même manière qu'en formule.
Trouver tes deux cellules, puis faire intersection entre la colonne et la ligne
regardes dans l'aide
- Find
- cells(ligne, colonne)
Déclarer les variables, c'est bien, toutefois...
- Pourquoi n'en déclarer qu'une partie et pas toutes ?
- Déclarer les variables en variant laisse à Excel le choix de déterminer ce qu'il veut... et il n'est pas très fort en choix. Détermine le type d'info que doit recevoir ta variable.

Excel fait toujours ce que tu lui demandes et quelques (rares) fois ce que tu veux.

Nota : soit ton fichier est vérolé, soit mon excel l'est :mad: => donc, pas de code pour l'instant.
A+

Edit : C'est la conversion qui fait des siennes :cool:
Code:
Sub trouver_intersect()
Dim Isect As Range, Nom As Range, Jour As Range

With Sheets("Feuil1")
    Set Nom = .Columns(1).Find(.Range("B29"))
    Set Jour = .Rows(1).Find(.Range("B30"))
    If Not (Jour Is Nothing Or Nom Is Nothing) Then
        Set Isect = .Cells(Nom.Row, Jour.Column)
        If Not (Isect Is Nothing) Then MsgBox Isect.Address(0, 0)
    End If
End With
End Sub
- Trouver la cellule de valeur B29 dans la colonne 1 (A) et la mettre dans la variable Nom
- Trouver la cellule de valeur B30 dans la ligne 1 et la mettre dans la variable Jour
- Si on a trouvé les deux variables, alors
- Variable Isect est la cellule de même ligne que nom et de même colonne que Jour
- si on a trouvé Isect, donner son adresse en relatif dans une boite de dialogue.
With sert à définir un préfixe qu'Excel mettra à toute instruction commençant par un caractère de liaison (ici ".").
(.Range("B29")) est compris comme (Sheets("Feuil1").Range("B29"))
Je ne sélectionne ou n'active rien, et pourtant j'ai mon résultat !:p
 
Dernière édition:

mécano41

XLDnaute Accro
Re : Croisement ligne/colonne

Bonjour,

Voilà une solution ; il y a peut être plus simple.

Attention! deux cellules sont nommées dans la feuille

Cordialement
 

Pièces jointes

  • Copie de Classeur1.xlsm
    17.3 KB · Affichages: 227
  • Copie de Classeur1.xlsm
    17.3 KB · Affichages: 211
  • Copie de Classeur1.xlsm
    17.3 KB · Affichages: 199

Gorfael

XLDnaute Barbatruc
Re : Croisement ligne/colonne

Salut mécano41 et le forum
Je me permet de critiquer ton poste :p
Attention! deux cellules sont nommées dans la feuille : Tant qu'à nommer des plages, il me semble qu'il serait plus judicieux de nommer toute la plage... et de façon dynamique, non ?

Pour ton code :
Tu fais deux boucles : c'est une méthode, mais elle m'amène deux réflexions :
1 - une fois que tu as trouvé ton résultat (ici, ligne 9), pourquoi continuer la boucle de recherche (jusqu'à la ligne du dernier nom) ? Il est plus rapide de faire un Exit For, puisqu'on a notre résultat.

2 - que se passe-t-il si on ne trouve pas le nom, ou la date ? Tu te retrouves avec une cellule complétement inutile, et qui risque de te donner des résultats inadéquats, si ta macro a d'autres instructions basées sur cette cellule.

Comme tu vois, je critique férocement :p
Mais n'oublions pas que c'est en mouchant qu'on devient moucheron, et que j'essuie aussi des critiques, chaque fois qu'on peut améliorer mes codes.
Comme disait un de mes amis : "critique tant que tu veux... du moment que c'est de manière constructive !"
A+
 
Dernière édition:

mécano41

XLDnaute Accro
Re : Croisement ligne/colonne

Salut Gorfael,

Aucun problème pour ce qui est des critiques ... j'étais justement en train de regarder la solution que tu as proposée en EDIT pour m'en inspirer ultérieurement.

Sans parler du manque d'optimisation de ma solution, je pense que la tienne doit être beaucoup plus rapide si l'on a un grand nombre d'éléments ; de plus elle est beaucoup plus courte donc plus intéressante.

Merci

Cordialement
 

mécano41

XLDnaute Accro
Re : Croisement ligne/colonne

Voilà la version de Gorfael avec quelques adjonctions permettant :

- d'ajouter ou supprimer des lignes ou des colonnes dans la feuille, avant ou entre les diverses zones ou de déplacer les zones
- d'éviter de détecter des noms ou dates qui seraient avant ou après la zone "autorisée", dans la ligne des dates ou dans la colonne des noms, alors que ce nom ou cette date ne se trouvent pas dans la zone "autorisée (ex. valeurs en M2 ou en B30 non détectées)
- de changer le nom de feuille sans incidence

...en espérant n'avoir rien oublié ... :p


Cordialement
 

Pièces jointes

  • Copie de Classeur2.xlsm
    21.5 KB · Affichages: 188
  • Copie de Classeur2.xlsm
    21.5 KB · Affichages: 181
  • Copie de Classeur2.xlsm
    21.5 KB · Affichages: 218

JohnBill

XLDnaute Occasionnel
Re : Croisement ligne/colonne

Salut mécano41, Gorfael.
J'ai essayé les deux méthodes et elles fonctionnent bien toutes les deux.
J'adopterais donc la finale puisqu'elle semble la plus rapide.
Seule modification, je supprime l'apparition de la boite de dialogue car je désire coller une valeur dans la cellule ainsi trouvée et procèderais de même pour la plupart des noms de la liste.

Je vous remercie encore tous les deux et encore félicitations. Vous m'avez oté une belle épine du pied.
 

JohnBill

XLDnaute Occasionnel
Re : Croisement ligne/colonne

Un rebonjour à mécano41, Gorfael et tout le forum.
J'ai laissé passer pas mal de temps car depuis je bataille avec le format de ma date. En effet, Excel me la transformait en date américaine lorsque le jour était inférieur à treize. J'ai trouvé un semblant de solution en la transformant au format DD MMMM YYYY. Le mois étant inscrit en lettres elle n'était plus transformée.
Mais depuis, la macro que vous aviez conconctée ne fonctionne plus. Du moins pour la date car il me trouve bien le nom (J'ai controlé avec un pas à pas).
Malgré mes efforts, je ne trouve pas de solution. En auriez vous une ?
Je joint un morceau de mon fichier.
Merci d'avance comme toujours.
 

Pièces jointes

  • Intersect3.zip
    15.4 KB · Affichages: 115
G

Guest

Guest
Re : Croisement ligne/colonne

Bonjour,

C'est le problème avec les dates et .Find, il faut mettre le format exact d'affichage dans la recherche et autre paramètres:

Code:
    Set Nom = PlageNoms.Find(What:=.Range("NomCherche"), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False)
    Set Jour = PlageDates.Find(Format(.Range("DateCherchee").Value, "d mmmm yyyy"), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns, MatchCase:=False)

A+
 
G

Guest

Guest
Re : Croisement ligne/colonne

Bonjour,

Voici, pour t'affranchir du format affiché, une autre méthode de recherche de date qui emploie l'équivalent VBA de la fonction Equiv (avec ses propres contraintes et limites).Voir l'aide sur la fonction Equiv. En vba, elle exige que la date soit transformée en type Long (Clng).

Code:
With Sheets(Feuil15.Name)
    Dim idxJour As Long
    Set PlageNoms = Range(.Range("PremNm"), .Range("PremNm").End(xlDown))
    Set PlageDates = Range(.Range("PremDt"), .Range("PremDt").End(xlToRight))
    Set Nom = PlageNoms.Find(What:=.Range("NomCherche"), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False)
    idxJour = Application.Match(CLng(.Range("DateCherchee").Value), PlageDates, 0)
    If Not IsError(idxJour) And Not Nom Is Nothing Then
        Set Isect = .Cells(Nom.Row, PlageDates.Columns(idxJour).Column)
        If Not (Isect Is Nothing) Then Isect.Select
            MsgBox Isect.Address(0, 0)
 
    ElseIf IsError(idxJour) And Nom Is Nothing Then
        MsgBox "Pas de correspondance du nom ni de la date"
    ElseIf Nom Is Nothing Then
        MsgBox "Pas de correspondance du nom"
    ElseIf IsError(idxJour) Then
        MsgBox "Pas de correspondance de la date"
    End If
End With

A+

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 196
Messages
2 086 098
Membres
103 116
dernier inscrit
kutobi87