Validation d'une partie d'une cellule

Natiffar

XLDnaute Nouveau
Rebonjour à tous !

J'ai un nouveau problème à exposer. (Vous allez finir par me virer du forum avec tout l'attention que je monopolise :unsure: )


Pour ceux qui ont lu mes autres fils, ils auront compris de quoi je parle. Pour ne pas refaire tout l'historique un peu long de mon problème, je vous invite à relire rapidement mes autres fils.

Maintenant que mon numéro de commande ne contient plus d'espace et se trouve formaté comme suit: 05U001

Je voudrais pouvoir valider la lettre utilisée dans le numéro de commande. La raison est simple. J'ai crée plusieurs modèles destinés à être utilisés pour des entités différentes (les entêtes, pieds pages sont défférents pour chacun) et les numéros de commande ne sont pas basés sur les mêmes suites. Ainsi, j'ai des entités dont les numéros de commande sont formés de la manière suivante: 05U001, 05T001, 05I001,...

Je voudrais donc être certain que les utilisateurs ne se trompent pas lorsqu'ils choisissent un modèle pour passer une commande sur l'entité U par exemple.
J'ai pensé au code suivant mais cela ne me retourne aucune valeur:

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Range('NumCommande').Replace What:=' ', Replacement:=''


Dim C As String
Dim NumCommande As String
Range('NumCommande') = NumCommande
Mid(NumCommande, 1, 3) = C


If C = 'U' Then
MsgBox 'Erreur de modèle', vbInformation
End If

End Sub


Biensur ce code n'est qu'un début. Ensuite, lorsque le principe sera établit, je pourrais rajouter les arguments qui manquent (if C = 'T', if C = 'A',...)

Merci d'avance pour vos brillantes idées.

Le concours est lancé...alors à vos claviers ! :)

@+

Natiffar :evil:
 

Hellboy

XLDnaute Accro
Bonjour Natiffar

Je crois ce que tu cherche ressemble à ceci:
Code:
Select Case Mid(Target.Value, 3, 1)
         Case 'U'
              MsgBox 'Erreur de modèle', vbInformation
              'Si tu peux détecter si c'est bon ou pas, alors tu peux peut être le corriger directement l'entrée.
         Case 'T'
         
         Case 'I'
  End Select

En passant, peux-tu me mettre les liens de tes fils s.v.p.

merci !
 

Natiffar

XLDnaute Nouveau
Bonjour HellBoy!

Merci pour ton coup de main.

J'ai un peu galéré pour le metre en place, mais ça y est, ça fonctionne à peu près.

Tu trouveras mes fils en faisant une recherche par nom sur le forum. Tout mes fils parle plus ou moins de la même chose.

Voici également certains fils que j'ai et qui ne sont pas référencés dans ma liste (je n'étais pas encore membre).

Lien supprimé

Lien supprimé

ou encore,

Lien supprimé

Encore merci

@+
 

Natiffar

XLDnaute Nouveau
Salut HellBoy !

Voici le code que j'ai pour valider ma saisie.

En fait, tu vas vitre comprendre à la lecture de mon code que je débute et que ma gestion du code VBA n'est pas encore au point :)

Ce qui m'a causé un souci, c'est d'intégrer ta solution au reste de mon code que voici:

Dans le module éxécuté par un shape posé sur ma feuille:

Code:
Option Explicit

Sub NomFichier()

    On Error GoTo Erreur
    
    'Permet de vérifier la cohérence entre le numéro de commande et le modèle de commande utilisé.
    Dim Cdeanswer As String
    
    Select Case Mid(Range('NumCommande').Value, 3, 1)
    Case 'U' 'Si la lettre du numéro de commande est U, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')
        
    Case 'T' 'Si la lettre du numéro de commande est T, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')
  
    Case 'A' 'Si la lettre du numéro de commande est A, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')
  
    Case 'I' 'Si la lettre du numéro de commande est I, alors...
        GoTo 2
  
    End Select
  
        If Cdeanswer = 1 Then
        GoTo 1
        Else: Resume Next
        End If

    
    'Défini le nom à donner au fichier
