Erreur d'exécution '1004'

guenfood

XLDnaute Occasionnel
Bonjour,

J'ai le code suivant sur un bouton de validation d'un userform :

Code:
Private Sub CommandButton1_Click()
'sélection de la feuille
If Formulairedesaisie.OptionButton1 = True Then feuille = 2
If Formulairedesaisie.OptionButton2 = True Then feuille = 3
If Formulairedesaisie.OptionButton3 = True Then feuille = 4
'Enregistrement des données sur la feuille
Sheets(feuille).Range('A3').End(xlDown).Offset(1, 0) = Sheets(feuille).Range('A3').End(xlDown) + 1
Sheets(feuille).Range('A3').End(xlDown).Offset(0, 1) = Formulairedesaisie.Datereception
Unload Me
ActiveWorkbook.Save
End Sub

Lors de l'exécution de ce code, j'ai un message d'erreur d'exécution '1004', et lorsque je clique sur 'débogage', j'ai le code
Code:
Sheets(feuille).Range('A3').End(xlDown).Offset(1, 0) = Sheets(feuille).Range('A3').End(xlDown) + 1
qui est surligné.

Où est l'erreur ?

Merci par avance.
 

pierrejean

XLDnaute Barbatruc
bonjour guenfood

a premiere vue et pour peu que la variable feuille contienne bien le nom d'une feuille existante ta ligne est saine
en tout cas je l'ais testée avec succes sans rien y changer

edit: je viens de relire le code
en fait feuille contiendrait un chiffre
fait un test en mettant
msgbox(feuille)
avant la ligne en Question

Message édité par: pierrejean, à: 18/04/2006 10:48
 

guenfood

XLDnaute Occasionnel
Oui, la msgbox me retourne '2'.
Normal, puisque je clique sur l'option bouton correspondant à la 2eme feuille.

J'ai fait une petite modif, mais toujours le même problème.
Je joins le fichier pour exemple.

Message édité par: guenfood, à: 18/04/2006 11:41
 

guenfood

XLDnaute Occasionnel
:eek:
L'erreur vient de là !!

Juste une autre petite question.
Avec ce code cela ne me remplit que la colonne avec les données de 'Datereception'.
Comment faire pour que les données de tous les champs de mon userform incrémentent toutes mes colonnes en rapport ?

Est-ce que je dois écrire autant de fois
Code:
Sheets(feuille).Range('A3').End(xlDown).Offset(0, 1) = Formulairedesaisie.Datereception
en changeant 'Datereception' par le nom des champs ?

Sinon, comment faire ??

Merci par avance.
 

pierrejean

XLDnaute Barbatruc
re

il est probablement possible de creer une boucle permettant de balayer tous les controles de l'userform et alimenter les colonnes correspondantes mais sans le fichier je ne peux pas le faire

Si un de nos 'Grands Maitres' passe par la il pourra surement te proposer un exemple

Amicalement
 

Hervé

XLDnaute Barbatruc
bonjour guenfoof, pierrejean :)

sans etre un grand maitres, une proposition en piece jointe, les explications se trouvent dedans.

salut [file name=Classeur2_20060418155207.zip size=10813]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/Classeur2_20060418155207.zip[/file]
 

Pièces jointes

  • Classeur2_20060418155207.zip
    10.6 KB · Affichages: 24

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour PierreJean, GuenFood, Hervé, les 'Grands Maîtres' qui passeront par là, le Forums

Tu as été plus rapide que moi Hervé, mais je vais regarder maintenant ta proposition en attendant les 'Grands Maîtres' lol


Moi je conseillerai à GuenFood d'abandonner une Dénomination à la manière 'Datereception' etc pour tes Contrôles TextBox, c'est plus compliqué qu'autre chose à gérer...

On ne les nomme pas du tout et c'est encore plus simple...


'=============================================================================
'Exemple Un UserForm avec
'
' Dix TexBox Nommées respectivement :
'
'Texbox1, TextBox2, ......... Etc..  TextBox10
'
' Un CommandButton nommé 'CommandButton1'
'
' Trois OptionButtons Nommés
'
'OptionButton1, OptionButton2, OptionButton3
'==============================================================================


Private Sub UserForm_Initialize()
Dim x As Byte

For x = 1 To 10
    Me.Controls('TextBox' & x).Value = 'Toto ' & x
Next

Me.OptionButton1 =
True
End Sub



Private Sub CommandButton1_Click()
Dim x As Byte, FeuilleNum As Byte
Dim CellCible As Range


If Me.OptionButton1 = True Then FeuilleNum = 1
If Me.OptionButton2 = True Then FeuilleNum = 2
If Me.OptionButton3 = True Then FeuilleNum = 3



Set CellCible = Sheets(FeuilleNum).Range('A3').End(xlDown)

   
If CellCible.Row = 65536 Then
        MsgBox 'Badaboum on est tombé en bas de la Feuille', vbCritical, 'LOL'
       
Exit Sub
   
End If

CellCible.Offset(1, 0) = Val(CellCible.Value) + 1

For x = 1 To 10
    CellCible.Offset(1, x) = Controls('TextBox' & x).Value
Next


End Sub




Si tu veux vraiment nommer tes Contrôles, alors une méthode classique et conventionelle serait de nommer tes TextBox ainsi

[li]TxbDateReception01[/li]
[li]TxbNomFamille00002[/li]
[li]TxbPrenom000000003[/li]
[li]TxbAdresse00000004[/li]
[li]TxbVille0000000005[/li]



'=============================================================================
'Exemple Un UserForm avec
'
' Cinq TexBox Nommées respectivement :
'
'TxbDateReception01
'TxbNomFamille00002
'TxbPrenom000000003
'TxbAdresse00000004
'TxbVille0000000005
'
' Un CommandButton nommé 'CommandButton1'
'==============================================================================


