OVH Cloud OVH Cloud

réponse obligatoire à un inputbox

7 réponses
Avatar
alroussel
Bonsoir à tous,

Je fais encore à vous pour obtenir de l'aide.

je voudrais rendre obligatoire la réponse demandée par un inputbox, c'est-a
dire que tant que l'utilisateur n'aurait pas répondu, chaque fois l'inputbox
réapparaitrais et la suite de la macro ne se déroulerait pas.
voici la partie de la macro concernée:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
...................
End If

Quelle instruction mettre vant le "end if " pour que l'inputbox revienne
tant que l'utilisteur n'aura pas mis de nom ?
et en vraiment subsidiaire, existe t'il un moyen pour que le bouton "annuler
de l'inputbox ne soit pas apparent ?

grand merci d'avance pour l'attention que vous porterez à mon problème

Alain ROUSSEL

7 réponses

Avatar
sabatier
bonsoir alain
il te suffit de rajouter le nom de ta sub avant le end if et le tour est
joué...
jps

alroussel a écrit:
Bonsoir à tous,

Je fais encore à vous pour obtenir de l'aide.

je voudrais rendre obligatoire la réponse demandée par un inputbox, c'est-a
dire que tant que l'utilisateur n'aurait pas répondu, chaque fois l'inputbox
réapparaitrais et la suite de la macro ne se déroulerait pas.
voici la partie de la macro concernée:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
...................
End If

Quelle instruction mettre vant le "end if " pour que l'inputbox revienne
tant que l'utilisteur n'aura pas mis de nom ?
et en vraiment subsidiaire, existe t'il un moyen pour que le bouton "annuler
de l'inputbox ne soit pas apparent ?

grand merci d'avance pour l'attention que vous porterez à mon problème

Alain ROUSSEL




Avatar
sabatier
...à condition que tu mettes dans une sub à part l'appel de cette
inputbox bien sûr...
jps

sabatier a écrit:
bonsoir alain
il te suffit de rajouter le nom de ta sub avant le end if et le tour est
joué...
jps

alroussel a écrit:

Bonsoir à tous,

Je fais encore à vous pour obtenir de l'aide.

je voudrais rendre obligatoire la réponse demandée par un inputbox,
c'est-a
dire que tant que l'utilisateur n'aurait pas répondu, chaque fois
l'inputbox
réapparaitrais et la suite de la macro ne se déroulerait pas.
voici la partie de la macro concernée:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
...................
End If

Quelle instruction mettre vant le "end if " pour que l'inputbox revienne
tant que l'utilisteur n'aura pas mis de nom ?
et en vraiment subsidiaire, existe t'il un moyen pour que le bouton
"annuler
de l'inputbox ne soit pas apparent ?

grand merci d'avance pour l'attention que vous porterez à mon problème

Alain ROUSSEL







Avatar
Thierry
Alain,
Je te propose :

Do Until zzzz <> ""
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
End If
Loop

Cordialement,
Thierry

"alroussel" a écrit dans le message de news:
3fc65816$0$26793$
Bonsoir à tous,

Je fais encore à vous pour obtenir de l'aide.

je voudrais rendre obligatoire la réponse demandée par un inputbox,
c'est-a

dire que tant que l'utilisateur n'aurait pas répondu, chaque fois
l'inputbox

réapparaitrais et la suite de la macro ne se déroulerait pas.
voici la partie de la macro concernée:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
...................
End If

Quelle instruction mettre vant le "end if " pour que l'inputbox revienne
tant que l'utilisteur n'aura pas mis de nom ?
et en vraiment subsidiaire, existe t'il un moyen pour que le bouton
"annuler

de l'inputbox ne soit pas apparent ?

grand merci d'avance pour l'attention que vous porterez à mon problème

Alain ROUSSEL




Avatar
Alain CROS
Bonjour.

Une petite recherche sur Google t'aurais donné ...

Si tu travaille sur PC, essaye comme ça.

Tu créer un bouton sur une feuille de calcul issue de la barre d'outils Formulaire.
Tu lui affecte la macro InputBoxToujoursOK.

Dans un module standard tu copie ce qui suis.

Option Explicit

Private Declare Function EnableWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal fEnable As Long) As Long

Private Declare Function FindWindowExA Lib "user32" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Declare Function GetWindowLongA Lib "user32" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) As Long

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Private Declare Function SetWindowsHookExA Lib "user32" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

Private lgHook As Long

