Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

VBA Instruction Mid

6 réponses
Avatar
Adrien Delcour
Bonjour =E0 tous.
Quelqu'un pourrait-il me dire s'il est possible d'utiliser=20
l'instruction (et non fonction) Mid pour faire dans une=20
cha=EEne un remplacement qui raccourcit cette cha=EEne ?
J'aurais cru que la macro qui suit remplacerait "abcd"=20
par "xcd", mais elle la remplace par "xbcd" :
Option Explicit

Public Sub MAIN()
Dim MaChaine As String

MaChaine =3D "abcd"
Mid(MaChaine, 1, 2) =3D "x"
MsgBox "La cha=EEne est maintenant " & MaChaine
End Sub

Apparemment, je comprends mal l'effet de l'instruction Mid.
Merci d'avance =E0 qui m'=E9clairera.
Adrien

6 réponses

Avatar
Céline CHARBONNIER
Bonjour,

Il manque un espace devant votre x pour que cela fonctionne...
En fait, c'est l'utilisation de l'élément facultatif length qui vous pose
problème. Pour mieux comprendre, il vous faut une chaine de caractère plus
longue exemple "toto"
Alors la macro suivante:
Public Sub MAIN()
Dim MaChaine As String
MaChaine = "abcd"
Mid(MaChaine, 1, 2) = "toto"
MsgBox "La chaîne est maintenant " & MaChaine
End Sub
donnera "tocd" car il n'utilise que 2 caractères de la chaine de
remplacement...

par contre en omettant length comme ceci:
Public Sub MAIN()
Dim MaChaine As String
MaChaine = "abcd"
Mid(MaChaine, 1) = "toto"
MsgBox "La chaîne est maintenant " & MaChaine
End Sub
On obtient "toto" en résultat, tout est remplacé.


--
Céline CHARBONNIER
Sitel pour l'assistance utilisateur Microsoft


"Adrien Delcour" a écrit dans le
message de news: 1829a01c41af0$3f5cdc20$
Bonjour à tous.
Quelqu'un pourrait-il me dire s'il est possible d'utiliser
l'instruction (et non fonction) Mid pour faire dans une
chaîne un remplacement qui raccourcit cette chaîne ?
J'aurais cru que la macro qui suit remplacerait "abcd"
par "xcd", mais elle la remplace par "xbcd" :
Option Explicit

Public Sub MAIN()
Dim MaChaine As String

MaChaine = "abcd"
Mid(MaChaine, 1, 2) = "x"
MsgBox "La chaîne est maintenant " & MaChaine
End Sub

Apparemment, je comprends mal l'effet de l'instruction Mid.
Merci d'avance à qui m'éclairera.
Adrien
Avatar
Anacoluthe
Bonjour !

'Adrien Delcour' nous a écrit ...
Quelqu'un pourrait-il me dire s'il est possible d'utiliser
l'instruction (et non fonction) Mid pour faire dans une
chaîne un remplacement qui raccourcit cette chaîne ?
J'aurais cru que la macro qui suit remplacerait "abcd"
par "xcd", mais elle la remplace par "xbcd" :
Mid(MaChaine, 1, 2) = "x"


Pas compris. Mid fait un remplacement, 'x' fait 1 caractère
le remplacement peut se faire donc sur au plus 1 caractère.
le 2 (longueur du remplacemnt) de votre formule ne sert
donc à rien ici, il est d'ailleurs facultatif. Mid n'a
pas pour objet de changer la longueur de MaChaine.
Il suffit de se faire une petite fonction pour ça...

Anacoluthe
« Hasarder des réponses est une manière
d’éclaircir les questions. »
- Alessandro BARICCO

Avatar
Adrien Delcour
Merci Anacoluthe
-----Message d'origine-----
Anacoluthe a répondu :

Pas compris. Mid fait un remplacement, 'x' fait 1
caractère

le remplacement peut se faire donc sur au plus 1
caractère.

le 2 (longueur du remplacemnt) de votre formule ne sert
donc à rien ici, il est d'ailleurs facultatif. Mid n'a
pas pour objet de changer la longueur de MaChaine.
Il suffit de se faire une petite fonction pour ça...