2   Dim MyName As String
    MyName = Application.InputBox('Saisissez vos initiales', 'Initiales') 'ouvre une input box pour la saisie des initials
    
    Select Case MyName
        Case False 'Si la valeur retournée est faux (si l'utilisateur clique sur annuler)
            GoTo 3
        
        Case '' 'Si l'utilisateur clique sur OK sans saisir ses initiales
            GoTo 2
        
        Case Else 'Tous les autres cas
            GoTo 4
            
    End Select
    
    
            
4   Dim x As String
    x = Range('F15') & '_' & Range('F2') & '_' & MyName 'Crée et stocke sous le nom x la chaîne caractère qui servira de nom à la commande
        
    'Enregistre le fichier Excel avec son nom définitif
    ActiveWorkbook.SaveAs Filename:='X:\\' & x, FileFormat:=xlNormal, _
       Password:='', WriteResPassword:='', ReadOnlyRecommended:=False, CreateBackup:=False
  
  
    'Génére un pdf et le place dans le dossier défini
    Const ThePath As String = 'X:\\'

    Dim Nom As String
        Nom = x
        Application.SendKeys Keys:=ThePath & Nom + '~'
        Sheets('Feuil1').PrintOut ActivePrinter:='Acrobat PDFWriter sur LPT1:'


    'Ouvre la boite de dialoque de choix d'imprimante et imprime sur l'imprimante séléctionnée
    Application.ActivePrinter = '\\\\w2k-framatome\\Canon iR5000-6000 PCL5e sur Ne02:'
    Dim dlganswer As Boolean
        dlganswer = Application.Dialogs(xlDialogPrinterSetup).Show
    
    If dlganswer = True Then
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, collate:=True
    End If
    GoTo 3
    
    'Empêche l'affichage des messages d'erreur
Erreur:


1
    'Ramène le curseur sur la cellule NumCommande
    Range('NumCommande').Select

3
End Sub


Puis dans Feuil1:
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Range('NumCommande').Replace What:=' ', Replacement:=''

End Sub

Avec ce code (tu l'auras sûrement compris à la lecture !), en cliquant sur mon shape je valide la saisie du numéro de commande, j'enregistre le bon de commande sous un nom défini (numéro de commande_fournisseur_initialesdel'utilisateur.xls), je génère un pdf dans un dossier spécifique (ca a été le plus compliqué avec le code que tu m'as donné !!!) et enfin j'imprime la commande sur une imprimante au choix.

Reste plus maintenant qu'à intégrer ton code et à paufiner les détails avant la mise en place.

Encore merci

@+

Natiffar :evil:
 

Hellboy

XLDnaute Accro
Bonjour Natiffar

Je ne suis pas sur de tout comprendre, mais puis-je te demander à quoi sert cette paritie ou qu'est ce que tu désire accomplir ?
Code:
    Select Case Mid(Range('NumCommande').Value, 3, 1)
    Case 'U' 'Si la lettre du numéro de commande est U, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')
        
    Case 'T' 'Si la lettre du numéro de commande est T, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')
  
    Case 'A' 'Si la lettre du numéro de commande est A, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')

Je ne comprend pas comment tu arrive a affirmer que le no de commande ne correspond pas au modèle ... sans l'avoir comparer avec quoi que se soit ? Je sais que je t'ai fournis ce bout de code, mais sans voir l'ensemble, c'est difficile de dire si je t'ai donné ce que tu avais de besoin.

Je ne suis pas un fervant des Goto, alors je me suis permis de te donner une alternative:

