Cellule vide sous un tableau excel

Résolu
Skeo -  
Polux31 Messages postés 7219 Statut Membre -
Bonjour!

Mais question va vous paraitre simpliste mais ce n'est pas du tout évident pour moi...

J'ai un tableau qui s'étend de B5 à B13 (ou B5 contient le titre du tableau) et je voudrai pouvoir sélectionner la première cellule vide sous le tableau pour y insérer une nouvelle valeur. J'ai essayé d'y parvenir avec:

Range("B5").Activate
Range(Selection, Selection.End(xlDown)).Offset(-1, 0).Activate

Message = InputBox("Entrez un nouvel employé :", "Ajout d'un employé", "Nom de l'employé suivi de la première lettre du prénom")
If Message = "" Then Exit Sub
ActiveSheet.Unprotect
Selection.Insert Shift:=xlDown
ActiveCell.Offset = Message
ActiveSheet.Protect

Mais ça n'a pas l'effet escompté puisque ça décale tout le tableau à la dernière cellule vide et que la valeur saisie se retrouve à la place du titre....

Je ne pense pas que cela soit très compliqué mais ça dépasse mes (faibles) compétences.
Si vous pensez pouvoir m'aide...

Merci d'avance de vos réponses!

7 réponses

  1. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Pour avoir la dernière ligne de ton tableau

    Dim DerLig As Long
    
    Derlig = Range("B5").End(xlDown).Row + 1


    Pour ton exemple :

    Dim DerLig As Long
    
    Derlig = Range("B5").End(xlDown).Row + 1
    
    Message = InputBox("Entrez un nouvel employé :", "Ajout d'un employé", "Nom de l'employé suivi de la première lettre du prénom")
    If Message = "" Then Exit Sub 
    
    ActiveSheet.Unprotect 
    Range("B" & DerLig).Value = Message
    ActiveSheet.Protect 


    Évite d'utiliser le .Select. Si tu mets :

    Range("B21").Select
    Selection.Value = "Toto"


    C'est pareil à :
    Range("B21").Value = "Toto"


    Le .Select ralenti l'exécution et n'est pas nécessaire.

    ;o)
    1
  2. elbosador Messages postés 44 Statut Membre 4
     
    J'aurais pensé à faire une boucle entre ta ligne 5 et 13 et si il trouve une cellule vide il te demande d'entrer tes informations.

    For i = ActiveCell.Row To 13

    'Si la case est vide
    If Range("D" & i).Value = "" Then
    'Alors demande des infos
    Message = InputBox("Entrez un nouvel employé :", "Ajout d'un employé", "Nom de l'employé suivi de la première lettre du prénom")

    'Si tu veux remplir qu'une case autrement enlève l'etiquette
    GoTo 5

    End If

    i = i + 1

    Next

    5

    Par sur que ca marche je suis aussi débutant ^^
    0
  3. Skeo
     
    Merci beaucoup à tout les deux!!!

    J'ai choisi la solution de polux31 parce que je ne suis pas bien rodé à l'utilisation des boucles ;) En tout cas ça marche très bien j'ai juste modifier les bordures pour que ça soit correct d'un point de vue visuel et c'est bon!!!

    Private Sub CommandButton12_Click()
    Dim DerLig As Long

    Unload UserForm1
    Sheets("Employés").Select

    DerLig = Range("employés_titre").End(xlDown).Row + 1
    Message = InputBox("Entrez un nouvel employé :", "Ajout d'un employé", "Nom de l'employé suivi de la première lettre du prénom")
    If Message = "" Then Exit Sub

    ActiveSheet.Unprotect
    Range("B" & DerLig).Value = Message

    Range("B" & DerLig).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
    .LineStyle = xlContinuous
    .Weight = xlThick
    .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .Weight = xlThin
    .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
    .LineStyle = xlContinuous
    .Weight = xlThick
    .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
    .LineStyle = xlContinuous
    .Weight = xlThick
    .ColorIndex = xlAutomatic
    End With
    ActiveSheet.Protect

    Sheets("S0").Select
    End Sub

    Pour ce qui est des Select je suis d'accord et je sais bien qu'il ne faut pas vraiment faire comme ça mais c'est que je ne suis pas bien habitué. Connaitriez vous un tuto pour se perfectionner sur ce point?

    Merci encore!
    0
  4. Skeo
     
    En fait il y quand même un petit problème...

    Se tableau est utilisé dans une liste et les valeurs de la combobox sont attribuées par l'intermédiaire de RowSource dans les propriétés. Mais les valeurs que l'on rajoute ne font pas partie de la liste... Sauriez vous comment y remédier?

    En fait je cherche un code qui permette de désigner la liste par exemple:

    Private Sub ComboBox1_Change()
    combobox1.listindex = de employé_titre.offset(-1,0) : dernier ligne non vide
    salarie = ComboBox1.Value
    End Sub

    Merci
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Skeo
     
    Je viens d'essayé avec ce code

    Private Sub ComboBox1_Change()
    Dim der_case As Long
    Dim prem_case As Long
    prem_case = Range("employés_titre").Offset(-1, 0)
    case_case = Range("employés_titre").End(xlDown).Row
    salarie = ComboBox1.Value
    End Sub

    Mais je ne peut pas (me semble-t-il) définir la plag source de cette manière:

    rowsource : B&prem_case:B&der_case

    ça renvoit une erreur disant "valeur de propriété non valide"
    0
  7. Skeo
     
    J'ai également essayé avec ça:

    Private Sub ComboBox1_Change()
    Range("employés_titre").Offset(-1, 0).Select
    Range(Selection, Selection.End(xlDown)).Select
    ActiveWorkbook.Names.Add Name:="employés", RefersToR1C1:= _
    "=Employés!R6C2:R14C2"
    salarie = ComboBox1.Value
    End Sub

    Pas plus de succès ça ne renvoit pas d'erreur mais la liste n'en n'est pas plus mise à jour... (je précise que précédement la liste des employés était nommée "employés" (sans déconner? ;) ) et que rowsource avait comme "argument" Employés!employés...
    0
    1. Polux31 Messages postés 7219 Statut Membre 1 204
       
      La propriété RowSource n'est pas modifiable.

      Il faut donc ajouter les Items avec AddItem().

      On peut remplir la Combo à l'ouverture de l'userform.

      Je te donne un exemple vers 14h

      ;o)
      0
    2. Skeo
       
      Je te remercie mille fois parce que seul je crois que je n'y arriverai jamais...

      Je viens d'essayer cette méthode:

      Private Sub UserForm_Initialise()
      Sheets("Employès").Activate
      Range("employés_titre").Offset(-1, 0).Select
      Range(Selection, Selection.End(xlDown)).Select
      ActiveSheet.Unprotect
      ActiveWorkbook.Names.Add Name:="employés", RefersToR1C1:= _
      "=Employés!R6C2:R14C2"
      ComboBox1.RowSource = "Employés!employés"
      ActiveSheet.Protect
      End Sub

      Mais idem choux blanc.

      Et ça aussi:

      Private Sub UserForm_Initialise()
      Dim i As Integer
      Dim der_case, prem_case As Long

      prem_case = Range("employés_titre").Offset(-1, 0)
      der_case = Range("employés_titre").End(xlDown).Row
      For i = prem_case To der_case
      ComboBox1.AddItem Sheets("Employés").Cells(B, i)
      Next
      End Sub

      De toute manière je crois qu'il n'y a qu'en tâtonnant que je parviendrai à quelque chose sans aide...

      Et concernant la commande AddItems je la connait mais ne l'ai jamais utilisé... Je croyais que ça ne permettais pas les combobox "dynamique"...
      0
  8. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Tu ajoutes ça dans l'éditeur de l'UserForm

    Private Sub UserForm_Initialize() 
    Dim ws As Worksheet 
    Dim lig As Long 
    
        Set ws = Worksheets(1)  'Mettre le numéro ou le nom de la feuille 
        lig = 6 
        ComboBox1.Clear
    
        With ws 
            While .Range("B" & lig).Value <> "" 
                ComboBox1.AddItem .Range("B" & lig).Value 
            lig = lig + 1 
            Wend 
        End With 
         
    End Sub 
    


    ;o)
    «Ce que l'on conçoit bien s'énonce clairement, Et les mots pour le dire arrivent aisément.»
    Nicolas Boileau
    0
    1. Skeo
       
      Alors la je ne comprend vraiment pas...

      Il met erreur d'exectution / Erreur non répertoriée et le déboguage pointe cette ligne...
      Pourtant ça n'a rien à voir non?

      Private Sub CommandButton14_Click()
      Unload UserForm1
      Load UserForm4 <======
      UserForm4.Show
      End Sub
      0
    2. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Enlève Load UserForm4

      UserForm4.Show est suffisant
      0
    3. Skeo
       
      idem même erreur c'est bizard que ça fasse ça alors qu'il n'y pas d'interaction....

      Et quand j'enlève le code que tu m'as donné ça remarche mais je ne vois rien de problématique et pourtant... (enfin je suis loin d'être une référence comme tu t'en ai rendu compte je suis pas une flèche en vba ;) Mais le principale est d'être de bonne volonté je pense que c'est facile que quand on sait (et encore...)

      En fait j'ai directement mis le code dans la page ou il y a également le code des boutons du userform mais peut être me suis-je trompé? e n'estpas ça l'éditeur du userform peut être?

      Merci beaucoup en tout cas tes conseils me sont très utiles
      0
    4. Polux31 Messages postés 7219 Statut Membre 1 204
       
      Vérifie le nom de ta UserForm et vérifie qu'elle ne soit pas déjà ouverte quand le code doit s'éxécuter. Si tu as fait un UserForm4.Hide, UserForm4.Show ne peut pas fonctionner
      0
    5. Skeo
       
      Rien à faire...

      Maintenant le débogeur indique cette ligne:
      avec "membre de méthode ou de donnée introuvable":

      Private Sub CommandButton14_Click() <======
      Unload UserForm1
      UserForm4.Load
      UserForm4.Show
      End Sub

      C'est dans userform1 en fait c'est le bouton qui sert à appeler le userform4 où se trouve le code que tu m'as indiqué.
      Et le seul userform4.hide se trouve dans le userform4 ce qui ne posai jusqu'alors aucun problème.

      la je plante.
      0