Pas compris (je m'exprime comme vous).

Où trouve-t-on dans la documentation du Word 2000 que la
sous-chaîne remplacée par Mid doit être de même longueur
que la chaîne de remplacement ?
Et si "Mid n'a pas pour objet de changer la longueur de
MaChaine", comment se fait-il que si nous en croyons les
exemples, des applications successives de Mid à une même
chaîne la font passer de "Le chien saute" (14 caractères)
à "Le canard sauta" (15 caractères) ?
Merci d'avance
A. Delcour

Avatar
Merci Céline
-----Message d'origine-----
Bonjour,

Il manque un espace devant votre x pour que cela
fonctionne...

En fait, c'est l'utilisation de l'élément facultatif
length qui vous pose

problème. Pour mieux comprendre, il vous faut une chaine
de caractère plus

longue exemple "toto"
Alors la macro suivante:
Public Sub MAIN()
Dim MaChaine As String
MaChaine = "abcd"
Mid(MaChaine, 1, 2) = "toto"
MsgBox "La chaîne est maintenant " & MaChaine
End Sub
donnera "tocd" car il n'utilise que 2 caractères de la
chaine de

remplacement...

par contre en omettant length comme ceci:
Public Sub MAIN()
Dim MaChaine As String
MaChaine = "abcd"
Mid(MaChaine, 1) = "toto"
MsgBox "La chaîne est maintenant " & MaChaine
End Sub
On obtient "toto" en résultat, tout est remplacé.


D'accord, mais quelle est la règle précise ? Si j'en crois
les exemples, des applicatios successives de Mid à une
même chaîne peuvent la faire passer de "Le chien saute"
(14 caractères) à "Le canard sauta" (15 caractères).
Peut-être les exemples sont-ils erronés ? Et si réellement
Mid ne peut pas modifier la longueur de la chaîne,
pourquoi la partie théorique de la documentation ne le dit-
elle pas et laisse-t-elle croire le contraire ?
Je note que la fonction substr de Perl, qui est l'analogue
de Mid, modifie sans problème la longueur de la chaîne, ce
qui me semble normal.
Merci de toute façon.
Adrien

Avatar
Anacoluthe
Bonjour !

'Adrien Delcour' nous a écrit ...
Où trouve-t-on dans la documentation du Word 2000 que la
sous-chaîne remplacée par Mid doit être de même longueur
que la chaîne de remplacement ?
Et si "Mid n'a pas pour objet de changer la longueur de
MaChaine", comment se fait-il que si nous en croyons les
exemples, des applications successives de Mid à une même
chaîne la font passer de "Le chien saute" (14 caractères)
à "Le canard sauta" (15 caractères) ?


L'Aide vba WD2000 me semble claire :
Mid, instruction
Remplace un nombre indiqué de caractères dans une variable de type
Variant (String) par des caractères extraits d'une autre chaîne.
Syntaxe
Mid(stringvar, start[, length]) = string
La syntaxe de l'instruction Mid comprend les éléments suivants :
stringvar : Nom de la variable chaîne à modifier.
start : Donnée de type Variant (Long). Position du caractère
dans l'argument stringvar où commence le remplacement de texte.
length : Facultatif. Donnée de type Variant (Long).
Nombre de caractères à remplacer. Si ce paramètre est omis,
la totalité de l'argument string est utilisée.
string : Expression de chaîne qui remplace une partie de l'argument
stringvar.

Par contre dans la page d'exemples de l'Aide,
MyString = "Le chien saute" ' Initialise la chaîne.
Mid(MyString, 4, 5) = "lapin" ' MyString = "Le lapin saute".
Mid(MyString, 4) = "boeuf" ' MyString = "Le boeuf saute".
Mid(MyString, 4) = "boeuf sauta par-dessus" ' MyString = "Le boeuf
sauta".
Mid(MyString, 4, 5) = "canard" ' MyString = "Le canard sauta".
il y a effectivement une erreur: le résultat final est "Le canar sauta"
puisqu'il est demandé de remplacer 5 caractères de 'canard'
Le 3ème exemple par contre montre bien que string est tronquée
pour que stringvar ne change pas de longueur.

Refaites vos essais, tout ceci est parfaitement concordant :-)
Si vous souhaitez une fonction SubStr, on peut vous la donner.

Anacoluthe
« La liberté consiste à faire tout ce que permet
la longueur de la chaîne. »
- François CAVANNA

Avatar
Adrien Delcour
Bonjour Anacoluthe.

L'Aide vba WD2000 me semble claire :
Mid, instruction
Remplace un nombre indiqué de caractères dans une
variable de type

Variant (String) par des caractères extraits d'une autre
chaîne.

Syntaxe
Mid(stringvar, start[, length]) = string
La syntaxe de l'instruction Mid comprend les éléments
suivants :

stringvar : Nom de la variable chaîne à modifier.
start : Donnée de type Variant (Long). Position du
caractère

dans l'argument stringvar où commence le remplacement de
texte.

length : Facultatif. Donnée de type Variant (Long).
Nombre de caractères à remplacer. Si ce paramètre est
omis,

la totalité de l'argument string est utilisée.
string : Expression de chaîne qui remplace une partie de
l'argument

stringvar.

Par contre dans la page d'exemples de l'Aide,
MyString = "Le chien saute" ' Initialise la chaîne.
Mid(MyString, 4, 5) = "lapin" ' MyString = "Le lapin
saute".

Mid(MyString, 4) = "boeuf" ' MyString = "Le boeuf
saute".

Mid(MyString, 4) = "boeuf sauta par-dessus" ' MyString
= "Le boeuf

sauta".
Mid(MyString, 4, 5) = "canard" ' MyString = "Le canard
sauta".

il y a effectivement une erreur: le résultat final
est "Le canar sauta"

puisqu'il est demandé de remplacer 5 caractères
de 'canard'

Le 3ème exemple par contre montre bien que string est
tronquée

pour que stringvar ne change pas de longueur.

Refaites vos essais, tout ceci est parfaitement
concordant :-)


Tout ceci est parfaitement concordant, à ceci près que les
exemples de la documentation contredisent la théorie...
Abstraction faite des exemples, que nous nous accordons à
considérer comme fautifs, la règle me semble être celle-
ci : si la sous-chaîne (de la variable) et la chaîne de
remplacement indiquées par l'utilisateur n'ont pas la même
longueur, Mid les égalise en supprimant à la fin de la
plus longue des deux le nombre nécessaire de caractères.
La documentation me semble loin de dire les choses aussi
nettement. Ceci dit, n'est-ce pas bien compliqué ?
L'interdiction de modifier la longueur de la variable a
peut-être pour but la rapidité d'exécution (éviter des
déménagements dans la mémoire) mais je vois mal dans quel
cas l'utilisateur peut tirer avantage de la troncation
d'office. Et il me semble regrettable d'obliger
l'utilisateur de construire lui-même sa fonction substr
(ce que j'ai fait à l'aide de concaténations, je vous
remercie de votre offre mais elle ne me sera pas
nécessaire) alors que la syntaxe de Mid conviendrait.
(C'est cette syntaxe qui est utilisée dans Perl, dans C++
et, j'imagine, dans d'autres langages.) En tout cas, merci
encore, je pense que les choses sont devenues plus claires.
A.D.