XL 2019 VBA derniere ligne

genoufa

XLDnaute Nouveau
Bonjour a tous,

J'ai un souci avec ma fonction dans unmodule classe. La fonction va m'afficher que la derniere ligne de ma BDD... or je voudrais l'ensemble des lignes.. :


Public price As Double

Public name As String

Public reference As Variant

Public color As String

Public Function render(ByRef sheet As Worksheet)
index = sheet.Cells(Rows.Count, 1).End(xlUp).Row + 1

sheet.Cells(index, 1).Value = reference
sheet.Cells(index, 2).Value = name
sheet.Cells(index, 3).Value = color
sheet.Cells(index, 4).Value = price

Debug.Print name

End Function

S'avez vous comment faire pour afficher l'ensemble des lignes ?

Merci beaucoup pour votre aide !
 

jmfmarques

XLDnaute Accro
Bonjour
le code que tu montres ne semble pas être celui d'un module de classe, mais d'un module standard.
La fonction va m'afficher que la derniere ligne de ma BDD... or je voudrais l'ensemble des lignes.. :
S'avez vous comment faire pour afficher l'ensemble des lignes ?
"afficher" comment et dans quoi ?
qu'entends-tu d'ailleurs par le terme "afficher" ?
 

genoufa

XLDnaute Nouveau
Bonjour,

Merci pour vos retours !

En fait je souhaite enregistrer en 'memoire' l'ensemble des lignes jusqu'a la derniere ligne vide, que je souhaite par la suite appeler dans mon module principale intitule "Catalogue".

Dans Catalogue j'appelle les differentes collections placees dans mes sous modules mais quand j'arrive a la derniere sous classe "Wine" , je n'ai que la derniere ligne qui s'affiche quand je l'appelle... or pour les autres cela fonctionne..

Je me permets de mettre mon fichier pour etre plus clair...

Onglet = Base de donnee
Onglet = Auto ( ou s'affiche le resultat de la macro )
Onglet = Catalogue (le resultat que je recherche plus ou moins a avoir )

Dans VBA :

Module principal = Catalogue
Sous modules = Chateau , Domaine ,Region , Regions, Wine

Merci pour votre aide,
 

Pièces jointes

  • Catalogue Wine.xlsm
    235.2 KB · Affichages: 13

jmfmarques

XLDnaute Accro
Des idées claires et leur claire expression sont à mes yeux les éléments essentiels de tout développement
En fait je souhaite enregistrer en 'memoire' l'ensemble des lignes jusqu'a la derniere ligne vide
Les données d'une feuille de calcul sont déjà, par définition, "enregistrées en mémoire".
que je souhaite par la suite appeler dans mon module principale intitule "Catalogue".
on appelle une routine, une fonction. On n'appelle pas des données; on les utilise, on les manipule, mais on le les appelle pas.
Je suis quant à moi persuadé de ce que l'effort que tu voudras bien faire pour exprimer clairement et technbiquement les tenants et aboutissants de ton problème seront un pas important.
 
Dernière édition:

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bien le bonjour,
Question : Qui initialise les valeurs retournées dans Wine.render : reference, name,color,price ?
En pas à pas, personne. Elles valent toujours 156001H sangria Rouge 7.9.
Soit la dernière ligne de BDD.
Il faut qu'avant l'appel à Wine.render ces valeurs soient initialisées.
 

genoufa

XLDnaute Nouveau
Bonjour,

J'aimerai creer une fonction pour me permettre d'afficher les donnees de ma BDD quand j'appelle cette derniere depuis mon module principale :

Public Function render(ByRef sheet As Worksheet)
Dim index As Integer
index = sheet.Cells(Rows.Count, 1).End(xlUp).Row + 1

sheet.Cells(index, 1).Value = reference
sheet.Cells(index, 2).Value = name
sheet.Cells(index, 3).Value = color
sheet.Cells(index, 4).Value = price
Debug.Print name

End Function


Cependant j'avais omis d'initialiser mes variables dans mon module principale ...

Option Explicit

Sub newcatalogue()

Dim sheet As Worksheet
Set sheet = Worksheets("BDD")

Dim nbWine As Integer
nbWine = sheet.Cells(Rows.Count, 1).End(xlUp).Row

Dim index As Integer
Dim allRegions As New regions

Dim i As Long

For i = 2 To nbWine


Dim Region As Region
Dim Domain As Domain
Dim chateau As chateau
Dim mywine As New Wine


Set Region = allRegions.getRegion(sheet.Cells(i, 4).Value)
Set Domain = Region.getDomain(sheet.Cells(i, 5).Value)
Set chateau = Domain.getChateaux(sheet.Cells(i, 6).Value)


Dim reference As Variant

Dim price As Double
Dim name As String
Dim color As String


mywine.reference = sheet.Cells(i, 3).Value
mywine.name = sheet.Cells(i, 7).Value
mywine.color = sheet.Cells(i, 8).Value
mywine.price = sheet.Cells(i, 28).Value

Call chateau.Addwine(mywine)

Next i


Dim Catalogsheet As Worksheet
Set Catalogsheet = Worksheets("auto")
Call Catalogsheet.Cells.Clear
Call allRegions.render(Catalogsheet)


End Sub



Cependant j'arrive pas a faire comprendre a VBA que je souhaite l'ensemble des lignes de ma BDD et non pas que la derniere quand j'appelle ma fonction... Pourtant j'arrive a le faire avec mes collections... Pourquoi ?

Merci beaucoup
 

Pièces jointes

  • Catalogue Wine.xlsm
    237.6 KB · Affichages: 10

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Genoufa,
Pourquoi reposer la même question sans même avoir lu nos remarques.
Si vous posez un point d'arrêt en Mywine.render ligne debug.print vous verrez que vos 4 variables reference,name,color,price ont toujours comme valeur 156001H sangria Rouge 7.9. ( cf post #6) cela veut donc dire qu'elles ne sont pas initialisées correctement.
Je ne sais pas ce que vous voulez faire donc difficile d'aller plus loin. Mais il vous faut initialiser ces variables correctement avant d'appeler ce render.
Dans l'état, ces variables valent toujours les valeurs de la dernière ligne de bdd, cela devrait être une piste.
Lorsque dans Chateau.render vous faites :
VB:
    For Each mywine In Wines
       Call mywine.render(sheet)
    Next
Jamais vous ne ré actualisez ces 4 variables.
 

genoufa

XLDnaute Nouveau
Bonjour Sylvanu,

Je vous promets que je vous lis et que je cherche....
Je ne comprends pas comment je les declare mal ? Comment faites vous pour ré actualisez des variables ?

Public Function render(ByRef sheet As Worksheet)

Dim index As Long
index = sheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
Dim i As Long

Dim reference As Variant
Dim price As Double
Dim winename As String
Dim color As String

For i = 2 To index

reference = sheet.Cells(i, 3).Value
winename = sheet.Cells(i, 7).Value

color = sheet.Cells(i, 8).Value
price = sheet.Cells(i, 28).Value

Next i

Dim mywine As New Wine

For Each mywine In Wines
Call mywine.render(sheet)
Next

End Function



Merci pour votre aide
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Faites du pas à pas, vous verrez que quand vous exécutez ce Render, les 4 valeurs écrites dans sheet sont toujours les mêmes.
Donc elles sont mal initialisées.
VB:
Public Function render(ByRef sheet As Worksheet)
index = sheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
    sheet.Cells(index, 1).Value = reference
    sheet.Cells(index, 2).Value = name
    sheet.Cells(index, 3).Value = color
    sheet.Cells(index, 4).Value = price
    Debug.Print name
End Function
Seul le pas à pas vous montrera où se trouve l'erreur;
Perso, je ne comprends rien à la structure de votre macro, donc je ne peux vous être d'aucune aide, excepté le fait de vous conseiller de faire du pas à pas.
 

genoufa

XLDnaute Nouveau
Bonjour Sylvanu,

Je pense mieux poser mon probleme. En fait Je souhaite creer un tableau avec 4 variables dedans :

Public Function render(ByRef sheet As Worksheet)

Dim index As Long
Dim i As Long
Dim reference As Variant
Dim price As Double
Dim winename As String
Dim color As String


'Normalement mes variables ont ete crees
'Ensuite j'aimerai inserer mes donnees dans mes variables depuis ma bdd


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

For i=2 to index

reference = sheet.Cells(i, 3).Value
winename = sheet.Cells(i, 7).Value
color = sheet.Cells(i, 8).Value
price = sheet.Cells(i, 28).Value


' Et du coup c'est ici que ca me prend que la derniere ligne de ma Bdd au lieu de l'ensemble :(

J'ai besoin de creer une variable range ?
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Je ne comprends pas pourquoi vous refusez de faire du pas à pas, déjà évoqué au post #10.

Si vous mettez un point d'arrêt en Call chateau.Addwine(mywine), puis vous faites F5 vous obtenez pour les quatre variables :

1er tour : 201002 IGP vaucluse d'orange Rouge 14.5
2eme tour : 201004 IGP Méditéranée Rosé 14.5
3eme tour : 201003 IGP Méditéranée Rosé 7.9
etc, etc jusqu'au dernier
156001h Sangria Rouge 7.9

Ce qui signifie que ces quatre variables prennent bien leur bonne valeur à chaque tour, mais que la fonction MyWine.Render n'est jamais appelée excepté au dernier tour.
Il y a donc une erreur de structure d'appel dans votre macro.

Tans que vous ne ferez pas du pas à pas pour comprendre ce que fait votre macro, vous ne convergerez pas.
 

genoufa

XLDnaute Nouveau
Bonjour Sylvanu,

Si je mets un point d'arret en call chateau.Addwine(mywine), j'ai rien qui se passe.

Par contre si je le mets en call mywine.render (sheet) juste avant l'affichage j,ai bien mes donnees qui apparaissent dans l'onglet ,petit a petit, mais c'est tjr la derniere ligne..( 156001h Sangria Rouge 7.9), j'ai pas ce fameux roulement ... .Je vais chercher sur ma structure d'appel.

Merci pour l'astuce
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour,
Quand on a mis le point d'arrêt et que le programme est arrêté il suffit de survoler les variables pour avoir leur valeurs :
20200619_122826.gif

ou encore de créer quatre variables :
20200619_142026.gif
 

Discussions similaires

Réponses
6
Affichages
401

Statistiques des forums

Discussions
313 091
Messages
2 095 179
Membres
106 201
dernier inscrit
toglozin