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- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonsoir,
With feuil
ligneVide = .Cells(1, 1).End(xlDown).Row
End WithCette 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 FunctionSalut 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 WithCette 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 ? ^^
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
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.