Cellule vide sous un tableau excel

Résolu/Fermé
Skeo - 26 avril 2010 à 11:01
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 - 28 avril 2010 à 10:46
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

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
26 avril 2010 à 11:19
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
elbosador Messages postés 42 Date d'inscription lundi 26 avril 2010 Statut Membre Dernière intervention 25 août 2010 4
26 avril 2010 à 11:20
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
26 avril 2010 à 12:26
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
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 26/04/2010 à 13:22
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
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
26 avril 2010 à 13:59
Enlève Load UserForm4

UserForm4.Show est suffisant
0
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
Modifié par Polux31 le 26/04/2010 à 14:09
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
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