Private Declare Function GetSystemMenu Lib "user32" _
(ByVal hwnd As Long, _
ByVal bRevert As Long) As Long

Private Declare Function DeleteMenu Lib "user32" _
(ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long

Private Declare Function GetWindowTextLengthA Lib "user32" _
(ByVal hwnd As Long) As Long

Private Declare Function GetWindowTextA Lib "user32" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long

Sub InputBoxToujoursOK()

Const WH_CBT As Long = &H5
Const GWL_HINSTANCE As Long = -6
Dim lgInst As Long

lgInst = GetWindowLongA(FindWindowExA(0, 0, "XLMAIN", _
Application.Caption), GWL_HINSTANCE)
#If VBA6 Then
lgHook = SetWindowsHookExA(WH_CBT, AddressOf InputBoxToujoursOKProc, _
lgInst, GetCurrentThreadId)
#Else
lgHook = SetWindowsHookExA(WH_CBT, AddrOf("InputBoxToujoursOKProc"), _
lgInst, GetCurrentThreadId)
#End If
MsgBox "Les Données saisies sont : " & InputBox("Saisissez vos données")

End Sub

Private Function InputBoxToujoursOKProc(ByVal lMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Long) As Long

Const HCBT_ACTIVATE = &O5
Const SC_CLOSE = &HF060
Const MF_BYCOMMAND = &H0

Dim BWND As Long, MYSTR As String

If lMsg = HCBT_ACTIVATE Then
' Empécher la fermeture par la croix
DeleteMenu GetSystemMenu(wParam, False), SC_CLOSE, MF_BYCOMMAND
Do
' Rechercher le handle des boutons
BWND = FindWindowExA(wParam, BWND, "BUTTON", vbNullString)
If BWND <> 0 Then
' Lire le texte du bouton
MYSTR = String(GetWindowTextLengthA(BWND) + 1, Chr$(0))
GetWindowTextA BWND, MYSTR, Len(MYSTR)
If MYSTR = "Annuler" & Chr$(0) Then
EnableWindow BWND, False
Exit Do
End If
End If
Loop Until BWND = 0
UnhookWindowsHookEx lgHook
End If
InputBoxToujoursOKProc = False

End Function

Si tu travaille avec XL97

Tu créer un autre module Standard que tu appelle AddrOf_Ken_Getz_Michael_Kaplan
Propriété (Name) du Module
Puis dedans tu copie ce qui suis.

Option Explicit
Private Declare Function GetCurrentVbaProject Lib "vba332.dll" _
Alias "EbGetExecutingProj" _
(hProject As Long) As Long
Private Declare Function GetFuncID Lib "vba332.dll" _
Alias "TipGetFunctionId" _
(ByVal hProject As Long, _
ByVal strFunctionName As String, _
ByRef strFunctionID As String) As Long
Private Declare Function GetAddr Lib "vba332.dll" _
Alias "TipGetLpfnOfFunctionId" _
(ByVal hProject As Long, _
ByVal strFunctionID As String, _
ByRef lpfnAddressOf As Long) As Long
#If VBA6 Then
#Else
Public Function AddrOf(CallbackFunctionName As String) _
As Long
'AddressOf operator replacement for Office97 VBA _
Authors: Ken Getz and Michael Kaplan

'declaration of local variables
Dim aResult As Long
Dim CurrentVBProject As Long
Dim strFunctionID As String
Dim AddressOfFunction As Long
Dim UnicodeFunctionName As String

'convert the name of the function to Unicode system
UnicodeFunctionName = StrConv(CallbackFunctionName, _
vbUnicode)
'if the current VBProjects exists...
If Not GetCurrentVbaProject(CurrentVBProject) = 0 Then
'get the function ID of the callback function, _
based on its unicode-converted name, _
in order to ensure that it exists
aResult = GetFuncID(hProject:=CurrentVBProject, _
strFunctionName:=UnicodeFunctionName, _
strFunctionID:=strFunctionID)
'if the function exists indeed ...
If aResult = 0 Then
'get a pointer to the callback function based on the _
strFunctionID argument of the GetFuncID function
aResult = GetAddr(hProject:=CurrentVBProject, _
strFunctionID:=strFunctionID, _
lpfnAddressOf:­dressOfFunction)
'if we've got the pointer pass it to the result _
of the function
If aResult = 0 Then
AddrOf = AddressOfFunction
End If
End If
End If

End Function
#End If

Voilà tu as une inputBox qui ne se ferme que par le bouton OK.

Alain CROS.


"alroussel" a écrit dans le message de news: 3fc65816$0$26793$
Bonsoir à tous,

Je fais encore à vous pour obtenir de l'aide.

je voudrais rendre obligatoire la réponse demandée par un inputbox, c'est-a
dire que tant que l'utilisateur n'aurait pas répondu, chaque fois l'inputbox
réapparaitrais et la suite de la macro ne se déroulerait pas.
voici la partie de la macro concernée:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
...................
End If

Quelle instruction mettre vant le "end if " pour que l'inputbox revienne
tant que l'utilisteur n'aura pas mis de nom ?
et en vraiment subsidiaire, existe t'il un moyen pour que le bouton "annuler
de l'inputbox ne soit pas apparent ?

grand merci d'avance pour l'attention que vous porterez à mon problème

Alain ROUSSEL




Avatar
Michel Gaboly
Bonsoir,

De mon point de vue, InputBox est un héritage des anciens Basic dont il
vaut mieux se passer.

InputBox manque de souplesse :

http://www.gaboly.com/VBA/VBMAJPLafond.html

Nous disposons maintenant des UserForms, qui permettent de gérer les
événements, contrairement aux InputBoxes.

Un UserForm avec un seul bouton OK et un contrôle de saisie,

http://www.gaboly.com/VBA/FonctionControle.html


C'est effectivement plus long de construire un UserForm, mais une fois
que c'est fait, il est facile de l'adapter pour remplacer n'importe quel
InputBox. Rien n'empêche de toujours utiliser le même UserForm,
en utilisant une variable pour le texte à afficher.

Cela me paraît beaucoup moins lourd que l'emploi de diverses librairies
"user32" , réservées aux versions d'Excel PC de surcroît.



Bonjour.

Une petite recherche sur Google t'aurais donné ...

Si tu travaille sur PC, essaye comme ça.

Tu créer un bouton sur une feuille de calcul issue de la barre d'outils Formulaire.
Tu lui affecte la macro InputBoxToujoursOK.

Dans un module standard tu copie ce qui suis.

Option Explicit

Private Declare Function EnableWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal fEnable As Long) As Long

