pb facile à résoudre : Macro "INPUTBOX" avec condition "COUNTIF=0"

olivm

XLDnaute Junior
Bonjour tout le monde,

J'aimerais faciliter la saisie de nouveaux articles dans ma base de données.
J'ai bien réussi à créer mon INPUTBOX.

Mais j'ai un problème lorsque j'ajoute ma condition " si l'article existe déjà dans la base de donées, alors ne pas l'ajouter".

Code:
Sub saisie()
'
'  saisie Macro
'

Sheets("inventaire").Select 'selectionner cette feuille
 Dim distri As String 'variable = distri
 Dim facture As String ' variable = facture
 
    With Range("e1").Select
         Selection.End(xlDown).Select 'selectionner e1 et aller tout en bas
           ActiveCell.Offset(1, 0).Range("A1").Select 'selectionner la cellule en dessous
          distri = InputBox("Saissiez le nouveau code distribution", "Code distribution") 'La variable reçoit la valeur entrée dans l'InputBox
   
       If distri <> "" Then 'Si la valeur est différente de "" on affiche le résultat
             If "COUNTIF(R1C4:R1C9,""distri"")" = 0 Then
                   ActiveCell = distri
               End If                                 
     End If
     End With
End Sub



Il s'agit juste d'un problème sur ma condition countif, pouvez - vous m'aider svp?
"incompatibilité de type"

Je vous joint un fichier exemple.
 

Pièces jointes

  • saisie.xlsm
    17.5 KB · Affichages: 80
  • saisie.xlsm
    17.5 KB · Affichages: 92
  • saisie.xlsm
    17.5 KB · Affichages: 95
Dernière édition:

Gorfael

XLDnaute Barbatruc
Re : Macro "INPUTBOX" avec condition "COUNTIF=0"

Salut olivm et le forum
Comme ton fichier n'apporte rien, je regarde ton code
Code:
Sub saisie()
Dim distri As String 'variable = distri
Dim facture As String ' variable = facture
Les déclarations peuevnt être placées n'importe où dans le code, ça ne change rien. Il est préférable de les placer en tête de macro, comme ça, tu sais tout de suite quelles sont les variables que tu utilises, et tu retrouves facilement leurs déclarations.
Le commentaire doit être là pour t'aider, pas pour colorer le code. Là tes commentaire ne servent à rien. Tu aurais mis, par exemple : Distri = variable texte, ce pourrait être intéressant.
Code:
Sheets("inventaire").Select 'selectionner cette feuille
Les sélections sont à proscrire autant que possible
Code:
With Range("e1").Select
Mauvaise utilisation du With : il sert à éviter les répétition fastidieuses
Code:
Selection.End(xlDown).Select 'selectionner e1 et aller tout en bas
ActiveCell.Offset(1, 0).Range("A1").Select 'selectionner la cellule en dessous
en gardant les select, on pourrait écrire
Code:
Selection.End(xlDown).Offset(1, 0).Select
C'est plus court, pour le même résultat.
Par contre, je n'utilise jamais xlDown : le contenu des 2 premières cellules(vide ou non) amène des réactions différentes. de plus, s'il y a une cellule vide, ça bloque dessus.
Je préfère utiliser xlup : cells(rows.count,"E").end(xlup) => les 2 dernières cellules d'une feuille étant toujours vides, Excel s'arrête sur la première cellule non-vide en partant du bas et en remontant. Ce qui nous donne la dernière cellule non-vide de E
distri = InputBox("Saissiez le nouveau code distribution", "Code distribution") 'La variable reçoit la valeur entrée dans l'InputBox
Mes variables commencent toujours par une majuscule => j'écris en minuscules et si elle n'apparaît pas quand je valide la ligne, je sais que j'ai une faute de frappe.
Code:
If distri <> "" Then 'Si la valeur est différente de "" on affiche le résultat
     If "COUNTIF(R1C4:R1C9,""distri"")" = 0 Then
         ActiveCell = distri
     End If                                 
End If
Les indentations, quand elles sont utilisées correctement, sont là pour te permettre de te situer dans la boucle ou le test. Sur 10 lignes, ce n'est pas important, mais sur une centaine...
1 - tu es en VBA. Si tu veux utiliser des formules de feuille de calcul, il faut lui dire (voir WorkSheetFunction dans l'aide). Mais pourquoi ne pas utiliser une instruction VBA ?
2 - si je lis ton instruction, ça me donne : compter le nombre de texte "distri" dans la plage de R1C4(D1) à R1C9(I1). déjà, ce n'est pas la bonne syntaxe, mais comme il n'y a aucun mot "distri" sur la ligne 1, la réponse est toujours 0.
Code:
End With
End Sub
On est à la fin, et la variable facture n'a servit à rien.

On est presque, mais pas tout à fait, au résultat escompté, non ;)
Passé en critique comme ça, ton code semble nul. Mais le fait de l'avoir créé est mieux que d'attendre qu'on te le donne. Et tout le monde a commencé comme ça.

Juste une remarque : explique ton but. Mettre des instructions dans ton titre, alors qu'elles sont inadéquates ou mal employées, n'est pas le meilleur moyen d'expliquer ton problème.

Ce que je comprends :
Tu veux ajouter une nouvelle valeur en E, seulement si elle n'existe pas déjà.
Si c'est ça, une autre méthode :
Code:
Sub saisie()
'Déclarations ==================================
Dim Distri As String    'Distri : variable texte réponse inputbox
Dim Cel As Range        'Plage de cellule
'Saisie et Validité de celle-ci ================
'Saisie ----------------------------------------
Distri = InputBox("Saissiez le nouveau code distribution", "Code distribution")
'Validité --------------------------------------
Sheets("inventaire").Activate
'comme on va tout faire sur la feuille, on l'active/sélectionne
Set Cel = Columns(5).Find(Distri)
'cel = cellule contenant la même valeur que distri
If Cel Is Nothing Then
'Si cel n'existe pas (pas de valeur identique)
    Cells(Rows.Count, "E").End(xlUp)(2) = Distri
    'la cellule après la dernière non-vide de E = distri
Else
    'si il existe une cellule identique à distri
    MsgBox "Valeur déjà existante en " & Cel.Address(0, 0)
    'message avec l'adresse du doublon
    Cel.Activate
    'la cellule du doublon devient la cellule active
End If
End Sub
Comme j'ai la flemme, je l'ai faite de tête, sans la tester.
Le .Find(Distri) est équivalent à rechercher. Comme je n'ai pas mis d'autres paramètres, il a ceux de la dernière recherche, ou ceux par défaut.

Prend l'habitude de ne pas utiliser un code sans l'avoir réellement compris. Ça évite bien des pertes de données.
Donc, si tu as des question, n'hésite pas.
A+
 

Discussions similaires

Réponses
8
Affichages
531
Réponses
3
Affichages
318

Statistiques des forums

Discussions
312 487
Messages
2 088 823
Membres
103 971
dernier inscrit
abdazee