Microsoft 365 Occurence d'une valeur

aba2s

XLDnaute Junior
Bonjour,

Je galère sur excel. je souhaite obtenir une suite croissante de 4 chiffres (colonne C dans le fichier en PJ).

J'ai créer une fonction custom test() mais je n'arrive à avoir ce que je cherche.

Pourriez vous svp m'aider?

Je vous remercie d'avance


VB:
Public Function test()

Dim i As Long
Dim FeInfo As Worksheet: Set FeInfo = Worksheets("Feuil1")
                             FeInfo.Activate
                            
Dim valeur As Range
Dim plage As Range: Set plage = FeInfo.Range("B1:B" & Cells(Rows.Count, "B").End(xlUp).Row)

For i = 1 To FeInfo.Range("B" & Rows.Count).End(xlUp).Row
s = 0
Set Cel = Columns("B").Find(what:=Range("B" & i), LookIn:=xlValues)

    If Not Cel Is Nothing Then
      Depart = Cel.Address
      
      Do
        s = s + 1
        test = s
        Set Cel = Columns("B").FindNext(Cel)
      Loop While Not Cel Is Nothing And Depart <> Cel.Address
      
    End If

Next i

End Function
 

Pièces jointes

  • Data.xlsm
    27.7 KB · Affichages: 27

Dranreb

XLDnaute Barbatruc
Bonsoir.
Essayez comme ça :
VB:
Public Sub Test()
   With Intersect(Feuil3.Columns("C"), Feuil3.UsedRange)
      .Rows(1).Value = 1
      .Rows(2).Resize(.Rows.Count - 1).FormulaR1C1 = "=IF(RC2=R[-1]C2,R[-1]C+1,1)"
      .Value = .Value
      .NumberFormat = "0000"
      End With
   End Sub
 

Dranreb

XLDnaute Barbatruc
Comme ça peut être ?
VB:
Public Sub Test()
   Feuil3.Columns("C").ClearContents
   With Intersect(Feuil3.Columns("D"), Feuil3.UsedRange.EntireRow)
      .Rows(1).Value = 1
      .Rows(2).Resize(.Rows.Count - 1).FormulaR1C1 = "=IF(RC2=R[-1]C2,R[-1]C+1,1)"
      .Value = .Value
      .NumberFormat = "0000"
      End With
   End Sub
 
Dernière édition:

aba2s

XLDnaute Junior
Bonjour @Dranreb , toutes les deux maco marchent mais quand je change Feuil3 en Feuil1 (qui correspond ici la feuille qui contiennent mes données) rien ne marchent.

Pourquoi tu as mis Feuil3?
Autre question, comment rendre cette macro en fonction excel accessible par une affectation (=).

Merci
 

Dranreb

XLDnaute Barbatruc
Parce que c'était le nom de l'objet Worksheet qui représentait la feuille Excel nommée "Feuil1".
Pour une fonction à utiliser dans des formules il convient qu'elle renvoie une valeur, et que ce qui contribue à l'obtenir lui soit transmis en arguments. Excel ne sera pas fondé à la réévaluer si elle s'appuie sur des éléments qui changent mais ne lui sont pas transmis.
 

Dranreb

XLDnaute Barbatruc
Un exemple :
VB:
Public Function Test(ByVal ArgS As Range)
   Test = WorksheetFunction.CountIf(ArgS, ArgS(ArgS.Rows.Count, 1))
   End Function
À partir de la ligne 1, propagé sur 40 lignes :
Code:
=Test($B$1:$B1)
Donne le même résultat que la formule :
Code:
=NB.SI($B$1:$B1;$B1)
 

Discussions similaires

Statistiques des forums

Discussions
312 081
Messages
2 085 161
Membres
102 800
dernier inscrit
NOTZ