Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1665 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Première ligne vide

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Première ligne vide

n°1490828
Moonliz
Posté le 13-12-2006 à 13:16:30  profilanswer
 

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

mood
Publicité
Posté le 13-12-2006 à 13:16:30  profilanswer
 

n°1490862
kiki29
Posté le 13-12-2006 à 14:41:25  profilanswer
 

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
n°1491047
galopin01
Posté le 13-12-2006 à 21:31:30  profilanswer
 

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+

n°1491285
Moonliz
Posté le 14-12-2006 à 12:21:56  profilanswer
 

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...
n°1492321
galopin01
Posté le 17-12-2006 à 03:29:52  profilanswer
 

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+

n°1494739
Moonliz
Posté le 21-12-2006 à 11:04:19  profilanswer
 

" 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...
n°1494813
ingenieurc​esi
Posté le 21-12-2006 à 13:57:14  profilanswer
 

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

n°1494814
ingenieurc​esi
Posté le 21-12-2006 à 13:58:40  profilanswer
 
n°1494884
Moonliz
Posté le 21-12-2006 à 16:09:50  profilanswer
 

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...
n°1494891
ingenieurc​esi
Posté le 21-12-2006 à 16:16:35  profilanswer
 

juste comme ca ya pas de num d'OM?

mood
Publicité
Posté le 21-12-2006 à 16:16:35  profilanswer
 

n°1494900
ingenieurc​esi
Posté le 21-12-2006 à 16:21:14  profilanswer
 

et t'a pa fait un tri suivant les ordres de missions? ou c'est juste le hazard

n°1494928
ingenieurc​esi
Posté le 21-12-2006 à 16:51:51  profilanswer
 

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

n°1495207
Moonliz
Posté le 22-12-2006 à 10:35:30  profilanswer
 

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...
n°1495267
ingenieurc​esi
Posté le 22-12-2006 à 11:44:05  profilanswer
 

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+

n°1495310
Moonliz
Posté le 22-12-2006 à 12:40:11  profilanswer
 

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


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Première ligne vide

 

Sujets relatifs
[résolu] commerce en ligne avec options spéciales...Intégrer ligne de commande dans appli console
VB6 Comment éteindre l'ordi par le biais d'une ligne de code ?Résolu - Signification de cette ligne ?
Afficher un point ou une lignesaut de ligne
VB.net Prob lire première ligne de mon fichier avec mon progr[BATCH]Changer mode de compatibilité en ligne de commande
Arborescence en ligne 
Plus de sujets relatifs à : Première ligne vide


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR