Problème insertion ligne automatique

regnum

XLDnaute Junior
bonsoir à tous le forum,

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!!!!

merci si quelqu'un à une idée...;)
 

Pièces jointes

  • regnum UsFGestionStock V002.xls
    99.5 KB · Affichages: 70
Dernière édition:
C

Compte Supprimé 979

Guest
Re : Problème insertion ligne automatique

Salut Regnum

Pour trouver la dernière ligne d'une feuille et pouvoir ainsi ajouter des valeurs
il suffit de faire :
Code:
DLig = Sheets("NomFeuille").Range("A" & Rows.Count).End(XlUp).Row

Si ça peut t'aider, A+
 

Gorfael

XLDnaute Barbatruc
Re : Problème insertion ligne automatique

Salut regnum et le forum
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!!!!
Même pas une idée de ce que signifie ton charabia. et tes plages nommées me renvoient #REF! Et à voir la réponse d BrunoM45, je ne suis pas le seul.

Il n'y a ni télépathe, ni devin sur ce site et le seul pour qui c'est évident, c'est toi !
A+
 

regnum

XLDnaute Junior
Re : Problème insertion ligne automatique

Bonjour brunoM45,Gorfael et le forum

Il n'y a ni télépathe, ni devin sur ce site et le seul pour qui c'est évident, c'est toi !
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.

J’espère que j'ai été assez clair...

J’ai simplifié mon fichier.
 

Pièces jointes

  • insertion ligne.xls
    97 KB · Affichages: 60
  • insertion ligne.xls
    97 KB · Affichages: 64
  • insertion ligne.xls
    97 KB · Affichages: 67

Gorfael

XLDnaute Barbatruc
Re : Problème insertion ligne automatique

Salut regnum et le forum
Beaucoup de code pour pas grand chose :
regardons ta macro
Code:
Sub copieligne()
Application.ScreenUpdating = False
Ça, c'est bon, on accélère le traitement en ne rafraîchissant pas l'écran
Code:
monNombre = 1
ActiveSheet.Select
Range("NBLIGNES").Activate
Selection.FormulaR1C1 = 1
Counter = ActiveCell.Value
J'arrive au même résultat fonctionnel avec
Counter =1 avec un peu moins de code, il est vrai, et sans ma préoccuper de la feuille
Code:
While Counter > 0
    Application.Goto Reference:="ligne_ref" 
    Selection.Insert Shift:=xlDown
    Application.Goto Reference:="ligne_ref"
    Selection.Copy
    ActiveCell.Offset(-1, 0).Range("A1").Select
    ActiveSheet.Paste
    Selection.EntireRow.Hidden = False
    ActiveCell.Select
 Counter = Counter - 1
 Wend
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+
 

regnum

XLDnaute Junior
Re : Problème insertion ligne automatique

Bonjour Gorfael et le forum

je te remercie pour ta réponce très complete.

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é???

une idée...

merci A+
 

Gorfael

XLDnaute Barbatruc
Re : Problème insertion ligne automatique

Salut regnum et le forum
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+
 
Dernière édition:

regnum

XLDnaute Junior
Re : Problème insertion ligne automatique

rebonjour a tous

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.
ça c'est OK je vais voir en fonction de mon fichier.

- 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 ?
oui,c'est une partie de mon fichier que j'ai modifié pour mes testes.l'original vide les textbox.

- Je suis peut-être trop puriste, mais garder un intitulé "N° facture" (Label7) et l'écrire dans une colonne intitulée PU...
une erreur de ma part, un oublie de modification.

je regarde tous ça et vous tiens au courant.
merci de prendre le temps de me répondre...ce forum à des participants super;)
 

regnum

XLDnaute Junior
Re : Problème insertion ligne automatique

bonjour eu forum

Gorfael:ton fonctionne bien merci.

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

A+
 

Discussions similaires

Réponses
3
Affichages
778

Statistiques des forums

Discussions
312 509
Messages
2 089 144
Membres
104 050
dernier inscrit
Pepito93100