nombre d'arguments incorrect ou affectation de propriété incorrecte

mikaconny

XLDnaute Nouveau
Bonjour,
je débute en VBA, et j'essaye d’élaborer un outil de gestion de formation.
j'ai un message du type "nombre d'arguments incorrect ou affectation de propriété incorrecte" qui s'affiche.
l'erreur me montre le debut de cette ligne en jaune :"If CTRL = "" Then".
j'ai beau chehcher sur le net mais je ne trouve aucune solution.
pourriez vous m'aider...

la voici:

Private Sub CmdModif1_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim i As Integer
Dim Response As Byte

'ici une boucle sur tous les controls, si un est vide on sort et on set le focus dessus
For Each CTRL In Me.Controls
If CTRL = "" Then MsgBox "Donnée Incomplete", vbCritical, T: CTRL.SetFocus: Exit Sub
Next CTRL


'Si le User tente de change le nom de la ComboBox en Mode Modification
If Me.ComboBox1.ListIndex = -1 Then
MsgBox "Attention comme dans toute Base de Données, le Nom est la Clef de L'enregistrement" & vbCrLf & _
"Ce qui implique que vous ne pouvez pas Modifier cette Clef. " & vbCrLf & _
"Par conséquent pour un changement de Nom vous devez Supprimer l'enregistrement", vbCritical, T & " Warning System Integrity"
Exit Sub 'ON sort si pas de sélection
End If


'Ici une cascade de IF si les controls non pas été changés...
If Nom = ComboBox1 Then
If numéro = TextBox1 Then
If dateobt = TextBox2 Then
If recyclage = TextBox3 Then
MsgBox "Hé alors vous croyez que je ne vais pas voir que vous n'avez rien changé", vbCritical, T & " LOL LOL LOL !!!"
Exit Sub
End If
End If
End If
End If


'Ici un message demandant d'accepter les changement en les listant
Response = MsgBox("Les coordonnées de " & vbCrLf & vbCrLf & _
"Old Nom : " & vbTab & Nom & vbCrLf & _
"New Nom : " & vbTab & ComboBox1 & vbCrLf & vbCrLf & _
"Old numéro : " & vbTab & numéro & vbCrLf & _
"New numéro : " & vbTab & TextBox1 & vbCrLf & vbCrLf & _
"Old dateobt : " & vbTab & dateobt & vbCrLf & _
"New dateobt : " & vbTab & TextBox2 & vbCrLf & vbCrLf & _
"Old recyclage : " & vbTab & recyclage & vbCrLf & _
"New recyclage : " & vbTab & TextBox3 & vbCrLf & vbCrLf & _
"Acceptez vous ces changements ? ", vbQuestion + vbOKCancel, T & " Modification de : " & Nom)

'Si Réponse OK on continue
If Response = 1 Then

'ici avec la Feuille on va faire :
With WS
.Range("F" & Me.ComboBox1.ListIndex + 4) = ComboBox1 'On écrit dans chaque colonne les valeurs des différents controls
.Range("I" & Me.ComboBox1.ListIndex + 4) = TextBox1 'Idem
.Range("J" & Me.ComboBox1.ListIndex + 4) = TextBox2 'Idem
.Range("K" & Me.ComboBox1.ListIndex + 4) = TextBox3 'Idem
With worksheets("PSC1")
.Range("I" & Me.ComboBox1.ListIndex + 4) = TextBox1 'Idem
.Range("J" & Me.ComboBox1.ListIndex + 4) = TextBox2 'Idem
.Range("K" & Me.ComboBox1.ListIndex + 4) = TextBox3 'Idem
End With
End With
'On evoie un message de confirmation
MsgBox "Opération accomplie", vbInformation, T

Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)

'Si Réponse Annulation on envoie un message et on a rien fait
Else: MsgBox "Opération annulée", vbInformation, T
End If

End Sub
 

Staple1600

XLDnaute Barbatruc
Re : nombre d'arguments incorrect ou affectation de propriété incorrecte

Bonjour à tous

Test Ok avec cette syntaxe
(test sur un userform avec trois TextBox, un ComboBox et un CommanButton)
Code:
Private Sub CommandButton1_Click()
Dim CTRL As Control
'ici une boucle sur tous les controls, si un est vide on sort et on set le focus dessus
For Each CTRL In Me.Controls
If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then
If Len(CTRL) = 0 Then
MsgBox "Donnée Incomplete", vbCritical
CTRL.SetFocus
Exit Sub
End If
End If
Next CTRL
End Sub

Code:
Private Sub UserForm_Initialize()
ComboBox1.List = Array("Careful", "With that axe", "Eugene")
End Sub
 

mikaconny

XLDnaute Nouveau
Re : nombre d'arguments incorrect ou affectation de propriété incorrecte

super ça marche...

Cependant j'ai encore un problème lié avec ce que j'ai envoyé.
Je vais mettre la totalité du code a la suite de ce message.

Capture.jpg

J'ai mis également une image pour mieux comprendre.
Dans ce formulaire j'ai créer 2 fenêtres:

- la 1ere permet d'ajouter de nouvelles données dans 2 feuilles différentes,
- la 2eme permet la même chose.

Premier problème rencontrer:
il faut absolument remplir ces 2 formulaires pour en valider un,
or je n'arrive pas a différencier les 2...

Deuxième problème rencontrer:
quand je valide sur la partie PSC1, ça prend en compte les éléments que j'ai modifié (donc pas de souci),
mais quand je valide sur la partie SC1, ça récupère les données déjà enregistré en PSC1 (sur la feuille de calcul), puis ça les remplace par les données affichées en SC1...

c'est un vrai casse tête... je ne trouve pas la bonne solution car soit le problème est celui indiqué ci-dessus, soit c'est l'inverse le SC1 fonctionne mais le PSC1 récupère les données du SC1...

De plus, a l'avenir j'envisage d'exploiter ce code non pas avec 2 fenêtres mais 5 fenêtres...

si vous pouvez m'aider j'exploserais de joie, surtout si la solution a ce problème est trouvé.

voici le code:

Option Explicit

Dim WS As Worksheet 'Variable pour un Objet Worksheet en PUBLIC pour tous les Controls de ce UserForm


Dim Nom As String 'Variable poyr récupérer l'ancienne valeur pour le Bouton Modif
Dim numéro As String 'idem
Dim dateobt As String 'idem
Dim recyclage As String 'idem
Dim Nom2 As String 'Variable poyr récupérer l'ancienne valeur pour le Bouton Modif
Dim numéro2 As String 'idem
Dim dateobt2 As String 'idem
Dim recyclage2 As String 'idem

Const T As String = ""

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'INITIALISATION DU USERFORM============================================================================
Private Sub userform_initialize()
Me.Caption = T
Ini
Call SuppressionCroix(Me)
End Sub
Private Sub Ini()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L As Integer 'Variable pour connaitre le numéro de derniere ligne
Dim i As Integer 'Variable pour connaitre incrémenter les Data

'On Vide tous les Controls
For Each CTRL In Me.Controls
If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then
CTRL = ""
End If
Next CTRL

Me.ComboBox1.Clear 'On vide les précédentes données
Me.ComboBox2.Clear

Set WS = ThisWorkbook.Sheets("GLOBAL") 'On identifie l'objet pour la feuille de travail

L = WS.Range("A65536").End(xlUp).Row 'On identifie la dernière ligne en partant du bas


'Pour éviter les fash d'écran pour le select ci dessous
Application.ScreenUpdating = False



For i = 4 To L 'Boucle départ 4 (Ligne 4 de la feuille, jusqu'à dernière
With Me.ComboBox1 'Avec la ComboBox1
.AddItem WS.Range("F" & i) 'On ajoute dans la ComboBox toutes les valeurs, cellules après cellules
End With
Next i 'Next pour poursuivre la boucle pour le i suivant

