Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
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...
 

Dranreb

XLDnaute Barbatruc
Vérifiez dans les options VBE les dispositions à prendre en cas d'erreur. Évitez "Arrêt sur toutes les erreurs", préférez "Arrêt dans le module de classe" plutôt que "Arrêt sur les erreurs non gérées".
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…