Microsoft 365 VBA Match: comment éviter l'erreur?

Simon 1234

XLDnaute Junior
Bonjour à tous. Je coince depuis hier...
Excel 365 et VBA, fonction MATCH: j'essaie de faire un petit formulaire qui ajoute une ligne dans une feuille OU qui, si elle existe déjà, vient corriger cette ligne. J'utilise MATCH pour trouver cette ligne si elle existe (NumLigne). Bon ça, ça semble marche. Là où ça coince, c'est si MATCH ne trouve rien.

VB:
Sub SAUVER_AVALIDER()
'copier depuis la fiche vers la base de données "A_VALIDER"
Dim NomFeuil As Variant 'on y stocke le nom de la feuille où stocker les données (action)
NomFeuil = Range("AA24").Value

'ci dessous ne marche pas si numligne n'existe pas
Dim NumLigne As Long
NumLigne = Application.Match(Range("T1").Value, Worksheets(NomFeuil).Range("A:A"), 0) ' laligne où se trouve l'IDU
If IsError(NumLigne) Then
Sheets(NomFeuil).Rows("1:1").Insert 'insérer une ligne
NumLigne = 1
ElseIf NumLigne > 0 Then 'reference existante
MsgBox "ref trouvée"
End If

'ci dessous ce sont les cellules où sont les données que je veux stocker dans la feuille
Source = Array("t1", "u16", "n8", "u21", "x21", "aa21", "ad21", "u24", "x24", "aa23", "aa24")

'on copie/colle en masse
For i = 0 To UBound(Source) ' Les tableaux commencent en 0, Ubound donne la fin
      Worksheets(NomFeuil).Cells(NumLigne, i + 1) = Worksheets("FICHE").Range(Source(i)).Value 'j'aime bien cette ligne <3
Next
MsgBox "La fiche a été stockée."

End Sub

Qu'est-ce que je ne comprends pas?
Je suis presque sûr que c'est presque rien... AU SECOURS!
 
Solution
Si une âme égarée cherche la même chose que moi, ceci semble fonctionner
VB:
Sub VALIDER_ACTION()
Dim NumLigne
If Not IsError(Application.Match(Range("A1").Value, Worksheets("FEUILLE").Range("A:A"), 0)) Then
   NumLigne = Application.Match(Range("A1").Value, Worksheets("FEUILLE").Range("A:A"), 0) ' la ligne où se trouve l'IDU
   MsgBox "Ligne trouvée"
Else
    MsgBox "ligne non trouvee"
End If
End Sub
Avec A1 la cellule qui contient la valeur à chercher dans ta feuille "FEUILLE"

Simon 1234

XLDnaute Junior
Pour donner une idée j'ai cette alternative qui fonctionne mais manque un peu d'élégance:
VB:
Sub SAUVER_AVALIDER()
'copier depuis la fiche vers la base de données "A_VALIDER"
Dim NomFeuil As Variant 'on y stocke le nom de la feuille où stocker les données (action)
NomFeuil = Range("AA24").Value
Dim NumLigne As Long

On Error GoTo LigneVide
'ci dessous ne marche pas si numligne n'existe pas

NumLigne = Application.Match(Range("T1").Value, Worksheets(NomFeuil).Range("A:A"), 0) ' laligne où se trouve l'IDU

GoTo CopiCol

LigneVide:
Sheets(NomFeuil).Rows("1:1").Insert 'insérer une ligne
NumLigne = 1

CopiCol:
'ci dessous ce sont les cellules où sont les données que je veux stocker dans la feuille
Source = Array("t1", "u16", "n8", "u21", "x21", "aa21", "ad21", "u24", "x24", "aa23", "aa24")

'on copie/colle en masse
For i = 0 To UBound(Source) ' Les tableaux commencent en 0, Ubound donne la fin
      Worksheets(NomFeuil).Cells(NumLigne, i + 1) = Worksheets("FICHE").Range(Source(i)).Value 'j'aime bien cette ligne <3
Next

MsgBox "La fiche a été stockée."

End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Cette structure est préférable :
VB:
On Error Resume Next
NumLigne = Application.Match(Range("T1").Value, Worksheets(NomFeuil).Range("A:A"), 0) ' laligne où se trouve l'IDU
If Err Then
   Sheets(NomFeuil).Rows(1).Insert 'insérer une ligne
   NumLigne = 1
   End If
Remarque: De tout façon pour qu'une variable puisse recevoir une valeur d'erreur il faut qu'elle soit déclarée As Variant.
 

AtTheOne

XLDnaute Accro
Supporter XLD
VB:
...
NumLigne=0
On error resume next
NumLigne = Application.Match(Range("T1").Value, Worksheets(NomFeuil).Range("A:A"), 0)
on error goto 0
If NumLigne= 0 then
     Sheets(NomFeuil).Rows("1:1").Insert 'insérer une ligne
     NumLigne=1
else
     Msgbox "Ligne trouvée"
end if
...
Edit : Rafraichissement ! Bonjour @Dranreb et bonjour à toutes & à tous !
 

Simon 1234

XLDnaute Junior
@Simon 1234, pourquoi ne le feriez vous pas cette mise à jour par un UserForm ?
Ça vous permettrait d'utiliser une ComboBox pour le critère d'identification, de sorte que vous ne seriez plus obligé de rechercher la ligne à postériori.
Bonjour et merci. Oui, probablement que je pourrais mais je ne suis pas familier des userforms. C'est un mélange de flemme et d'habitude...
 

Membres actuellement en ligne

Statistiques des forums

Discussions
315 079
Messages
2 115 983
Membres
112 632
dernier inscrit
mouad2025