Private Declare Function FindWindowExA Lib "user32" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Declare Function GetWindowLongA Lib "user32" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) As Long

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Private Declare Function SetWindowsHookExA Lib "user32" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

Private lgHook As Long

Private Declare Function GetSystemMenu Lib "user32" _
(ByVal hwnd As Long, _
ByVal bRevert As Long) As Long

Private Declare Function DeleteMenu Lib "user32" _
(ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long

Private Declare Function GetWindowTextLengthA Lib "user32" _
(ByVal hwnd As Long) As Long

Private Declare Function GetWindowTextA Lib "user32" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long

Sub InputBoxToujoursOK()

Const WH_CBT As Long = &H5
Const GWL_HINSTANCE As Long = -6
Dim lgInst As Long

lgInst = GetWindowLongA(FindWindowExA(0, 0, "XLMAIN", _
Application.Caption), GWL_HINSTANCE)
#If VBA6 Then
lgHook = SetWindowsHookExA(WH_CBT, AddressOf InputBoxToujoursOKProc, _
lgInst, GetCurrentThreadId)
#Else
lgHook = SetWindowsHookExA(WH_CBT, AddrOf("InputBoxToujoursOKProc"), _
lgInst, GetCurrentThreadId)
#End If
MsgBox "Les Données saisies sont : " & InputBox("Saisissez vos données")

End Sub

Private Function InputBoxToujoursOKProc(ByVal lMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Long) As Long

Const HCBT_ACTIVATE = &O5
Const SC_CLOSE = &HF060
Const MF_BYCOMMAND = &H0

Dim BWND As Long, MYSTR As String

If lMsg = HCBT_ACTIVATE Then
' Empécher la fermeture par la croix
DeleteMenu GetSystemMenu(wParam, False), SC_CLOSE, MF_BYCOMMAND
Do
' Rechercher le handle des boutons
BWND = FindWindowExA(wParam, BWND, "BUTTON", vbNullString)
If BWND <> 0 Then
' Lire le texte du bouton
MYSTR = String(GetWindowTextLengthA(BWND) + 1, Chr$(0))
GetWindowTextA BWND, MYSTR, Len(MYSTR)
If MYSTR = "Annuler" & Chr$(0) Then
EnableWindow BWND, False
Exit Do
End If
End If
Loop Until BWND = 0
UnhookWindowsHookEx lgHook
End If
InputBoxToujoursOKProc = False

End Function

Si tu travaille avec XL97

Tu créer un autre module Standard que tu appelle AddrOf_Ken_Getz_Michael_Kaplan
Propriété (Name) du Module
Puis dedans tu copie ce qui suis.

Option Explicit
Private Declare Function GetCurrentVbaProject Lib "vba332.dll" _
Alias "EbGetExecutingProj" _
(hProject As Long) As Long
Private Declare Function GetFuncID Lib "vba332.dll" _
Alias "TipGetFunctionId" _
(ByVal hProject As Long, _
ByVal strFunctionName As String, _
ByRef strFunctionID As String) As Long
Private Declare Function GetAddr Lib "vba332.dll" _
Alias "TipGetLpfnOfFunctionId" _
(ByVal hProject As Long, _
ByVal strFunctionID As String, _
ByRef lpfnAddressOf As Long) As Long
#If VBA6 Then
#Else
Public Function AddrOf(CallbackFunctionName As String) _
As Long
'AddressOf operator replacement for Office97 VBA _
Authors: Ken Getz and Michael Kaplan

'declaration of local variables
Dim aResult As Long
Dim CurrentVBProject As Long
Dim strFunctionID As String
Dim AddressOfFunction As Long
Dim UnicodeFunctionName As String

'convert the name of the function to Unicode system
UnicodeFunctionName = StrConv(CallbackFunctionName, _
vbUnicode)
'if the current VBProjects exists...
If Not GetCurrentVbaProject(CurrentVBProject) = 0 Then
'get the function ID of the callback function, _
based on its unicode-converted name, _
in order to ensure that it exists
aResult = GetFuncID(hProject:=CurrentVBProject, _
strFunctionName:=UnicodeFunctionName, _
strFunctionID:=strFunctionID)
'if the function exists indeed ...
If aResult = 0 Then
'get a pointer to the callback function based on the _
strFunctionID argument of the GetFuncID function
aResult = GetAddr(hProject:=CurrentVBProject, _
strFunctionID:=strFunctionID, _
lpfnAddressOf:­dressOfFunction)
'if we've got the pointer pass it to the result _
of the function
If aResult = 0 Then
AddrOf = AddressOfFunction
End If
End If
End If

End Function
#End If

Voilà tu as une inputBox qui ne se ferme que par le bouton OK.

Alain CROS.

"alroussel" a écrit dans le message de news: 3fc65816$0$26793$
Bonsoir à tous,

Je fais encore à vous pour obtenir de l'aide.

je voudrais rendre obligatoire la réponse demandée par un inputbox, c'est-a
dire que tant que l'utilisateur n'aurait pas répondu, chaque fois l'inputbox
réapparaitrais et la suite de la macro ne se déroulerait pas.
voici la partie de la macro concernée:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
...................
End If

Quelle instruction mettre vant le "end if " pour que l'inputbox revienne
tant que l'utilisteur n'aura pas mis de nom ?
et en vraiment subsidiaire, existe t'il un moyen pour que le bouton "annuler
de l'inputbox ne soit pas apparent ?

grand merci d'avance pour l'attention que vous porterez à mon problème

Alain ROUSSEL





--
Cordialement,

Michel Gaboly
http://www.gaboly.com


Avatar
ru-th
Salut

une p' tit étiquette

encore:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
goto encore
End If

--
a+
rural thierry
Veaux et Broutards d'Anjou
Wicasa on kin nape yapi inahni yo (à l'essai)

"alroussel" a écrit dans le message de news:
3fc65816$0$26793$
Bonsoir à tous,

Je fais encore à vous pour obtenir de l'aide.

je voudrais rendre obligatoire la réponse demandée par un inputbox,
c'est-a

dire que tant que l'utilisateur n'aurait pas répondu, chaque fois
l'inputbox

réapparaitrais et la suite de la macro ne se déroulerait pas.
voici la partie de la macro concernée:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
...................
End If

Quelle instruction mettre vant le "end if " pour que l'inputbox revienne
tant que l'utilisteur n'aura pas mis de nom ?
et en vraiment subsidiaire, existe t'il un moyen pour que le bouton
"annuler

de l'inputbox ne soit pas apparent ?

grand merci d'avance pour l'attention que vous porterez à mon problème

Alain ROUSSEL




Avatar
Frédéric Sigonneau
Bonjour Michel,

Par rapport à la question posée, tu crois vraiment que construire un userform,
même basique, est plus souple que ces qq lignes de code avec inputbox ?

Sub test()
Dim rep$
Do
rep = InputBox("Réponse SVP :")
Loop While rep = ""
End Sub

Tu as déjà à plusieurs reprises fait cette remarque sur le caractère obsolète,
selon toi, de l'inputbox et le côté avantageux de son remplacement par un
userform, et j'avoue que je ne comprends pas pourquoi..
Je ne cherche nullement à lancer une polémique avec toi, comprends-le bien,
simplement je ne comprends pas cette mise à l'écart d'un outil que je trouve
personnellement très pratique !... Pour recueillir auprès de l'utilisateur une
information simple et une seule, InputBox (ou quelquefois sa cousine
Application.InputBox qui permet de choisir des valeurs de retour autres que du
texte) est, de mon point de vue, idéale la plupart du temps :)
Par contre, dès qu'il faut rassembler plus de 1 ou 2 informations auprès de
l'utilisateur, là je suis d'accord avec toi, un userform est une meilleure
solution.
Mais la souplesse, AMA, est plutôt d'avoir plusieurs outils à disposition qu'un
seul..
Bon, c'était juste mes deux centimes d'euro dominicaux :)