For i = 4 To L 'Boucle départ 4 (Ligne 4 de la feuille, jusqu'à dernière
With Me.ComboBox2 'Avec la ComboBox2
.AddItem WS.Range("F" & i) 'On ajoute dans la ComboBox toutes les valeurs, cellules après cellules
End With
Next i 'Next pour poursuivre la boucle pour le i suivant

Application.ScreenUpdating = True
End Sub


' A l'activation on démarre le focus sur la Première Combobox
Private Sub UserForm_Activate()
Me.ComboBox1.SetFocus
Me.ComboBox2.SetFocus

With Me
.StartUpPosition = 3
.Width = Application.Width
.Height = Application.Height
.Left = 0
.Top = 0
End With

End Sub

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'MISE A JOUR DES VALEURS DEPUIS LA COMBOBOX1===========================================================
Private Sub ComboBox1_Click()
If Me.ComboBox1.ListIndex = -1 Then Exit Sub 'ON sort si pas de sélection

TextBox1 = WS.Range("I" & Me.ComboBox1.ListIndex + 4) 'On alimente les données correspondant à la ligne
TextBox2 = WS.Range("J" & Me.ComboBox1.ListIndex + 4) 'de l'index de la Combobox + 4 pour la ligne de Feuille
TextBox3 = WS.Range("K" & Me.ComboBox1.ListIndex + 4) 'de l'index de la Combobox + 4 pour la ligne de Feuille

'ici on initialise les Variable pour mémoriser le valeur précédente en cas de Modif
With Me
Nom = .ComboBox1
numéro = .TextBox1
dateobt = .TextBox2
recyclage = .TextBox3
End With
End Sub

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'MODIFICATION DE VALEUR DU USERFORM====================================================================
Private Sub CommandButton1_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim i As Integer
Dim Response As Byte

'ici une boucle sur tous les controls, si un est vide on sort et on set le focus dessus
For Each CTRL In Me.Controls
If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then
If Len(CTRL) = 0 Then
MsgBox "Donnée Incomplete", vbCritical
CTRL.SetFocus
Exit Sub
End If
End If
Next CTRL


'Si le User tente de change le nom de la ComboBox en Mode Modification
If Me.ComboBox1.ListIndex = 0 Then
MsgBox "Attention comme dans toute Base de Données, le Nom est la Clef de L'enregistrement" & vbCrLf & _
"Ce qui implique que vous ne pouvez pas Modifier cette Clef. " & vbCrLf & _
"Par conséquent pour un changement de Nom vous devez Supprimer l'enregistrement", vbCritical, T & " Warning System Integrity"
Exit Sub 'ON sort si pas de sélection
End If


'Ici une cascade de IF si les controls non pas été changés...
If Nom = ComboBox1 Then
If numéro = TextBox1 Then
If dateobt = TextBox2 Then
If recyclage = TextBox3 Then
MsgBox "Hé alors vous croyez que je ne vais pas voir que vous n'avez rien changé", vbCritical, T & " LOL LOL LOL !!!"
Exit Sub
End If
End If
End If
End If


'Ici un message demandant d'accepter les changement en les listant
Response = MsgBox("Les coordonnées de " & vbCrLf & vbCrLf & _
"Old Nom : " & vbTab & Nom & vbCrLf & _
"New Nom : " & vbTab & ComboBox1 & vbCrLf & vbCrLf & _
"Old numéro : " & vbTab & numéro & vbCrLf & _
"New numéro : " & vbTab & TextBox1 & vbCrLf & vbCrLf & _
"Old dateobt : " & vbTab & dateobt & vbCrLf & _
"New dateobt : " & vbTab & TextBox2 & vbCrLf & vbCrLf & _
"Old recyclage : " & vbTab & recyclage & vbCrLf & _
"New recyclage : " & vbTab & TextBox3 & vbCrLf & vbCrLf & _
"Acceptez vous ces changements ? ", vbQuestion + vbOKCancel, T & " Modification de : " & Nom)

