Probleme avec fonction with

Bonjour,

J'ai créé une fonction qui permet de retourner la valeur de la ligne vide d'une feuille. La fonction ne marche que sur la feuille excel deja ouverte, la fonction ne va pas chercher la feuille excel qui entre en paramètre... je ne comprend pas d'où vient le problème, est-ce moi qui utilise mal la fonction with end with ?

Merci d'avance

'***********************************
'FONCTION RECHERCHE DE LA LIGNE VIDE
'***********************************
Private Function ligneVide(ByVal feuil As Worksheet) As Integer

    With feuil
             ligneVide = Cells(1, 1).End(xlDown).Row
    End With

    ligneVide = ligneVide + 1

End Function
    Select Case (listeRefBase)
        '**********gestion de la feuille 10645******************
        Case Is = "10645" '***************************************

            ligne = ligneVide(f10645) ' on cherche sur quelle ligne inserer les données
            MsgBox "la ligne vide est n° : " & ligne
Exit Sub

            With f10645
            .Cells(ligne, 1).Value = dateSaisie
            .Cells(ligne, 2).Value = listeTypeTest.Value
            .Cells(ligne, 3).Value = listeRefBase.Value
            .Cells(ligne, 4).Value = txtOfEb.Value
            .Cells(ligne, 5).Value = txtOfPiece.Value
            .Cells(ligne, 6).Value = txtDateCoupeEb.Value
            .Cells(ligne, 7).Value = txtMi1.Value
            .Cells(ligne, 8).Value = txtMi2.Value
            .Cells(ligne, 9).Value = txtMi3.Value
            .Cells(ligne, 10).Value = txtMi4.Value
            .Cells(ligne, 11).Value = txtMf1.Value
            .Cells(ligne, 12).Value = txtMf2.Value
            .Cells(ligne, 13).Value = txtMf3.Value
            .Cells(ligne, 14).Value = txtMf4.Value
            .Cells(ligne, 15).Value = txtCom.Value

            .Cells(ligne, 16).Value = calculGonflement(txtMi1.Value, txtMf1.Value)
            .Cells(ligne, 17).Value = calculGonflement(txtMi2.Value, txtMf2.Value)
            .Cells(ligne, 18).Value = calculGonflement(txtMi3.Value, txtMf3.Value)
            .Cells(ligne, 19).Value = calculGonflement(txtMi4.Value, txtMf4.Value)
            End With

            MsgBox "Données enregistrées !", vbOKOnly + vbInformation, "Confirmation"

        Case Is = "10656" '***************************************

            ligne = ligneVide(f10656) ' on cherche sur quelle ligne inserer les données
            MsgBox "la ligne vide est n° : " & ligne

Exit Sub

            With f10656
            .Cells(ligne, 1).Value = dateSaisie
            .Cells(ligne, 2).Value = listeTypeTest.Value
            .Cells(ligne, 3).Value = listeRefBase.Value
            .Cells(ligne, 4).Value = txtOfEb.Value
            .Cells(ligne, 5).Value = txtOfPiece.Value
            .Cells(ligne, 6).Value = txtDateCoupeEb.Value
            .Cells(ligne, 7).Value = txtMi1.Value
            .Cells(ligne, 8).Value = txtMi2.Value
            .Cells(ligne, 9).Value = txtMi3.Value
            .Cells(ligne, 10).Value = txtMi4.Value
            .Cells(ligne, 11).Value = txtMf1.Value
            .Cells(ligne, 12).Value = txtMf2.Value
            .Cells(ligne, 13).Value = txtMf3.Value
            .Cells(ligne, 14).Value = txtMf4.Value
            .Cells(ligne, 15).Value = txtCom.Value

            .Cells(ligne, 16).Value = calculGonflement(txtMi1.Value, txtMf1.Value)
            .Cells(ligne, 17).Value = calculGonflement(txtMi2.Value, txtMf2.Value)
            .Cells(ligne, 18).Value = calculGonflement(txtMi3.Value, txtMf3.Value)
            .Cells(ligne, 19).Value = calculGonflement(txtMi4.Value, txtMf4.Value)
            End With

            MsgBox "Données enregistrées !", vbOKOnly + vbInformation, "Confirmation"

        Case Else
            MsgBox "référence de base inconnue, veuillez vérifier la saisie !", vbOKOnly + vbExclamation

    End Select '***********fin de la boucle Case******************

 ' Else: MsgBox "Vous pouvez modifier la saisie"

'End If

End Sub

Bonsoir,

    With feuil
             ligneVide = .Cells(1, 1).End(xlDown).Row
    End With

Cette fonction serait meilleure car la vôtre pourrait ne pas fonctionner dans certains cas.

Private Function ligneVide(ByVal feuil As Worksheet) As Integer
    Dim cell_vide As Range

    With feuil
             Set cell_vide = .Columns("A").Find("")
             If Not cell_vide Is Nothing Then ligneVide = cell_vide.Row Else ligneVide = .Cells(1, "A").Row
    End With

End Function

Salut TeddyBear, Thev,

tu as oublié le point devant .CELLS, obligatoire lorsque tu utilises With sans quoi CELLS se reporte à la feuille active.

Cela dit,

  • XLDOWN te renseignera une éventuelle ligne vide DANS ta colonne ;
  • XLUP te renseignera la première ligne vide EN FIN de colonne.