Private Sub UserForm_Initialize()
Dim x As Byte, i As Byte

For x = 0 To Me.Controls.Count - 1
   
If TypeOf Me.Controls(x) Is MSForms.TextBox Then
       
If Left(Me.Controls(x).Name, 3) = 'Txb' Then
            i = i + 1
            Me.Controls(x).Value = 'Toto ' & i
       
End If
   
End If
Next

End Sub



Private Sub CommandButton1_Click()
Dim Col As Byte
Dim CellCible As Range
Dim CTRL As Control


Set CellCible = Sheets('Feuil1').Range('A3').End(xlDown)

   
If CellCible.Row = 65536 Then
        MsgBox 'Badaboum on est tombé en bas de la Feuille', vbCritical, 'LOL'
       
Exit Sub
   
End If

CellCible.Offset(1, 0) = Val(CellCible.Value) + 1


For Each CTRL In Me.Controls
   
If TypeOf CTRL Is MSForms.TextBox Then
       
If Left(Me.Controls(x).Name, 3) = 'Txb' Then
            Col = Val(Right(CTRL.Name, 2))
            CellCible.Offset(1, Col) = CTRL.Value
            MsgBox CTRL.Name & ' ' & CTRL.Value
       
End If
   
End If
Next
End Sub


Bon Courage
[ol]@+Thierry[/ol]


EDITION !!!
Ah bien oui Hervé, l'astuce des 'Tag' ça me rappelle des UserForms ça ;) Merci qui...
Merci Ti_ !

Message édité par: _Thierry, à: 18/04/2006 16:07
 

guenfood

XLDnaute Occasionnel
Merci pour vos réponses.

Je vais essayer avec ca et je vous tiens au courant.

Juste une petite question de débutant :eek:

Sur mon userform, j'ai 9 TextBox, 1 ComboBox, et 1 OptionButton qui doivent alimenter mes feuilles de données.

Avec vos codes, no problemo pour les TextBox.
Mais quid pour la Combobox et l'OptionButton ??
 

Hervé

XLDnaute Barbatruc
Bonjour tout le monde

Guenfood, que tu ai 4 txtbox ou 9 si tu completes correctement la propriété tag de tes controles, tu ne devrait pas avoir de souci

pour les combobox, si il s'agit uniquement de renvoyer la valeur sans test préalable, pas de souci non plus, sinon une petite adaptation est nécessaire.

quant aux optionbutton, si ta volonté est de renvoyé vrai ou faux, là aussi pas de problème, par contre si tu veux renvoyer le caption, il te faut adapter le code :

exemple d'adaptation pour 9 txtbox, 1 combo et 1 ob avec les tag stockant les numéros de colonnes de 1 à 11.et renvoi du caption de l'ob au lieu du value :


Private Sub CommandButton1_Click()
Dim ctrl As Control
Dim derligne As Integer

derligne = Range('a65536').End(xlUp).Row + 1

'pour chaque controle dans l'userform
For Each ctrl In Me.Controls
       
'si la propriété tag n'est pas vide
       
If Not ctrl.Tag = '' Then
               
Select Case Val(ctrl.Tag)
                       
Case 1 To 10: Cells(derligne, Val(ctrl.Tag)) = ctrl 'renvoi txtbox et combobox
                       
'renvoi caption de l'optionbutton si coché sinon vide
                       
Case 11: Cells(derligne, Val(ctrl.Tag)) = IIf(ctrl, ctrl.Caption, '')
               
End Select
       
End If
Next ctrl

End Sub


salut
 

guenfood

XLDnaute Occasionnel
Merci pour ta réponse Hervé.

J'ai donc ajouté ton code sur mon bouton de validation d'userform, ce qui me donne :
Code:
Private Sub CommandButton1_Click()
'sélection de la feuille
If Formulairedesaisie.OptionButton1 = True Then feuille = 'Base'
If Formulairedesaisie.OptionButton2 = True Then feuille = 'ROM RCLI VPO50'
If Formulairedesaisie.OptionButton3 = True Then feuille = 'LCR'
'Enregistrement des données sur la feuille
Sheets(feuille).Range('A2').End(xlDown).Offset(1, 0) = Sheets(feuille).Range('A2').End(xlDown) + 1
Dim ctrl As Control
Dim derligne As Integer

derligne = Range('a65536').End(xlUp).Row + 1

'pour chaque controle dans l'userform
For Each ctrl In Me.Controls
        'si la propriété tag n'est pas vide
        If Not ctrl.Tag = '' Then
                Select Case Val(ctrl.Tag)
                        Case 1 To 10: Cells(derligne, Val(ctrl.Tag)) = ctrl 'renvoi txtbox et combobox
                        'renvoi caption de l'optionbutton si coché sinon vide
                        Case 11: Cells(derligne, Val(ctrl.Tag)) = IIf(ctrl, ctrl.Caption, '')
                End Select
        End If
Next ctrl

MsgBox 'Votre dossier a été enregistré sous le numéro ' & Sheets(feuille).Range('A2').End(xlDown)
Unload Me
ActiveWorkbook.Save
End Sub

Je saisis tous les contrôles de mon userform, je valide, j'ai bien ma msgbox me donnant le numéro de dossier enregistré, mais quand je vais sur la feuille, les champs sont vides.
Je n'ai que le numéro de dossier qui a été créé.

Où est le problème ?
 

Discussions similaires

Statistiques des forums

Discussions
312 345
Messages
2 087 482
Membres
103 556
dernier inscrit
titboine