Créer une fonction

Résolu
Signaler
Messages postés
61
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
1 août 2007
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
J'ai un code de ce type, qui me permet de prendre ce qui m'intéresse dans une chaine de caractères, entre 2 chaînes (ce qui est en rouge est ce qui change)
       p = InStr(pid, "MFG:")
        v = Mid(pid, p + Len("MFG:"))
        p = InStr(v, ";")
        MFG = Trim(Mid(v, 1, p - 1))
        Text26.Text = MFG

Suivant quelle procédure où je me trouve, la variable pid change aussi, ainsi que MFG.
Puis-je transformer ceci en fonction facilement ?

Merci beaucoup

16 réponses

Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
Moi je ferai plutôt ça:
Public Function word(ByVal answer As String, ByVal a As String, ByVal b As String) As String




 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Il n'est nul besoin d'y aller de byref ni de byval.
Il est par contre nécessaire de déclarer les types ...

Option Explicit
Private Sub Command1_Click()
    Dim pid As String, MFG As String
    pid = " je suis parti, au MFG: et voilà; j'en suis revenu"
    MFG = word(pid, "MFG:", ";")
    MsgBox MFG
End Sub
Public Function word(answer, a, b) As String
    Dim p As Integer, v As String
    p = InStr(answer, a)
    v = Mid(answer, p + Len(a))
    p = InStr(v, b)
    word = Trim(Mid(v, 1, p - 1))
End Function
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Inspire-toi de cet exemple (que je n'ai pas voulu faire exactement correspondre à ton cas... pour te laisser un peu réfléchir)

Il te suffit d'analyser, comprendre et adapter !

Private Sub Command1_Click()
 Dim toto As String
 toto = "me voilà parti au marché"
 MsgBox machin(toto, "parti")
End Sub


Private Function machin(lachaine As String, lemot As String)
  machin = Mid(lachaine, InStr(lachaine, lemot) + Len(lemot) + 1)
End Function
Messages postés
61
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
1 août 2007

Public Function word(ByRef answer As String, a As String, b As String) As String
    p = InStr(answer, a)
    v = Mid(answer, p + Len(a))
    p = InStr(v, b)
    word = Trim(Mid(v, 1, p - 1))
End Function

Sub Click()
    Dim MFG as string
    MFG = word(pid, "MFG:", ";")
    Text1.Text = MFG
End Sub



Je n'arrive toujours pas, il y a une erreur ByRef sur pid !
Messages postés
2237
Date d'inscription
lundi 29 mai 2006
Statut
Membre
Dernière intervention
29 mai 2008
11
Salut, tu as bien déclaré pid et c'est égale à quoi?

Public Function word(ByVal answer As String, ByVal a As String, ByVal b As String) As String
    p = InStr(answer, a)
    v = Mid(answer, p + Len(a))
    p = InStr(v, b)
    word = Trim(Mid(v, 1, p - 1))
End Function


Private Sub CommandButton1_Click()
    Dim MFG As String
   
    Dim pid As String
    pid = ?
   
    MFG = word(pid, "MFG:", ";")
    Text1.Text = MFG
End Sub

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
Messages postés
61
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
1 août 2007

Merci bien. 2 questions à part...
1) Par exemple, dans dans une chaine de variables, exemple pid = " je suis parti, au MFG: et voilà; j'en suis revenu", comment insérer des guillements, j'ai essayer Chr(34) mais ça ne passe pas non plus.

2) Normalement, lorsqu'on fait un Public Sub, toutes les variables dans la procédure peuvent être réutilisées dans une autre procédure n'est-ce pas, or je n'y arrive pas avec commondialog, et en plus il me fait un erreur 424 !!
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Question par question :
Que veut dire la premère, exactement ?
Tu voudrais écrire une variable dont le texte ressemblerait à ceci ?
toto = "bonjour les amis ! j'ai le "blues", ce soir"  ???
Messages postés
61
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
1 août 2007

Tout à fait
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Private Sub Command2_Click()
  toto = "bonjour les amis, j'ai le ""blues"" ce soir"
  MsgBox toto
End Sub
Messages postés
61
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
1 août 2007

Oups, désolé, j'avais posé la question trop vite
mais pour la 2ième je sèche encore...
Merci pour tout.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Ta 2ème question était :
"2) Normalement, lorsqu'on fait un Public Sub, toutes les variables dans la procédure peuvent être réutilisées dans une autre procédure n'est-ce pas, or je n'y arrive pas avec commondialog, et en plus il me fait un erreur 424 !!"

