Vous utilisez un navigateur obsolète. Il se peut que ce site ou d'autres sites Web ne s'affichent pas correctement. Vous devez le mettre à jour ou utiliser un navigateur alternatif.
voici mon problème:
j'ai un userform pour rajouter une référence:
-en page 2 de l'userform
-combobox3 choix famille
-combobox4 écrire la référence à rajouter
-puis clic "ajouter"
L'onglet "bacs" ,l'insertion ligne automatique fonctionne très(trouver formule marco sur le forum)
mon problème est que j'aimerais pouvoir le faire sur toute les feuilles de mon classeur et là je bloque.
les noms de lignes ou cellules sont unique à la feuille!!!!
L'onglet "bacs" ,l'insertion ligne automatique fonctionne très(trouver formule marco sur le forum)
mon problème est que j'aimerais pouvoir le faire sur toute les feuilles de mon classeur et là je bloque.
les noms de lignes ou cellules sont unique à la feuille!!!!
je désolé si vous ne m'avez pas compris mais quand on a le nez dans son programme pendant 2 semaines, je le connais tellement par cœur que ça me paraît évident.
Donc j'essaie de bien m'expliquer:
Pour être simple, je voudrais copier/insérer une ligne en fin de mon tableau avant de pouvoir rajouter une référence depuis userform.
J’ai réussie à trouver un code VBA, qui fonctionne que sur ma feuille "bacs".
Je n'arrive pas à l'adapter sur les autres feuilles.
On fait une boucle tant que Counter >0, on insère une ligne devant "ligne_ref", qu'on copie sur la nouvelle qu'on vient d'insèrer, et on décrémente Counter ???
Comme Counter = 1, ta boucle ne fonctionnera qu'une unique fois, et ne sert donc strictement à rien.
Le code utilise des select/ActiveCell qui ne servent qu'à le ralentir
Code:
Application.ScreenUpdating = True
Application.CutCopyMode = False
End Sub
Ça c'est OK
En regardant ton code, et d'après tes explications, c'est un code que tu as "pompé", mais sans comprendre réellement toutes les instructions : Tu utilises une plage nommée, qui appartient à une feuille précise => tu ne peux pas utiliser ce code ailleurs que sur la feuille qui contient la plage nommée ligne_ref.
Ce que je comprends :l'avant-dernière ligne de ta feuille est une ligne cachée qui sert de modèle et que tu dois copier et insérer pour les nouvelles données. Ce qui me donne :
Code:
Sub copieligne()
Dim X As Long
Application.ScreenUpdating = False 'Bloque la gestion écran
X = Cells(Rows.Count, "B").End(xlUp).Row - 1 'dernière ligne non-vide de B -1
Rows(X).Insert ' insertion des cellules copiées ligne X
Rows(X + 1).Copy Rows(X) ' copie ligne X+1 sur ligne nouvellement créée
Rows(X).Hidden = False ' affiche ligne X
Application.ScreenUpdating = True 'débloque la gestion écran
Application.CutCopyMode = False ' enlève les tirets clignotants mode copie
End Sub
On peut discuter de la manière de trouver la ligne de référence : j'ai pris la dernière non-vide en B, mais on pourrait chercher celle qui contient une cellule de valeur = "TOTAL"
Comme je n'ai pas défini de feuille, ma macro prend celle donnée par défaut : Activesheet.
Il suffit donc que les feuilles sur lesquelles je veux l'appliquer aient le même formatage : avant-dernière ligne formatée, cachée et la dernière comportant en B le mot "TOTAL", et que j'active la bonne feuille avant.
Avant de modifier les macros de ton USF, de manière à ne plus être obligé d'activer la "bonne" feuille, mais de la nommer dans la macro, il serait préférable de bien comprendre le code : comme c'est un segment indépendant, tu peux le tester pas-à-pas, et voir comment il évolue, ce qu'il fait, que contiennent les variables, etc.
J'ai l'air de pontifier, mais ce qui est réellement important, c'est de bien comprendre le code qu'on utilise, sous peine de faire des erreurs destructrices.
Il ne faut jamais hésiter à poser des questions, jusqu'à une compréhension réelle de ce qu'on fait.
A+
Je suis débutant dans le VBA donc il est vrai,et je le cache pas, que j'ai "pompé" ce code sur le site.J'essaie avant de poste de comprendre le code et de l'adapter pour mon projet.
bon, ce qui est du code ,le tiens fonctionne mais il fonctionne que si on est sur la feuille en cours.
Par contre il ne fonctionne pas si la feuille est masqué???
Il fonctionne, mais tu ne peux pas activer une feuille masquée .
Avant de continuer, des petits conseils :
- Prends l'habitude de renommer tes contrôles, sous peine d'erreurs.
Surtout que là tes contrôles sont sur un multipage, ce qui ne simplifie pas le décodage : il est toujours plus facile de savoir à quoi à trait P2_CB_Famille (combobox de famille sur la page 2) que ComboBox3.
Et une fois que ton code est bien commencé, c'est trop la galère de tout refaire.
- Défini bien les propriétés importantes de tes contrôles : ton but es de ne jamais générer d'erreur. un exemple sur ta Combobox3 : la propriété MatchRequired, vu ton code dans "Private Sub ComboBox3_Change()", doit être sur True : tu dois obligatoirement choisir dans la liste sinon "With Sheets(ComboBox3.Text)" va déclencher une erreur.
Comme tu a codé RowSource : BD!A2:A4 => tu as une possibilité de sélectionner un blanc => lui mettre une plage nommée dynamique :
tu sélectionne A1 de BD => menu Insertion>>nom définir
Noms dans le classeur : Famille
Fait référence à :
Code:
=DECALER(BD!$A$1;1;0;NBVAL(BD!$A$2:$A$100);1)
Pour tester : C1 => Menu donnée>>Validation
Autoriser : liste
source : =Famille
et tu teste en ajoutant des famille et en les effaçant. Après, tu mets en propriété de ta Combobox famille => RowSource : Famille
Le code du bouton "ajouter"
Code:
Private Sub ajouter_Click()
'Déclaration ================================
Dim Cel As Range, X As Long
'MEI =======================================
Application.ScreenUpdating = False
'Traitement ================================
With Sheets(ComboBox3.Text)
If Me.ComboBox4.ListIndex = -1 Then ' Une référence de rajoutée
X = .Cells(Rows.Count, "B").End(xlUp).Row - 1
.Rows(X).Insert
.Rows(X + 1).Copy .Rows(X)
.Rows(X).Hidden = False
.Cells(X, "A") = Me.ComboBox4
Else
Set Cel = .Columns("A").Find(what:=Me.ComboBox4, LookIn:=xlValues, lookat:=xlWhole)
If Not Cel Is Nothing Then
X = Cel.Row
' Else
' MsgBox "ne doit pas arriver"
' Exit Sub 'Même si ça n'existe pas, il faut prévoir une sortie
End If
End If
.Cells(X, "B") = Me.TextBox4
.Cells(X, "C") = Me.TextBox5
.Cells(X, "D") = Me.TextBox6
'ranger colonne A par ordre alphabetique
'******************************************
'pas sûr du fonctionnement
.Rows("2:500").Sort Key1:=.Range("A2"), Order1:=xlAscending
' si ça ne fonctionne pas :
'.Visible = True
'.Rows("2:500").Sort Key1:=.Range("A2"), Order1:=xlAscending
'.Visible = False
End With
Unload Me
stocks.Show
Application.ScreenUpdating = True
End Sub
Tu reconnaîtras le code de CopieLigne, qui ne sert plus.
C'est toi qui utilise ton fichier, il faut donc que tu l'adaptes de la manière la plus utile pour toi.
- Famille : j'ai prévu de ligne 2 à 100 => il ne faut pas utiliser cette plage pour autre chose => À toi de la modifier si nécessaire.
- Tu prévois en cas de nouvelle référence de modifier la légende du bouton ajouter... mais pas de vider les textbox4, 5 et 6 ?
- Je suis peut-être trop puriste, mais garder un intitulé "N° facture" (Label7) et l'écrire dans une colonne intitulée PU...
A+
pierrot93 merci pour le liens mais c'est un de mes post
Gorfael,j'ai bien compris tes petits conseils et j'esserais de les appliquer.
je comprends aussi qu'utiliser RowSource peut gèrer des problèmes.
C'est toi qui utilise ton fichier, il faut donc que tu l'adaptes de la manière la plus utile pour toi.
- Famille : j'ai prévu de ligne 2 à 100 => il ne faut pas utiliser cette plage pour autre chose => À toi de la modifier si nécessaire.
Comme tu a codé RowSource : BD!A2:A4 => tu as une possibilité de sélectionner un blanc => lui mettre une plage nommée dynamique :
tu sélectionne A1 de BD => menu Insertion>>nom définir
Noms dans le classeur : Famille
Fait référence à :
Code :
=DECALER(BD!$A$1;1;0;NBVAL(BD!$A$2:$A$100);1)Pour tester : C1 => Menu donnée>>Validation
Autoriser : liste
source : =Famille
et tu teste en ajoutant des famille et en les effaçant. Après, tu mets en propriété de ta Combobox famille => RowSource : Famille
j'ai plutôt utilisé ce code plus facile pour moi car beaucoup de combobox dans mon fichier
Code:
Private Sub UserForm_Initialize()
Dim J As Long
With Sheets("BD")
For J = 2 To Range("A65536").End(xlUp).Row
Me.ComboBox3.AddItem .Cells(J, "A")
Next J
End With
End Sub
merci
j'ai encore quelque question mais je ferais d'autre post
Ce site utilise des cookies pour personnaliser le contenu, adapter votre expérience et vous garder connecté si vous vous enregistrez.
En continuant à utiliser ce site, vous consentez à notre utilisation de cookies.