FS
--
Frédéric Sigonneau [MVP Excel - né un sans-culottide]
Gestions de temps, VBA pour Excel :
http://perso.wanadoo.fr/frederic.sigonneau
Si votre question sur Excel est urgente, évitez ma bal !


Bonsoir,

De mon point de vue, InputBox est un héritage des anciens Basic dont il
vaut mieux se passer.

InputBox manque de souplesse :

http://www.gaboly.com/VBA/VBMAJPLafond.html

Nous disposons maintenant des UserForms, qui permettent de gérer les
événements, contrairement aux InputBoxes.

Un UserForm avec un seul bouton OK et un contrôle de saisie,

http://www.gaboly.com/VBA/FonctionControle.html

C'est effectivement plus long de construire un UserForm, mais une fois
que c'est fait, il est facile de l'adapter pour remplacer n'importe quel
InputBox. Rien n'empêche de toujours utiliser le même UserForm,
en utilisant une variable pour le texte à afficher.

Cela me paraît beaucoup moins lourd que l'emploi de diverses librairies
"user32" , réservées aux versions d'Excel PC de surcroît.


Bonjour.

Une petite recherche sur Google t'aurais donné ...

Si tu travaille sur PC, essaye comme ça.

Tu créer un bouton sur une feuille de calcul issue de la barre d'outils Formulaire.
Tu lui affecte la macro InputBoxToujoursOK.