Code:
Sub NomFichier()
    'Permet de vérifier la cohérence entre le numéro de commande et le modèle de commande utilisé.
    Dim Cdeanswer As String
    
    Select Case Mid(Range('NumCommande').Value, 3, 1)
    Case 'U' 'Si la lettre du numéro de commande est U, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')
        
    Case 'T' 'Si la lettre du numéro de commande est T, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')
  
    Case 'A' 'Si la lettre du numéro de commande est A, alors...
        Cdeanswer = MsgBox('Le numéro de commande tapé ne correspondant au modèle de commande utilisé.', vbCritical, 'ITA')
  
    Case 'I' 'Si la lettre du numéro de commande est I, alors...
         Dim MyName As String
         Do
            MyName = Application.InputBox('Saisissez vos initiales', 'Initiales') 'ouvre une input box pour la saisie des initials
            
            Select Case MyName
                   Case False 'Si la valeur retournée est faux (si l'utilisateur clique sur annuler)
                        Exit Sub
                
                   Case '' 'Si l'utilisateur clique sur OK sans saisir ses initiales
                   MsgBox ('Vous n'avez pas incrit vos initiales')
                
                   Case Else 'Tous les autres cas
                        Dim x As String
                        x = Range('F15') & '_' & Range('F2') & '_' & MyName 'Crée et stocke sous le nom x la chaîne caractère qui servira de nom à la commande
                            
                        'Enregistre le fichier Excel avec son nom définitif
                        ActiveWorkbook.SaveAs Filename:='X:\\' & x, FileFormat:=xlNormal, _
                           Password:='', WriteResPassword:='', ReadOnlyRecommended:=False, CreateBackup:=False
                      
                      
                        'Génére un pdf et le place dans le dossier défini
                        Const ThePath As String = 'X:\\'
                    
                        Dim Nom As String
                            Nom = x
                            Application.SendKeys Keys:=ThePath & Nom + '~'
                            Sheets('Feuil1').PrintOut ActivePrinter:='Acrobat PDFWriter sur LPT1:'
                    
                    
                        'Ouvre la boite de dialoque de choix d'imprimante et imprime sur l'imprimante séléctionnée
                        Application.ActivePrinter = '\\\\w2k-framatome\\Canon iR5000-6000 PCL5e sur Ne02:'
                        Dim dlganswer As Boolean
                            dlganswer = Application.Dialogs(xlDialogPrinterSetup).Show
                        
                        If dlganswer = True Then
                            ActiveWindow.SelectedSheets.PrintOut Copies:=1, collate:=True
                        End If
                        
            End Select
            Loop Until MyName <> Empty
  
    End Select
    Range('NumCommande').Select
    

End Sub

Je me débrouille correct en VBA mais pas en devinette. :)
Alors je ne sais pas si il y avait autre chose que tu aurais eu besoin d'aide ?

a+
 

Natiffar

XLDnaute Nouveau
Salut Hellboy !

Cool ton code amélioré.

En fait, mon code Select Case... 'U' ... 'I'.. est tout bête ( et sûement pas très pro...mais tant que ca marche :) ).

Le modèle de formulaire de commande sur lequel je travaille sera démultiplié par 4. Chaque modèle possèdera un entête, pied de page et adresse de factuation différent. Donc, mon code sera légèrement différent sur chaque formulaire. Pour être plus claire:

- Lorsque l'entête est au nom d'ITA, le numéro de commande doit comprendre un I et non une autre lettre.
- Lorsque l'entête est au nom de SCATA, le numéro de commande doit comprendre un A et non une autre lettre.
- ainsi de suite...
Donc mon code permet juste de vérifier que lorsque j'utilise le modèle spécifique SCATA, je tape bien un numéro de commande qui correspond à l'entité SCATA.

Bon, j'aurais certainement pu prendre le problème dans l'autre sens et appliquer un entête, un pied de page,... en fonction du numéro de commande tapé, mais je n'avais pas imaginé utiliser du code VBA à l'origine de mon modeste projet.

Je dois partir pour ce soir, mais j'essairai demain d'intégrer ton code.

@+ et merci encore pour ton aide.

Natiffar :evil:

PS: peux-tu m'expliquer à quoi servent tous les P; et les &nbs :S

Finalement avant de partir j'ai testé ton code. Ca marche impeccable. Par contre j'ai viré les zigouigouis (ca marche mieux :pinch: - mais je ne sais toujours pas à quoi cela sert!!!)

Message édité par: Natiffar, à: 22/06/2005 18:41
 

Hellboy

XLDnaute Accro
Bonsoir Natiffar

D'abord merci pour tes explications, c'Est cool de pouvoir avoir une meilleur idée du projet du demandeur.

PS: peux-tu m'expliquer à quoi servent tous les P; et les &nbs

En fait se sont des artéfacts de mon copie coller sur le post. je ne suis pas sure de savoir pourquoi ça se produit. Il faut que tu les enlève, il ne font pas partie du code.

Si il y a autre chose gêne toi pas de le demander.
 

Discussions similaires

Statistiques des forums

Discussions
312 465
Messages
2 088 650
Membres
103 904
dernier inscrit
thvalette