Private Function ligneVide(ByVal feuil As Worksheet) As Integer

'

With feuil

ligneVide = .Cells(1, 1).End(xlDown).Row + 1

ligneVide = .Cells(Rows.Count, 1).End(xlUp).Row + 1

End With

'

End Function

Au choix...

A+

Bonsoir,

    With feuil
             ligneVide = .Cells(1, 1).End(xlDown).Row
    End With

Cette fonction serait meilleure car la vôtre pourrait ne pas fonctionner dans certains cas.

Private Function ligneVide(ByVal feuil As Worksheet) As Integer
    Dim cell_vide As Range

    With feuil
             Set cell_vide = .Columns("A").Find("")
             If Not cell_vide Is Nothing Then ligneVide = cell_vide.Row Else ligneVide = .Cells(1, "A").Row
    End With

End Function

Merci beaucoup ! Ca marche sans problème !!

Mais seulement, pour ma culture, pourquoi ma programmation (ligneVide = .Cells(1, 1).End(xlDown).Row) ne pourrait pas fonctionner dans certain cas ?

Dans le code que vous proposez, pouvez vous expliquer ce que fais votre code ? je ne comprends pas à partir du "Set cell_vide..."

Salut TeddyBear, Thev,

tu as oublié le point devant .CELLS, obligatoire lorsque tu utilises With sans quoi CELLS se reporte à la feuille active.

Cela dit,

  • XLDOWN te renseignera une éventuelle ligne vide DANS ta colonne ;
  • XLUP te renseignera la première ligne vide EN FIN de colonne.

Private Function ligneVide(ByVal feuil As Worksheet) As Integer

'

With feuil

ligneVide = .Cells(1, 1).End(xlDown).Row + 1

ligneVide = .Cells(Rows.Count, 1).End(xlUp).Row + 1

End With

'

End Function

Au choix...

A+

Magnifique ! je comprends mieux ainsi ! Merci curulis !

Bonjour à tous !

Si je puis me permettre : pourquoi Private Function !

Est-ce une restriction voulue ?

Pour que la fonction ne soit accessible qu'à partir du Module où elle se trouve ?

Cela me paraît contradictoire pour une fonction de ce type ! Mébon... !

Par ailleurs, je plaide toujours en faveur de l'utilisation systématique de With... End With, car c'est un élément d'accélération de l'exécution... et cela facilite également la qualification des expressions par la simple apposition d'un point. Et dès lors que l'on n'a plus aucun Range ou Cells, etc. se baladant sans être précédé d'un point, c'est déjà une garantie d'un code fiable qui s'exécutera sans surprise même en cas de modification de contexte, et généralement plus rapidement.

Cordialement.

Bonjour à tous !

Si je puis me permettre : pourquoi Private Function !

Est-ce une restriction voulue ?

Pour que la fonction ne soit accessible qu'à partir du Module où elle se trouve ?

Cela me paraît contradictoire pour une fonction de ce type ! Mébon... !

Par ailleurs, je plaide toujours en faveur de l'utilisation systématique de With... End With, car c'est un élément d'accélération de l'exécution... et cela facilite également la qualification des expressions par la simple apposition d'un point. Et dès lors que l'on n'a plus aucun Range ou Cells, etc. se baladant sans être précédé d'un point, c'est déjà une garantie d'un code fiable qui s'exécutera sans surprise même en cas de modification de contexte, et généralement plus rapidement.

Cordialement.

Bonjour MFerrand,

En fait, cela fait maintenant 1 semaine que j'apprend rapidement via un site comment programmer en VBA, malheureusement ce n'est pas super bien expliqué comme certain cours Java que j'avais pu apprendre sur le net aussi, cela ne m'étonne pas que mon code VBA ne soit pas du tout optimisé pour une execution optimale.

J'ai en fait fais tout mon codage sur une seule et même feuille, ce n'est meme pas dans un module, je ne sais donc pas si cela est bien codée ^^ Mais ça marche... Je suis preneur si vous pouviez jeter un coup d'oeil au fichier et me dire si j'ai codé tout de travers ou alors j'ai bien codé là où il fallait ^^

Pour le "private", c'est effectivement parce que j'ai mis tout mon code sur une même feuille que je l'ai utilisé.

Comment associer au texte ici, un fichier entier au fait ? ^^

Mais seulement, pour ma culture, pourquoi ma programmation (ligneVide = .Cells(1, 1).End(xlDown).Row) ne pourrait pas fonctionner dans certain cas ?

Votre programmation fonctionnera dans tous les cas standards. Je vous ai joint un cas atypique avec des cellules fusionnées.

Notez bien que votre programmation vous donnera bien la première ligne vide. Cela ne signifie pas forcément que la seconde ligne vide est à la suite de la première (voir précision de Curulis).

Dans le code que vous proposez, pouvez vous expliquer ce que fais votre code ? je ne comprends pas à partir du "Set cell_vide..."

"Set cell_vide..." définit la première cellule vide en colonne A via la méthode .Find

Si la feuille est vierge, aucune cellule n'est trouvée, alors la cellule affectée par défaut est A1.

0exemple01.xlsm (16.00 Ko)
Rechercher des sujets similaires à "probleme fonction"