XL 2016 [Résolu]Application match VBA

Etn

XLDnaute Occasionnel
Bonjour,

Je souhaiterais, en fonction du nombre en colonne A, placer une lettre en colonne B. Je pense qu'il faut utiliser le application.match mais je trouve pas la bonne méthode.

C'est bien plus clair avec l'exemple ci-joint.

Pourriez vous m'aider svp ?

Merci d'avance,
Etn
 

Pièces jointes

  • classeur etn.xlsx
    9.5 KB · Affichages: 6
  • classeur etn.xlsx
    9.5 KB · Affichages: 1

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour ETN,
On peut le faire aussi avec une fonction perso :
VB:
Function ETN(N, P)
    L = Application.ThisCell.Row
    C = Application.ThisCell.Column
    If Cells(L, C - 1) = N Then
        ETN = P
    Else
        ETN = ""
    End If
End Function
Ce qui évite un bouton.
 

Pièces jointes

  • classeur etn.xlsm
    20.2 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
ou en automatique sans fonction avec un Worksheet_Change :
Code:
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Target.Address = "$E$12" Or Target.Address = "$E$13" Then
        Range("B2:B100").ClearContents
        Ind = Application.Match(Range("E12"), Range("A:a"), 0)
        Cells(Ind, 2) = Range("E13")
    End If
End Sub
 

Pièces jointes

  • classeur etn V2.xlsm
    20.3 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonjour Etn, sylvanu,

Formule en B2 à tirer vers le bas =REPT(E$13;A2=E$12)

La fonction REPT prend bien moins d'octets en mémoire que la fonction SI.

A+
 

Pièces jointes

  • classeur etn(1).xlsx
    10.6 KB · Affichages: 3

job75

XLDnaute Barbatruc
Le VBA est inutile mais si l'on y tient on peut lui faire entrer la formule précédente en colonne B.

Voyez le fichier joint et cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False 'désactive les évènements
If FilterMode Then ShowAllData 'si la feuille est filtrée
With Range("A1", UsedRange).Offset(1).Columns(2)
    .Formula = "=REPT(E$13,A2=E$12)" 'à adapter
    .Value = .Value 'supprime les formules
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
Testée sur 100 000 lignes : la macro s'exécute chez moi en 0,45 seconde.
 

Pièces jointes

  • classeur etn VBA(1).xlsm
    16.5 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bien entendu il est plus logique d'utiliser Application.Match :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
If FilterMode Then ShowAllData 'si la feuille est filtrée
On Error Resume Next
With Range("A1", UsedRange).Offset(1)
    .Columns(2).ClearContents 'RAZ
    .Cells(Application.Match([E12], .Columns(1), 0), 2) = [E13] 'à adapter au besoin
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
Même sur 100 000 lignes l'exécution est immédiate.

Bonne nuit.
 

Discussions similaires

Réponses
17
Affichages
691
Réponses
4
Affichages
156