Bonjour,
Je vous préviens en amont de ce sujet, le code proposé crashe totalement l'application Excel.
Le message : l'application Excel a cessé de fonctionner s'affiche...
Par conséquent, je comprends tout à fait que vous ne souhaitiez pas forcément tester.
Les codes utilisés :
Les fonctions (quasiment identiques) :
Le code d'appel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Private Function StrConversion(s As String) As String Dim str2 As String Dim addr As Long, n As Long, i As Long addr = StrPtr(s) n = Len(s) / 2 CopyMemory str2, addr, n StrConversion = str2 End Function Private Function StrConversion2(s As String) As String Dim str2 As String Dim addr As Long, n As Long addr = StrPtr(s) n = Len(s) / 2 CopyMemory str2, addr, n StrConversion2 = str2 End Function
Ce que je constate, sur ma machine :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Dest As Any, ByRef Src As Any, ByVal Lenght As Long) Sub Test() Dim str1 As String, result As String str1 = "Risus abundat in ore stultorum" result = StrConversion(str1) Debug.Print result & " -- " & str1 MsgBox result & vbCrLf & str1 str1 = "Toto est au marché" result = StrConversion(str1) Debug.Print result & " -- " & str1 MsgBox result & vbCrLf & str1 str1 = "Toto est au marché" result = StrConversion2(str1) Debug.Print result & " -- " & str1 MsgBox result & vbCrLf & str1 End Sub
1- différence entre MsgBox et Debug.Print
Les Debug.Print m'affichent, dans la fenêtre d'exécution :
==> 1ère question : Windows serait-il allergique au Lâtin pour modifier ainsi ma variable String?R i s u s a b u n d a t i n o r e s t u l t o r u m -- R i s u s a b u n d a t i n o r e s t u l t o r u m
T o t o e s t a u m a r c h é -- Toto est au marché
T o t o e s t a u m a r c h é -- Toto est au marché
Notez bien qu'il ne le fait pas (modifier ma variable String) lorsque Toto doit aller faire ses courses...
A noter également que lorsque je commence par "toto va au marché", le résultat est :
Les MsgBox m'affichent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 T o t o e s t a u m a r c h é -- Toto est au marché R i s u s a b u n d a t i n o r e s t u l t o r u m -- R i s u s a b u n d a t i n o r e s t u l t o r u m
Tout en sachant que l'affichage est parfois différent entre le Debug.Print et le MsgBox, je m'interroge.R
T
T
==> 2ème question : Comment expliqueriez vous une telle différence?
2- Crashe de l'application Excel
Vous aurez noté la différence entre les deux fonctions StrConversion et StrConversion2...
Juste la variable i As Long (inutile dans les deux fonctions) qui est déclaré uniquement dans la première.
Lorsque je supprime la déclaration de variable dans la fonction StrConversion Excel se plante et m'indique le message : l'application Excel a cessé de fonctionner etc...
J'ai pourtant essayé de :
- Sauvegarder, fermer puis ouvrir le classeur,
- Créer cette fonction et son appel dans un nouveau classeur,
- Resaisir (à la mano) cette fonction (et son code d'appel) dans un nouveau module et supprimer l'ancien,
- Redémarrer l'ordinateur...
Rien n'y fait.
Je me dis que, lors de mes essais précédents sur la Sub CopyMemory, j'ai du causer du tord à ma machine.
Ce tord aurait, normalement, du être réparé au redémarrage...
==> 3ème question : Observez-vous le même comportement? (vous pouvez bien entendu vous abstenir de tester...)
==> 4ème question : Comment cela se fait-il?
Précision complémentaire : ce que fait cette fonction est totalement inutile. J'essaie juste de comprendre et tester la notion de pointeurs.
Merci par avance pour la multitude de réponses que vous allez me fournir.
Bien à vous.
Partager