Rechercher une série de caractères dans un chemin réseau variable
Bonjour à tous, et merci d'avance pour l'aide que vous apporterez à mon sujet.
Dans le cadre de la réalisation d'une macro VBA sur Catia V5 R19, je souhaiterais configurer un "Label" pour qu'il puisse afficher un texte.
La macro demanderait au concepteur via un UserForm :
- Le numéro d'affaire concerné par le modèle 3D (ex : 1482)
Ensuite, une partie de la macro rechercherait l'affaire renseignée (ex : 1482) dans le dossier où les affaires déjà existantes sont situées. Si la macro trouve un dossier comportant les caractères "1482" (peu importe sa position), alors le Label retourne le texte "Cette affaire existe". Sinon, "Cette affaire n'existe pas"'.
Le problème réside dans le nom du dossier. Celui-ci comporte le nombre 1482 mais également d'autres variables (chiffres et lettres). Par exemple, le dossier recherché associé à l'affaire 1482 (ex: 1482_SYS_XXXXXX_001) comporte les variables SYS (peut être parfois remplacé par TYR, PLZ, TRC...) et 001 (s'incrémente au fil des affaires en fonction du nombre d'affaires TYR, PLZ...).
Étant grand débutant en VBA, j'ai essayé certaines choses mais rien de concluant. Beaucoup d'aides en ligne sont disponibles pour vérifier l'existence d'un fichier/dossier, mais toujours à partir d'un nom de dossier fixe (variable pour mon cas).
Voici quelques informations pouvant vous être utiles :
Chemin du dossier des affaires : "Q:\"
Nom du dossier : "1482_SYS_XXXXXX_001"
Code Test :
Private Sub NumAffaire_Change()
Dim NomDossier As String
Dim X As Integer
For X = 1 To 9999
If NumAffaire = X And Len(NumAffaire) = 4 Then
ArtNumAffaire.Caption = NumAffaire.Value
Call AffaireExiste
Function AffaireExiste() As Boolean
Dim NatProduit As String
Dim NomClient As String
Dim NumChrono As Integer
For X = 1 To 9999
NomDossier = "Q:\" + X + "_" + NatProduit + "_" + NomClient + "_" + NumChrono 'exemple Q:\1482_SYS_XXXXX_001
If NomDossier Like NumAffaire Then
If AffaireExiste = Dir(NomDossier) <> "" And X = NumAffaire Then
MsgBox "Existe"
Else
MsgBox "Existe pas"
End If
Next
End FunctionDans un second temps, je mettrai en place une 2ème condition concernant les caractères SYS, mais je pense pouvoir me débrouiller sur ce sujet.
Auriez-vous une solution à mon problème ? Je reste disponible pour toute précision, il se peut que je me soit mal exprimé sur mon besoin ! Je prends avec plaisir toutes les remarques sur la pertinence de mon code, je sais qu'il est loin d'être parfait...
Cordialement,
Sofian
bonjour,
une proposition (non testée)
Private Sub NumAffaire_Change()
If Val(numaffaire) > 0 And Val(numaffaire) < 10000 Then 'valeur numérique entre 0001 et 9999
artnumaffaire.Caption = numaffaire.Value
If AffaireExiste(Val(numaffaire)) Then 'teste existence d'un fichier contenant le n° d'affaire
MsgBox "affaire " & numaffaire & "existe"
Else
MsgBox "affaire n'existe pas"
End If
Else
MsgBox "n° d'affaire non valable"
End If
End Sub
Function AffaireExiste(x) As Boolean
' teste existence d'un fichier contenant le n° d'affaire X
NomDossier = "Q:\*" + Format(x, "0000") + "*" 'masque du nom de fichier à chercher
If Dir(NomDossier) <> "" Then 'fichier existe
AffaireExiste = True
Else
AffaireExiste = False
End If
End FunctionBonjour h2so4, et merci pour ta réactivité !
J'ai essayé ton code mais celui-ci ne fonctionne pas pour ma macro. J'ai essayé de le modifier afin d'obtenir quelque chose de satisfaisant, mais je bloque désormais sur la fonction AffaireExiste :
Private Sub NumAffaire_Change()
If Len(NumAffaire) = 4 Then
If Val(NumAffaire) > 0 And Val(NumAffaire) < 10000 Then 'valeur numérique entre 0001 et 9999
ArtNumAffaire.Caption = NumAffaire.Value
Call AffaireExiste(x)
Else
MsgBox "n° d'affaire non valable"
End If
End If
End Sub
Function AffaireExiste(x) As Boolean 'teste existence d'un fichier contenant le n° d'affaire X
x = Val(NumAffaire)
NomDossier = "Q:\*" + Format(x, "0000") + "*" 'masque du nom de fichier à chercher
If Dir(NomDossier) <> "" Then 'fichier existe
MsgBox "affaire " & NumAffaire & "existe"
AffaireExiste = True
Else
MsgBox "affaire n'existe pas"
AffaireExiste = False
End If
End FunctionLe code me retourne désormais "affaire n'existe pas" pour chaque affaire. Le problème ne viendrait-il pas de la composition du chemin "NomDossier" ? J'ai pourtant essayé d'assigner à X la valeur de NumAffaire pour que le chemin "NomDossier" ait une valeur à associer à X.
Je me posais aussi la question de l'utilité de l'état de AffaireExiste (True/False) : Dans quel cas l'état de la fonction va-t-il influer sur la suite du code ?
Ci-joint une photo de l'UserForm en question : (La première TextBox en haut est NumAffaire)
N'hésites pas à me reprendre sur mon code, ton travail m'a déjà beaucoup apporté ! Un grand merci à toi.
Bonsoir,
le code que j'ai mis fonctionne chez moi.
les modifications que tu as faites ne sont pas correctes et ce code ne peut pas donner le résultat attendu.
affaireexiste est une fonction qui utilise un paramètre (le numéro d'affaire, variable X dans la fonction), et qui renvoie vrai(true) si un fichier contenant le numéro d'affaire est trouvé dans le répertoire racine de q:\, faux(false) sinon. Valeur que tu peux tester ou mettre dans une variable donc quelque chose comme ceci
if affaireexiste(1234) then msgbox"affaire existe" else msgbox "affaire n'existe pas"
ou
resultatappelfonction=affaireexiste(numerodaffaire)
L'appel d'une fonction ne se fait pas avec une instruction call.
le test sur la longueur du numéro d'affaire est inutile puisqu'en testant si le nombre est > 0 et < 10000 on vérifie que le numéro d'affaire est bien compris entre 0 et 10000 ce qui correspond aux nombres que l'on peut former avec 4 chiffres.
Bonjour h2so4,
En repartant son ton code et en prenant en compte tes remarques, j'ai réussi à obtenir ce que je voulais. J'ai pas mal appris sur ce code, ça m'évitera de refaire les mêmes erreurs... Pour l'histoire du :
If Len(NumAffaire) = 4 ThenCette ligne me permet juste d'activer la suite du code seulement si l'utilisateur a renseigné les 4 caractères (ex: pour 86, renseigner 0086). Mais je pense que cette partie est perfectible, en passant notamment par une mise en forme de la valeur via NumAffaire.Exit .
Un grand merci à toi pour ton aide !
Je poste le code ici au cas où cela pourrait intéresser quelqu'un :
Private Sub NumAffaire_Change()
If Len(NumAffaire) = 4 Then
If Val(NumAffaire) > 0 And Val(NumAffaire) < 10000 Then 'valeur numérique entre 0001 et 9999
ArtNumAffaire.Caption = NumAffaire.Value
NomDossier = "Z:\06_Projets_Produits_et_Process\02_Affaires\" + NumAffaire.Text + "*" 'masque du nom de fichier à chercher"
If AffaireExiste(NomDossier) Then
MsgBox "affaire " & NumAffaire.Text & "existe"
Else
MsgBox "affaire n'existe pas"
End If
Else
MsgBox "n° d'affaire non valable"
End If
End If
End Sub
Function AffaireExiste(NomDossier) As Boolean 'Test existence d'un fichier contenant le n° d'affaire
If Dir(NomDossier, vbdirectory) <> "" Then 'Si le fichier existe
AffaireExiste = True
Else
AffaireExiste = False
End If
End Function