Je ne comprends tout-à-fait ce que tu veux dire et/ou obtenir ...
Détaille avec précision, car je vois mal de quoi il s'agit ...
veux-tu parler d'une valeur qui serait retournée par l'utilisation du contrôle CommonDialog ? et si oui : laquelle ?
Messages postés
61
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
1 août 2007

En faite, j'ai plusieurs procédures :
Public Sub OK()
    [...]
    MFG = word(pid, "MFG:", ";")
    MsgBox MFG
    [...]

Call read

End Sub

Public Sub read()

    [...]

    OPC = word(answer, "OPC=", vbCrLf)

    MsgBox OPC

    [...]


End Sub

Public Sub Save()   
Dim Fichier AsString
CommonDialog.Filter = "Comma Separated Value (*.CSV) | *.CSV"
 CommonDialog.ShowSave
 Fichier = CommonDialog.FileName
 If Fichier <> "" Then
  Open Fichier For Output As #1
Print #1, "DATE" & "," & "HEURE" & [....]
  Close #1

Open Fichier For Appen As #1
Print #1, Date & "," & Time & "," & MFG [....]
  Close #1
  EndIf
End Sub

Et c'est dans sub save que je n'arrive pas à enregistrer les variables qui sont dans les autres procédures, et ça me fait erreur objet également.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Euh....


Il y a là énormément d'interrogations, ma foi ...


A commencer par celle-ci :
ouvrir 2 fois de suite un fichier pour y écrire, une fois en "direct" et la seconde en "ajout" ... je ne comprends pas l'odée directrice, là....
ensuite : j'espère que le code que tu ne montres ne résulte pas d'un copier coller ! car ke ne connais pas "For Appen"....
ensuite :
je vois bien d'où vient le nom du fichier de sauvegarde (de l'utilisation du contrôle CommonDialog) et je vois bien les textes purs qui y sont inscrits. Je comprends bien que date et time (valeurs système) sont reconnues... mais, à moins que la variable MFG n'ait été déclarée comme publique (et je sais que non compte tenu des messages précédents), MFG sera vide !!!
ensuite :
j'espère que le reste, schématisé ici par des ..... ne sont pas des variables non publiques elles aussi...

enfin :
Je ne comprends pas vraiment l'idée d'ouvrir une commondialog Box pour choisir un fichier, dans ce qui semble être ton cas de figure (mémorisation dans un fichier texte de certaines valeurs, pour les retrouver... ce fichuer me parait alors pouvoir être toujours le même... comment le retrouver, sinon ?)

En conclusion : il me semble que tu t'en vas tout droit vers un mur pour avoir voulu mettre les boeufs avant la charrue...
Ce n'est plus une correction de ton code, qui semble ici nécessaire, mais l'apprentissage même des notions premières, à commencer par la philosophie des mécanismes mis en place.
Et si tu recommencer depuis zéro, en faisant, petit à petit, des mini-projets pour ne gérer qu'un seul point à la fois ? (tu y gagneras sans aucun doute, à mon sens)

Amitiés.


 
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Une variable Public est reconnue dans les autres procédures si elle est déclarée en dehors des procédures. Et elle est reconnue partoutdans le programme si elle est déclarée en dehors des procédures et dans un Module standard.

MPi
Messages postés
61
Date d'inscription
mardi 4 mai 2004
Statut
Membre
Dernière intervention
1 août 2007

Merci, fallait donc les déclarer en public, et les rappeler après, par exemple "nom du form ou du module"."nom de la variable".
Sinon, je voulais dire For Append As, qui permet d'crire à la fin d'un fichier, normalement et qui ne réécri pas.
En fait je veux toujours utiliser le même fichier, et à chaque fois compléter ce CSV à la fin par d'autres nouvelles valeurs.
Ce fichier sera exploité par la suite dans une base de donnée Access ou autre.

Le soucis que j'ai est comment savoir dans le fichier qu'une ligne est déjà écrite, pour éviter de la réécrire deux fois ?
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
La seule façon que je vois est de relire le fichier ligne par ligne et tester si la donnée est déjà là. À moins que tu n'utilises une variable pour stocker tout ton fichier. À ce moment, c'est la variable que tu liras pour rechercher l'existence de la valeur à rajouter...

MPi