'Si Réponse OK on continue
If Response = 1 Then

'ici avec la Feuille on va faire :
With worksheets("GLOBAL")
.Range("F" & Me.ComboBox1.ListIndex + 4) = ComboBox1 'On écrit dans chaque colonne les valeurs des différents controls
.Range("I" & Me.ComboBox1.ListIndex + 4) = TextBox1 'Idem
.Range("J" & Me.ComboBox1.ListIndex + 4) = TextBox2 'Idem
.Range("K" & Me.ComboBox1.ListIndex + 4) = TextBox3 'Idem
With worksheets("PSC1")
.Range("I" & Me.ComboBox1.ListIndex + 4) = TextBox1 'Idem
.Range("J" & Me.ComboBox1.ListIndex + 4) = TextBox2 'Idem
.Range("K" & Me.ComboBox1.ListIndex + 4) = TextBox3 'Idem
End With
End With
'On evoie un message de confirmation
MsgBox "Opération accomplie", vbInformation, T

Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)

'Si Réponse Annulation on envoie un message et on a rien fait
Else: MsgBox "Opération annulée", vbInformation, T
End If

End Sub

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'MISE A JOUR DES VALEURS DEPUIS LA COMBOBOX2===========================================================

Private Sub ComboBox2_Click()
If Me.ComboBox2.ListIndex = -1 Then Exit Sub 'ON sort si pas de sélection

TextBox4 = WS.Range("L" & Me.ComboBox2.ListIndex + 4) 'On alimente les données correspondant à la ligne
TextBox5 = WS.Range("M" & Me.ComboBox2.ListIndex + 4) 'de l'index de la Combobox + 4 pour la ligne de Feuille
TextBox6 = WS.Range("N" & Me.ComboBox2.ListIndex + 4) 'de l'index de la Combobox + 4 pour la ligne de Feuille

'ici on initialise les Variable pour mémoriser le valeur précédente en cas de Modif
With Me
Nom2 = .ComboBox2
numéro2 = .TextBox4
dateobt2 = .TextBox5
recyclage2 = .TextBox6
End With
End Sub

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
'MODIFICATION DE VALEUR DU USERFORM====================================================================
Private Sub CommandButton3_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim i As Integer
Dim Response As Byte

'ici une boucle sur tous les controls, si un est vide on sort et on set le focus dessus
For Each CTRL In Me.Controls
If TypeOf CTRL Is MSForms.TextBox Or TypeOf CTRL Is MSForms.ComboBox Then
If Len(CTRL) = 0 Then
MsgBox "Donnée Incomplete", vbCritical
CTRL.SetFocus
Exit Sub
End If
End If
Next CTRL


'Si le User tente de change le nom de la ComboBox en Mode Modification
If Me.ComboBox2.ListIndex = -1 Then
MsgBox "Attention comme dans toute Base de Données, le Nom est la Clef de L'enregistrement" & vbCrLf & _
"Ce qui implique que vous ne pouvez pas Modifier cette Clef. " & vbCrLf & _
"Par conséquent pour un changement de Nom vous devez Supprimer l'enregistrement", vbCritical, T & " Warning System Integrity"
Exit Sub 'ON sort si pas de sélection
End If


'Ici une cascade de IF si les controls non pas été changés...
If Nom2 = ComboBox2 Then
If numéro2 = TextBox4 Then
If dateobt2 = TextBox5 Then
If recyclage2 = TextBox6 Then
MsgBox "Hé alors vous croyez que je ne vais pas voir que vous n'avez rien changé", vbCritical, T & " LOL LOL LOL !!!"
Exit Sub
End If
End If
End If
End If


