Première ligne vide - VB/VBA/VBS - Programmation
Marsh Posté le 13-12-2006 à 14:41:25
A priori dans ThisWorkBook
Juste du point de vue syntaxe
|
Autrement il y a des expressions du style
|
qui donne la 1ere cellule vide dans la colonne A par exemple
ou encore qui donne la derniere cellule vide ou non
|
Marsh Posté le 13-12-2006 à 21:31:30
bonsoir "kiki29", Moonliz,
Euh...
sauf erreur de ma part...
Une Private Function devrait se trouver dans le module de la feuille concernée, mais à moins de n'utiliser cette fonction que dans une seule feuille tu as plutôt intéret à la déclarer ta fonction normalement dans un module standart ("Module1" )
Par ailleurs une telle fonction avec Find est extrèmement lente. Utilisé sur de très grandes feuilles c'est presque du vice (ou un truc pour se permettre de nombreuses pauses cigarette !)
De plus ta fonction requiert des arguments ce qui ne la rend pas spécialement cool...
La fonction suivante est préférable et met environ 45 " au lieu de 1 minute pour Find :
De plus l'argument CelluleDeDépart est facultatif. (mais vivement recommandé pour les très longs tableaux...)
Private Function FRowCLR(Optional StartCell As Variant)
On Error Resume Next
i = StartCell.Row
Do While Not Application.CountA(Rows(i + 1)) = 0
i = i + 1
Loop
FRowCLR = i + 1
End Function
Sub Test()
MsgBox FRowCLR
End Sub
Toutefois, il faut reconnaître que cette fonction ne renvoie que la première ligne vide (ce qui est le titre du topic). Alors que la fonction citée par moonliz est plus polyvalente : On ne pourrait pas rechercher une colonne avec FRowCLR il faudrait adapter une autre fonction...
Pour conclure, je dirais comme kiki29 que de telles fonctions sont rarement utilisées, (car trop lentes et peu pratiques). C'est pourquoi on s'arrange en général pour chercher sur une colonne qui n'a "pas de trou" avec une instruction du type :
i = Range("A65536" ).End(xlUp).Row +1
A+
Marsh Posté le 14-12-2006 à 12:21:56
Merci pour vos réponses !!!
Seulement, j'ai toujours du mal à le faire fonctionner...
C'est vrai que c'est une fonction assez complexe que je cherche à mettre en place, mais mes collègues sont les rois pour exploiter la moindre faille, donc il me faut quelque chose qu'ils n'arriveront pas à planter !!
Ce que je recherche plus précisément, c'est de rendre impossible l'enregistrement de données dans des cellules déjà pleines, qu'aucune donnée ne puisse être écrasée...
Peut-être existe-t-il une fonction plus simple pour cela...?
Merci encore à tous les 2 !!
Marsh Posté le 17-12-2006 à 03:29:52
bonjour,
dans un tableau il y (presque) toujours un champs (une colonne) obligatoire. (index, date...)
Si c'est la colonne A, utilise :
i = Range("A65536" ).End(xlUp).Row +1
Si c'est la colonne B, utilise :
i = Range("B65536" ).End(xlUp).Row +1
S'il n'existe pas une telle colonne YAKA la créer et la masquer :
celà accélèrera ton code et rendra ton programme plus ergonomique.
Si nécessaire mettre un classeur démo sur cjoint
A+
Marsh Posté le 21-12-2006 à 11:04:19
" Si c'est la colonne A, utilise :
i = Range("A65536" ).End(xlUp).Row +1 "
Cette expression, où dois-je la placer..?
Directement dans ma fonction ou ailleurs ???
J'ai essayé à peu près toutes les possibilités qui me passaient par la tête mais je commence à désespérer !!
La logique VBA n'est décidément pas faite pour moi !
Merci de ton aide en tous cas...!!
Marsh Posté le 21-12-2006 à 13:57:14
tu veux pas mettre ton fichier sur cjoint
en tout cas moi aussi j'aurais utilisé cette ligne
i = Range("A65536" ).End(xlUp).Row +1 "
au cas où cela signifie que tu selectionne la colonne A et que tu te déplace vers le bas jusqu'à obtenir la première cellule vide
et donc t'obtiens i (num de ligne de la première cellule vide)
-->ce qui correspond à ce que tu veux
et j'insiste ca serait plus "facile" si tu le met sur cjoint
Marsh Posté le 21-12-2006 à 16:09:50
Cette fois c'est fait... ;-)
http://cjoint.com/?mvqiaxSi6b
Marsh Posté le 21-12-2006 à 16:21:14
et t'a pa fait un tri suivant les ordres de missions? ou c'est juste le hazard
Marsh Posté le 21-12-2006 à 16:51:51
je t'ai mis une solution sur http://cjoint.com/?mvqZhMTQ54
en fait j'ai rajouter une ligne en bas (ligne 34 pour que ça ne soit pas imprimer) de la feuille OM et la macro la recopie sur la dernière ligne sur la feuille histo
tu n'a plus qu'à la mettre en forme
dis moi si ca te va
Marsh Posté le 22-12-2006 à 10:35:30
Ca me parait très bien !!!
Vais continuer de le tester un tit peu, mais apparament c'est exactement ce qu'il me fallait !!!!
Et non, pas de numéro d'OM...
MERCIIIII !!!!!!!!!!!!
Marsh Posté le 22-12-2006 à 11:44:05
noublie pas dans ton fichier initial il ne faut pas de ligne vide entre tes données ( c la condition pour que sa marche)
dans le fichier que je t passe l=2 et non 10 comme tu le souhaite
supprime les lignes 2 et 7 et la sa marchera nickel
A+
Marsh Posté le 22-12-2006 à 12:40:11
C'est fait, tout fonctionne à merveille...!!
Merci beaucoup !!
Marsh Posté le 13-12-2006 à 13:16:30
Bonjour !
Pour mon boulot, je suis obligée d'utiliser la macro permettant aux données de s'enregistrer dans la première ligne vide du tableau. Seulement je suis à peine débutante en vba.
J'ai trouvé la trame de cette macro, mais je ne parviens pas à la faire fonctionner.
Faut-il l'enregistrer dans "this workbook" où dans la feuille même ?
Quels sont les termes à modifier à partir de cette trame ? (ou d'une autre, si celle-ci est mauvaise)
Public Function PremiereVide(CelluleDepart As Range, _ MonOrdre As XlSearchOrder, MaDirection As XlSearchDirection) As Long
If MonOrdre = xlByRows Then
PremiereVide = _ Columns(MaCellule.Column).Find("", MaCellule, , ,MonOrdre, MaDirection).Row
Else
PremiereVide = _ Columns(MaCellule.Column).Find("", MaCellule, , ,MonOrdre, MaDirection).Column
End If
End Function
Private Sub CommandButton1_Click()
Sheets(1).Select
Set MaCellule = [A1]
MsgBox PremiereVide(MaCellule, xlByRows, xlNext) (première ligne vide)
MsgBox PremiereVide(MaCellule, xlByColumns, xlNext) (première colonne vide)
End Sub
Quelqu'un peut-il m'aider ????
Merci !!
Laura