VBA / Erreur d'exécution 1004
Résolu
Horusbk
-
Horusbk -
Horusbk -
Bonjour,
J'ai un formulaire me permettant de modifier toutes les cellules d'une ligne préalablement sélectionnée. Quand je double-clique sur la ligne voulue, j'ai le formulaire qui apparaît. Lorsque je ferme ce dernier (sans avoir fait de modification ou après avoir édité mon classeur) j'ai une erreur 1004 qui apparaît et qui me surligne la ligne suivante :
Voici le code de mon userform :
Ce formulaire est lancé via la feuille "FILTRE" par ces codes :
Un module contient deux déclarations :
Je peux vous passer mon fichier test au besoin.
Bien cordialement,
J'ai un formulaire me permettant de modifier toutes les cellules d'une ligne préalablement sélectionnée. Quand je double-clique sur la ligne voulue, j'ai le formulaire qui apparaît. Lorsque je ferme ce dernier (sans avoir fait de modification ou après avoir édité mon classeur) j'ai une erreur 1004 qui apparaît et qui me surligne la ligne suivante :
.Cells(LaligneFiltre, i) = Me.Controls("Textbox" & i).Value
Voici le code de mon userform :
Option Explicit
Dim i As Long
Private Sub CommandButton1_Click()
With Sheets("FILTRER")
For i = 1 To 17
.Cells(LaligneTout, i) = Me.Controls("Textbox" & i).Value
Next
.Cells(LaligneTout, "Q") = CDate(Me.TextBox17)
End With
With Sheets("ADAPTATION")
For i = 1 To 17
.Cells(LaligneFiltre, i) = Me.Controls("Textbox" & i).Value
Next
.Cells(LaligneFiltre, "Q") = CDate(Me.TextBox17)
End With
Unload UserForm1
End Sub
Private Sub Frame3_Click()
End Sub
Private Sub Label1_Click()
End Sub
Private Sub Label28_Click()
End Sub
Private Sub Label30_Click()
End Sub
Private Sub Label36_Click()
End Sub
Private Sub UserForm_initialize()
With Sheets("FILTRER")
For i = 1 To 17
Me.Controls("label" & i).Caption = .Cells(3, i)
Me.Controls("Textbox" & i).Value = .Cells(LaligneTout, i)
Next
Me.TextBox6.Value = Format(Me.TextBox6, "hh:mm")
Me.TextBox8.Value = Format(Me.TextBox8, "hh:mm")
Me.TextBox17.Value = Format(Me.TextBox17, "dd/mm/yyyy")
End With
End Sub
Ce formulaire est lancé via la feuille "FILTRE" par ces codes :
Option Explicit
Dim Tmp As String, Tmp1 As String, Plage
Private Sub ComboBox21_Change()
Sheets("FILTRER").Range("a4:aa" & Rows.Count).Clear
If ComboBox21.Value = "" Then Exit Sub
With Sheets("ADAPTATION")
Set Plage = .Range("a2:aa" & .Cells.Find("*", , , , xlByRows, xlPrevious).Row)
Plage.AutoFilter Field:=2, Criteria1:=ComboBox21.Value
Plage.Offset(1).Resize(Plage.Rows.Count - 1, Plage.Columns.Count).SpecialCells(xlCellTypeVisible).Copy Sheets("FILTRER").[a4]
End With
Plage.AutoFilter
End Sub
Private Sub Worksheet_Activate()
Dim F As Worksheet, i As Long, mondico, A(), temp
Set F = Sheets("ADAPTATION")
Set mondico = CreateObject("Scripting.Dictionary")
A = F.Range("b2:b" & F.Cells(F.Rows.Count, "c").End(xlUp).Row)
For i = LBound(A) To UBound(A)
If A(i, 1) <> "" Then mondico(A(i, 1)) = ""
Next i
'--avec tri
temp = mondico.keys
Call Tri(temp, LBound(temp), UBound(temp))
Sheets("FILTRER").ComboBox21.List = temp
'Sheets("FILTRER").ComboBox21.Value = ""
End Sub
Sub Tri(A, gauc, droi) ' Quick sort
Dim Ref As String, g As Long, d As Long, temp
Ref = A((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While A(g) < Ref: g = g + 1: Loop
Do While Ref < A(d): d = d - 1: Loop
If g <= d Then
temp = A(g): A(g) = A(d): A(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call Tri(A, g, droi)
If gauc < d Then Call Tri(A, gauc, d)
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim i As Long, c
Cancel = True
With Sheets("FILTRER")
Set Plage = .Range("a4:aa" & .Cells.Find("*", , , , xlByRows, xlPrevious).Row)
End With
If Intersect(Target, Plage) Is Nothing Or [a4] = "" Then Exit Sub
With Sheets("ADAPTATION")
Set Plage = .Range("a3:aa" & .Cells.Find("*", , , , xlByRows, xlPrevious).Row)
End With
Tmp = ""
LaligneTout = Target.Row
For i = 1 To 17: Tmp = Tmp & Cells(Target.Row, i): Next
For Each c In Plage.Rows
Tmp1 = ""
For i = 1 To 17: Tmp1 = Tmp1 & Sheets("ADAPTATION").Cells(c.Row, i): Next
If Tmp = Tmp1 Then LaligneFiltre = c.Row
Next
UserForm1.Show
End Sub
Un module contient deux déclarations :
Option Explicit
Public LaligneFiltre As Long
Public LaligneTout As Long
Je peux vous passer mon fichier test au besoin.
Bien cordialement,
A voir également:
- Excel vba erreur 1004
- Erreur 1004 vba - Meilleures réponses
- Vba error 1004 - Meilleures réponses
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Erreur 3005 france tv - Forum TV & Vidéo
- Déplacer colonne excel - Guide
- Si ou excel - Guide
5 réponses
Bonjour à tous, j'avais supprimé mon message pour le compléter,
et Horusbk y a répondu entre-temps ; je poste de nouveau mon
message à votre intention.
Bonjour Horusbk,
Ma réponse est par rapport à ton 1er message (pas le 2ème).
La ligne que tu as indiquée est dans cette partie du code VBA
de ton UserForm :
Donc :
a) Vérifie le nom de ta feuille : est-ce bien "ADAPTATION" ?
b) As-tu réellement 17 Textbox, de Textbox1 à Textbox17 ?
c) Lalignefiltre est Long : ok ; mais pour i, un Byte suffit.
d) Mets Next i plutôt que Next : ce sera plus rapide.
e) Au lieu de Unload UserForm1 mets : Unload Me
À tout hasard, essaye avec :
Mais normalement, ça devrait faire pareil.
NB : Personnellement, je préfère mettre la sub UserForm_initialize()
en premier, donc juste après Option Explicit, car c'est elle qui est
exécutée en 1er dès l'ouverture du formulaire ; bien sûr, cela ne
change rien au résultat du code VBA, mais à la lecture du code
de ton UserForm, tu vois d'emblée le travail qui est fait de suite,
et qui a son importance pour la suite du code.
Si ton problème est réglé, merci de passer le sujet en résolu ;
sinon, je te laisse voir la suite avec yg_be.
et Horusbk y a répondu entre-temps ; je poste de nouveau mon
message à votre intention.
Bonjour Horusbk,
Ma réponse est par rapport à ton 1er message (pas le 2ème).
La ligne que tu as indiquée est dans cette partie du code VBA
de ton UserForm :
With Sheets("ADAPTATION") For i = 1 To 17 .Cells(LaligneFiltre, i) = Me.Controls("Textbox" & i).Value Next .Cells(LaligneFiltre, "Q") = CDate(Me.TextBox17) End With Unload UserForm1
Donc :
a) Vérifie le nom de ta feuille : est-ce bien "ADAPTATION" ?
b) As-tu réellement 17 Textbox, de Textbox1 à Textbox17 ?
c) Lalignefiltre est Long : ok ; mais pour i, un Byte suffit.
d) Mets Next i plutôt que Next : ce sera plus rapide.
e) Au lieu de Unload UserForm1 mets : Unload Me
À tout hasard, essaye avec :
With Sheets("ADAPTATION") For i = 1 To 17 .Cells(LaligneFiltre, i) = Controls("Textbox" & i) Next i .Cells(LaligneFiltre, "Q") = CDate(TextBox17) End With Unload Me
Mais normalement, ça devrait faire pareil.
NB : Personnellement, je préfère mettre la sub UserForm_initialize()
en premier, donc juste après Option Explicit, car c'est elle qui est
exécutée en 1er dès l'ouverture du formulaire ; bien sûr, cela ne
change rien au résultat du code VBA, mais à la lecture du code
de ton UserForm, tu vois d'emblée le travail qui est fait de suite,
et qui a son importance pour la suite du code.
Si ton problème est réglé, merci de passer le sujet en résolu ;
sinon, je te laisse voir la suite avec yg_be.
Je me suis demandé pourquoi je ne voyais plus ton message... mais voilà l'explication.
J'ai ajusté la place de UserForm_initialize() comme tu l'as conseillé.
Encore merci de ton aide.
Baptiste.