Excel, Textbox et API

  • Initiateur de la discussion Pascal
  • Date de début
P

Pascal

Guest
Bonjour à tous sur le forum,
Pour mon petit projet, j'aurais besoin de textbox avec prop. multiline et enterkeybehavior à true, mais qui ne permettent pas d'écrire sur plus de quelques lignes.
J'ai trouvé sur le net (http://blackbeltvb.com) une source utilisant un appel API (dont je ne connais rien) et qui correspond à ce que je recherche:
Textbox1 pour le texte, Textbox2 pour nb caractères maxi/lignes, Textbox3 pour nb maxi de lignes.
Seulement, lorsque je lance mon Userform, j'ai une erreur:
"Erreur de compilation: Membre de méthode ou de données introuvable" avec focus sur l'argument "hwnd" de la ligne "i=SendMessage(....." ??
Est-ce normal ?? est-il impossible d'appeler ce genre API avec excel ? ou bien est-ce une erreur de ma part ou pb config excel ?
(Mon poste; Excel 2000 , Window XP Pro)
Peut être est-il possible d'arriver au même résultat sans passer par une API?
Je laisse le code source ci dessous:

Option Explicit
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_GETLINE = &HC4
Private Const EM_LINEFROMCHAR = &HC9

Private Sub Text1_Change()
Static bInHere As Boolean, txt As String, iSel As Long, iSelLen As Long
If bInHere Then Exit Sub
bInHere = True
Dim iPerLine As Long, aBuf$, i As Long, iRet As Long
iPerLine = Val(Text2.Text)
aBuf$ = Chr$(0) & Chr$(255) & Space$(253)
i = SendMessage(Text1.hwnd, EM_LINEFROMCHAR, -1, ByVal 0)
iRet = SendMessage(Text1.hwnd, EM_GETLINE, 1, ByVal aBuf$)
If iRet > iPerLine Then
Text1.Text = txt
Text1.SelStart = iSel
Text1.SelLength = iSelLen
Else
txt = Text1.Text
iSel = Text1.SelStart
iSelLen = Text1.SelLength
End If
bInHere = False
End Sub

Private Sub Text1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim iLines As Long
iLines = Val(Text3.Text)
Select Case KeyAscii
Case 13
If SendMessage(Text1, EM_GETLINECOUNT, 0, ByVal 0) + 1 > iLines Then KeyAscii = 0
End Select
End Sub


Vous remerciant par avance,
Bonne journée à tous,
Pascal
 
L

Lord Nelson

Guest
Salut,
Il est possible que ton contrôle TextBox ne soit pas doté de la propriété "hWnd" indispensable pour exploiter une fonction API.
(c'est un numéro d'ordre attribué par Windows pour identifier les contrôles fenêtres ou objets divers). Beaucoup d'objets n'en ont pas car il sont identifiés par leur contrôle parent.

Pour vérifier ce point, teste ceci dans ton code :
MsgBox CStr(Text1.hWnd)
Si tu reçois un nombre, tout va bien, sinon tu devras rechercher un autre contrôle TextBox doté de cette propriété.
A+
 
E

EMG

Guest
Bonsoir Pascal, Mister Lord Nelson

Bon sans avoir ton UserForm sous la main moi je ferais avec le code ci-dessous modifier (.hwnd par .text) essai pour voir le résultat

@+ Gérard


Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const EM_GETLINECOUNT = &HBA
Private Const EM_GETLINE = &HC4
Private Const EM_LINEFROMCHAR = &HC9

Private Sub Text1_Change()
Static bInHere As Boolean, txt As String, iSel As Long, iSelLen As Long
If bInHere Then Exit Sub
bInHere = True
Dim iPerLine As Long, aBuf$, i As Long, iRet As Long
iPerLine = Val(Text2.Text)
aBuf$ = Chr$(0) & Chr$(255) & Space$(253)

'i = SendMessage(Text1.hwnd, EM_LINEFROMCHAR, -1, ByVal 0)
i = SendMessage(Text1.Text, EM_LINEFROMCHAR, -1, ByVal 0)

'iRet = SendMessage(Text1.hwnd, EM_GETLINE, 1, ByVal aBuf$)
iRet = SendMessage(Text1.Text, EM_GETLINE, 1, ByVal aBuf$)

If iRet > iPerLine Then
Text1.Text = txt
Text1.SelStart = iSel
Text1.SelLength = iSelLen
Else
txt = Text1.Text
iSel = Text1.SelStart
iSelLen = Text1.SelLength
End If
bInHere = False
End Sub

Private Sub Text1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
Dim iLines As Long
iLines = Val(Text3.Text)
Select Case KeyAscii
Case 13
If SendMessage(Text1.Text, EM_GETLINECOUNT, 0, ByVal 0) + 1 > iLines Then KeyAscii = 0
End Select
End Sub
 
P

Pascal

Guest
Bonjour Gérard, Mister Lord Nelson et le forum
,
J'ai essayé ton code ce matin, EMG, et malheureusement celà ne fonctionne pas.
Apparemment, le nb de lignes ou de caractères choisis n'est pas pris en compte.
Lorsque je rentre du texte (lettres), j'obtiens l'erreur 13 "Incompatibilité de type", et si je tape des chiffres, c'est l'erreur 6 "Dépassement de capacité" qui apparaît (la longueur du nombre tapé ne dépasse jamais 10 ou 11 chiffres).
Je joins l'exemple si celà peut aider.


- Existe t-il par contre un autre moyen d'arriver au même résultat (je veux dire si ça fonctionne), sans passer par un appel API ?
Dans mon projet, le nombre de caratères par lignes maxi et le nombre de lignes maxi doivent être fixes (pas besoin du choix): 15 caractères maxi sur 3 lignes maxi.
Attention, celà ne veut pas dire que mettre la propriété MaxLenght à 45 suffira.
Je dois pouvoir écrire ce que je veux, 1, 2 ou 10 caractères par ligne mais limité à 15/ligne sur 1, 2 ou 3 lignes maxi.

Enfin, que ce soit possible ou pas, merci beaucoup d'avoir passer du temps sur mon problème.
Bonne journée à tous

@+
Pascal
 

Pièces jointes

  • limitation_texte.ZIP
    12 KB · Affichages: 24
L

Lord Nelson

Guest
Bonsoir Pascal,

Sans API, tu peux tester la chaîne contenue dans le TextBox.
Si elle contient 1 VbCrLf, elle fait 2 lignes,
Si elle en contient 2, elle a 3 lignes.
Tu peux donc guetter l'apparition d'un 3e VbCrLf et taper vigoureusement sur les doigts de l'utilisateur !
De même, si tu prends soin de partager ta chaîne en lignes, il devient presque simple de vérifier que la longueur de chaque ligne n'excède pas l'allocation fatidique de 15 caractères.

Si j'ai bonne mémoire, la fonction "Split" devrait te donner les 3 lignes et la fonction "Len" la longueur de chaque ligne.

A+
 
P

Pascal

Guest
Bonsoir Lord Nelson

Celà à l'air si simple lorsque tu en parles. Je vais m'atteler à la tâche et voir ce que je peux faire.
En tout cas merci pour cette nouvelle voie (pour moi..) à explorer.
Vous tiens au courant sur le forum.

Bonne soirée
Pascal
 

Discussions similaires

Statistiques des forums

Discussions
312 843
Messages
2 092 748
Membres
105 519
dernier inscrit
faivre-roussel.ivan@orang