Dans un module standard tu copie ce qui suis.

Option Explicit

Private Declare Function EnableWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal fEnable As Long) As Long

Private Declare Function FindWindowExA Lib "user32" _
(ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long

Private Declare Function GetWindowLongA Lib "user32" _
(ByVal hwnd As Long, _
ByVal nIndex As Long) As Long

Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Private Declare Function SetWindowsHookExA Lib "user32" _
(ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

Private lgHook As Long

Private Declare Function GetSystemMenu Lib "user32" _
(ByVal hwnd As Long, _
ByVal bRevert As Long) As Long

Private Declare Function DeleteMenu Lib "user32" _
(ByVal hMenu As Long, _
ByVal nPosition As Long, _
ByVal wFlags As Long) As Long

Private Declare Function GetWindowTextLengthA Lib "user32" _
(ByVal hwnd As Long) As Long

Private Declare Function GetWindowTextA Lib "user32" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long

Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long

Sub InputBoxToujoursOK()

Const WH_CBT As Long = &H5
Const GWL_HINSTANCE As Long = -6
Dim lgInst As Long

lgInst = GetWindowLongA(FindWindowExA(0, 0, "XLMAIN", _
Application.Caption), GWL_HINSTANCE)
#If VBA6 Then
lgHook = SetWindowsHookExA(WH_CBT, AddressOf InputBoxToujoursOKProc, _
lgInst, GetCurrentThreadId)
#Else
lgHook = SetWindowsHookExA(WH_CBT, AddrOf("InputBoxToujoursOKProc"), _
lgInst, GetCurrentThreadId)
#End If
MsgBox "Les Données saisies sont : " & InputBox("Saisissez vos données")

End Sub

Private Function InputBoxToujoursOKProc(ByVal lMsg As Long, _
ByVal wParam As Long, _
ByRef lParam As Long) As Long

Const HCBT_ACTIVATE = &O5
Const SC_CLOSE = &HF060
Const MF_BYCOMMAND = &H0

Dim BWND As Long, MYSTR As String

If lMsg = HCBT_ACTIVATE Then
' Empécher la fermeture par la croix
DeleteMenu GetSystemMenu(wParam, False), SC_CLOSE, MF_BYCOMMAND
Do
' Rechercher le handle des boutons
BWND = FindWindowExA(wParam, BWND, "BUTTON", vbNullString)
If BWND <> 0 Then
' Lire le texte du bouton
MYSTR = String(GetWindowTextLengthA(BWND) + 1, Chr$(0))
GetWindowTextA BWND, MYSTR, Len(MYSTR)
If MYSTR = "Annuler" & Chr$(0) Then
EnableWindow BWND, False
Exit Do
End If
End If
Loop Until BWND = 0
UnhookWindowsHookEx lgHook
End If
InputBoxToujoursOKProc = False

End Function

Si tu travaille avec XL97

Tu créer un autre module Standard que tu appelle AddrOf_Ken_Getz_Michael_Kaplan
Propriété (Name) du Module
Puis dedans tu copie ce qui suis.

Option Explicit
Private Declare Function GetCurrentVbaProject Lib "vba332.dll" _
Alias "EbGetExecutingProj" _
(hProject As Long) As Long
Private Declare Function GetFuncID Lib "vba332.dll" _
Alias "TipGetFunctionId" _
(ByVal hProject As Long, _
ByVal strFunctionName As String, _
ByRef strFunctionID As String) As Long
Private Declare Function GetAddr Lib "vba332.dll" _
Alias "TipGetLpfnOfFunctionId" _
(ByVal hProject As Long, _
ByVal strFunctionID As String, _
ByRef lpfnAddressOf As Long) As Long
#If VBA6 Then
#Else
Public Function AddrOf(CallbackFunctionName As String) _
As Long
'AddressOf operator replacement for Office97 VBA _
Authors: Ken Getz and Michael Kaplan

'declaration of local variables
Dim aResult As Long
Dim CurrentVBProject As Long
Dim strFunctionID As String
Dim AddressOfFunction As Long
Dim UnicodeFunctionName As String

'convert the name of the function to Unicode system
UnicodeFunctionName = StrConv(CallbackFunctionName, _
vbUnicode)
'if the current VBProjects exists...
If Not GetCurrentVbaProject(CurrentVBProject) = 0 Then
'get the function ID of the callback function, _
based on its unicode-converted name, _
in order to ensure that it exists
aResult = GetFuncID(hProject:=CurrentVBProject, _
strFunctionName:=UnicodeFunctionName, _
strFunctionID:=strFunctionID)
'if the function exists indeed ...
If aResult = 0 Then
'get a pointer to the callback function based on the _
strFunctionID argument of the GetFuncID function
aResult = GetAddr(hProject:=CurrentVBProject, _
strFunctionID:=strFunctionID, _
lpfnAddressOf:­dressOfFunction)
'if we've got the pointer pass it to the result _
of the function
If aResult = 0 Then
AddrOf = AddressOfFunction
End If
End If
End If

End Function
#End If

Voilà tu as une inputBox qui ne se ferme que par le bouton OK.

Alain CROS.

"alroussel" a écrit dans le message de news: 3fc65816$0$26793$
Bonsoir à tous,

Je fais encore à vous pour obtenir de l'aide.

je voudrais rendre obligatoire la réponse demandée par un inputbox, c'est-a
dire que tant que l'utilisateur n'aurait pas répondu, chaque fois l'inputbox
réapparaitrais et la suite de la macro ne se déroulerait pas.
voici la partie de la macro concernée:
zzzz = InputBox("IMPORTANT" _
& Chr(13) & "VOUS DEVEZ OBLIGATOIREMENT RENOMMER CETTE FEUILLE" _
& Chr(13) & Chr(13) & "Indiquer ci-dessous le nom choisi" _
& Chr(13) & "(choix libre)", "Listing")
If zzzz = "" Then
MsgBox "VOUS DEVEZ OBLIGATOIREMENT METTRE UN NOM"
...................
End If

Quelle instruction mettre vant le "end if " pour que l'inputbox revienne
tant que l'utilisteur n'aura pas mis de nom ?
et en vraiment subsidiaire, existe t'il un moyen pour que le bouton "annuler
de l'inputbox ne soit pas apparent ?

grand merci d'avance pour l'attention que vous porterez à mon problème

Alain ROUSSEL





--
Cordialement,

Michel Gaboly
http://www.gaboly.com