'Ici un message demandant d'accepter les changement en les listant
Response = MsgBox("Les coordonnées de " & vbCrLf & vbCrLf & _
"Old Nom2 : " & vbTab & Nom & vbCrLf & _
"New Nom2 : " & vbTab & ComboBox2 & vbCrLf & vbCrLf & _
"Old numéro2 : " & vbTab & numéro & vbCrLf & _
"New numéro2 : " & vbTab & TextBox4 & vbCrLf & vbCrLf & _
"Old dateobt2 : " & vbTab & dateobt & vbCrLf & _
"New dateobt2 : " & vbTab & TextBox5 & vbCrLf & vbCrLf & _
"Old recyclage2 : " & vbTab & recyclage & vbCrLf & _
"New recyclage2 : " & vbTab & TextBox6 & vbCrLf & vbCrLf & _
"Acceptez vous ces changements ? ", vbQuestion + vbOKCancel, T & " Modification de : " & Nom)

'Si Réponse OK on continue
If Response = 1 Then

'ici avec la Feuille on va faire :
With worksheets("GLOBAL")
.Range("F" & Me.ComboBox2.ListIndex + 4) = ComboBox2 'On écrit dans chaque colonne les valeurs des différents controls
.Range("L" & Me.ComboBox2.ListIndex + 4) = TextBox4 'Idem
.Range("M" & Me.ComboBox2.ListIndex + 4) = TextBox5 'Idem
.Range("N" & Me.ComboBox2.ListIndex + 4) = TextBox6 'Idem
With worksheets("PSC1")
.Range("L" & Me.ComboBox2.ListIndex + 4) = TextBox4 'Idem
.Range("M" & Me.ComboBox2.ListIndex + 4) = TextBox5 'Idem
.Range("N" & Me.ComboBox2.ListIndex + 4) = TextBox6 'Idem
End With
End With
'On evoie un message de confirmation
MsgBox "Opération accomplie", vbInformation, T

Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)

'Si Réponse Annulation on envoie un message et on a rien fait
Else: MsgBox "Opération annulée", vbInformation, T
End If


End Sub
 

Pièces jointes

  • Capture.jpg
    Capture.jpg
    43.5 KB · Affichages: 95
  • Capture.jpg
    Capture.jpg
    43.5 KB · Affichages: 79

Staple1600

XLDnaute Barbatruc
Re : nombre d'arguments incorrect ou affectation de propriété incorrecte

Bonsoir à tous


mikaconny
si vous pouvez m'aider j'exploserais de joie
Et si tu nous faisais plutôt la joie de joindre dans ta discussion une copie anonymisée de ton fichier Excel ?
Cela nous permettrait de tester le code VBA présent dans ce fichier sur nos PC!
Et surtout cela nous éviterait le désagrément de lire un post long comme une journée sans pain , rempli de lignes de code VBA non formatées* qui tel quel ne servent à rien d'autre que nous piquer les yeux ;)

NB: * : pour formater le code VBA, voir et appliquer le conseil dans ma signature ;)
 

Staple1600

XLDnaute Barbatruc
Re : nombre d'arguments incorrect ou affectation de propriété incorrecte

Re

mikaconny
Pas même un petit bonsoir de ta part pour commencer...:rolleyes:

Sinon pourquoi s'embêter avec deux frames ?
Que penses-tu d'utiliser à la place une case à cocher ?
01OnlyONE.png
Selon qu'elle soit cochée ou pas, le titre change.
 

Staple1600

XLDnaute Barbatruc
Re : nombre d'arguments incorrect ou affectation de propriété incorrecte

Re

Il s'agit d'un contrôle Label et d'un contrôle CheckBox
Et voici le code qui change le titre
Code:
Private Sub CheckBox1_Click()
lbTITRE.Caption = IIf(CheckBox1, "PSC1", "SC1")
End Sub

PS: J'ai renommé le label en lbTITRE
 

Discussions similaires

Réponses
6
Affichages
202

Statistiques des forums

Discussions
311 720
Messages
2 081 899
Membres
101 834
dernier inscrit
Jeremy06510