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) :
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
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
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
Ce que je constate, sur ma machine :

1- différence entre MsgBox et Debug.Print
Les Debug.Print m'affichent, dans la fenêtre d'exécution :
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é
==> 1ère question : Windows serait-il allergique au Lâtin pour modifier ainsi ma variable String?
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 :
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
Les MsgBox m'affichent :
R
T
T
Tout en sachant que l'affichage est parfois différent entre le Debug.Print et le MsgBox, je m'interroge.
==> 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.