Première ligne vide

Première ligne vide - VB/VBA/VBS - Programmation

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

Reply

Marsh Posté le 13-12-2006 à 13:16:30   

Reply

Marsh Posté le 13-12-2006 à 14:41:25    

A priori dans ThisWorkBook
Juste du point de vue syntaxe


Option Explicit
 
Private Function PremiereVide(CelluleDepart As Range, MonOrdre As XlSearchOrder, MaDirection As XlSearchDirection) As Long
    If MonOrdre = xlByRows Then
        PremiereVide = Columns(CelluleDepart.Column).Find("", CelluleDepart, , , MonOrdre, MaDirection).Row
    Else
        PremiereVide = Columns(CelluleDepart.Column).Find("", CelluleDepart, , , MonOrdre, MaDirection).Column
    End If
End Function
 
Private Sub CommandButton1_Click()
Dim MaCellule As Range
     
    Sheets(1).Select
    Set MaCellule = [A1]
    MsgBox PremiereVide(MaCellule, xlByRows, xlNext)
 
    MsgBox PremiereVide(MaCellule, xlByColumns, xlNext)
   
End Sub


Autrement il y a des expressions du style


Dim r as long
    r = Range("A65536" ).End(xlUp).Row +1


qui donne la 1ere cellule vide dans la colonne A par exemple
 
ou encore qui donne la derniere cellule vide ou non


Sub Tst()
  MsgBox DerniereCellule(Sheets(1)).Address
End Sub
 
Private Function DerniereCellule(Ws As Worksheet) As Range
Dim DerniereRangee As Long, DerniereColonne As Long
 
    Err.Clear
    On Error GoTo Erreurs
     
    With Ws
        DerniereRangee = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
        DerniereColonne = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
        Set DerniereCellule = .Cells(DerniereRangee, DerniereColonne)
    End With
     
ExitFonction:
    Exit Function
Erreurs:
    Set DerniereCellule = Ws.Cells(1, 1)
    Resume ExitFonction
End Function


Message édité par kiki29 le 17-12-2006 à 11:18:57
Reply

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  :D (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+

Reply

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


---------------
Depuis que tu es montée là-haut, les anges n'ont jamais été si beaux...
Reply

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+

Reply

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


---------------
Depuis que tu es montée là-haut, les anges n'ont jamais été si beaux...
Reply

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

Reply

Marsh Posté le 21-12-2006 à 13:58:40    

Reply

Marsh Posté le 21-12-2006 à 16:09:50    

Cette fois c'est fait...  ;-)
 
http://cjoint.com/?mvqiaxSi6b


---------------
Depuis que tu es montée là-haut, les anges n'ont jamais été si beaux...
Reply

Marsh Posté le 21-12-2006 à 16:16:35    

juste comme ca ya pas de num d'OM?

Reply

Marsh Posté le 21-12-2006 à 16:16:35   

Reply

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

Reply

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

Reply

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


---------------
Depuis que tu es montée là-haut, les anges n'ont jamais été si beaux...
Reply

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+

Reply

Marsh Posté le 22-12-2006 à 12:40:11    

C'est fait, tout fonctionne à merveille...!!
Merci beaucoup !!


---------------
Depuis que tu es montée là-haut, les anges n'ont jamais été si beaux...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed