Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Contribuez

Contribuez Access : Vos contributions. Postez ici vos codes sources, conseils, astuces et autres propositions. Ce forum n'est pas un forum technique mais destiné aux contributions pour www.developpez.com

Réponse
 
Outils de la discussion
Vieux 08/06/2007, 16h17   #1 (permalink)
Membre éprouvé
 
Avatar de The_Super_Steph
 
Date d'inscription: avril 2007
Localisation: Gujan-Mestras
Âge: 26
Messages: 443
Par défaut [Fait]Ajuster la taille d'un sous-form en fonction du nb d'enregistrements

Bonjour,

Voilà, sur les conseils de Kikof, je mets à disposition un code que je cherchais à mettre en place pour ajuster la taille d'un sous-formulaire en fonction du nombre d'enregistrements qu'il contient. Ainsi, Arkham46 est venu à mon secours et m'a aiguillée vers la solution suivante :

Sur l'événement SurActivation du formulaire, il suffit de mettre le code suivant :

Code :
Private Sub Form_Current()
Me.TonSousForm.Form.InsideHeight = Me.TonSousForm.Form.Section(acHeader).Height _
     + Me.TonSousForm.Form.Section(acFooter).Height _
     + Me.TonSousForm.Form.Section(acDetail).Height _
         * (Me.TonSousForm.Form.RecordsetClone.RecordCount _
          -  Me.TonSousForm.Form.AllowAdditions)
Me.TonSousForm.Height = Me.TonSousForm.Form.WindowHeight
End Sub
 
Après, s'il y a des zones de textes en-dessous, il suffit de modifier leur position en fonction du sous-formulaire, par exemple :

Code :
Me.TazoneDeTexte.Top = Me.TonSousForm.Top + Me.TonSousForm.Height + AutantDeTwipsQueTuVeux
 
... et ainsi de suite !

Voilà, en espérant que cela pourra servir à d'autres... Ce code apporte réellement un plus à une appli, ça fait plus pro !

Encore merci à Arkham46,

Steph
__________________
Blonde, d'origine belge et gauchère... et alors !
"N'est stupide que la stupidité"

Quand il n'y a pas de solution, c'est qu'il n'y a pas de problème

(\ _ /)
(='.'=)
Voici Lapinou, le lapin crétin-Rasta. Aidez le à conquérir le monde
(")-(") en le reproduisant !
The_Super_Steph est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/06/2007, 10h33   #2 (permalink)
Membre Expert
 
Date d'inscription: mai 2005
Localisation: IDF - 94
Messages: 1 070
Par défaut

Une évolution pour ce script intéressant : limiter la hauteur du sous-form à Nmax lignes :
  • ajustement automatique de la hauteur du sous-form au nombre de lignes lorsque celui-ci est inférieur à Nmax
  • quand il y a plus de Nmax lignes, ça ajuste à Nax lignes avec une barre de défilement vertical

On peut coller le code suivant dans un module standard
Code :
 
Public Sub ssfrmHeightResize(nbMaxLignesAffichees As Integer, ctlSsFrm As Control)
'Positionnement du ss-formulaire
'--------------------------------
' twips : 567 dans 1 cm et 1440 dans 1 pouce.
' limite la hauteur du sous-form à nbMaxLignesAffichees lignes
' qd nbLignes > nbMaxLignesAffichees, on affiche le défilement vertical
 
    Dim heightMaxAllowedSsFrm As Long, heightTotalSsFrm As Long, widthSsFrm As Long
    Dim lineHeight As Long, calageAbsolu As Long, lngRecordCount As Long
    Dim oSsFrm As Form
    Dim rst As Recordset
 
    Set oSsFrm = ctlSsFrm.Form
 
    'Hauteur d'une ligne du sous-form
    '--------------------------------
    Debug.Print "width : " & Application.GetOption("default column width")    'en cm
    'Debug.Print "height: " & Application.GetOption("default row height")
    Debug.Print "height: " & oSsFrm.RowHeight    'en twips
 
    If oSsFrm.DefaultView = 2 Then
        'en mode DS
        lineHeight = 283
        'widthSsFrm = oSsFrm.Width           'ou bien un nombre en twips
    Else
        'en mode continu
        lineHeight = oSsFrm.Section(acDetail).Height
        'widthSsFrm = oSsFrm.Width + 50
    End If
 
    'Nombre de records dans le sousForm
    '-----------------------------------
    If oSsFrm.RecordsetClone.RecordCount > 0 Then
        oSsFrm.RecordsetClone.MoveFirst
        oSsFrm.RecordsetClone.MoveLast
        'Attention : The recordcount is unreliable when using a server side cursor
        lngRecordCount = oSsFrm.RecordsetClone.RecordCount
    Else
        lngRecordCount = 0
    End If
    Debug.Print "oSsFrm. lngRecordCount: " & lngRecordCount
 
    'Debug.Print "Form.Detail.Height avant: " & Me.Form.Section(acDetail).Height
    Debug.Print "oSsFrm. Detail.Height : " & oSsFrm.Section(acDetail).Height
 
    heightMaxAllowedSsFrm = oSsFrm.Section(acHeader).Height _
                          + IIf(oSsFrm.Section(acFooter).Visible, oSsFrm.Section(acFooter).Height, 0) _
                          + lineHeight _
                          * (IIf(oSsFrm.AllowAdditions, nbMaxLignesAffichees + 1, nbMaxLignesAffichees))
    Debug.Print "heightMaxAllowedSsFrm : " & heightMaxAllowedSsFrm
 
    heightTotalSsFrm = oSsFrm.Section(acHeader).Height _
                     + IIf(oSsFrm.Section(acFooter).Visible, oSsFrm.Section(acFooter).Height, 0) _
                     + lineHeight _
                     * (IIf(oSsFrm.AllowAdditions, lngRecordCount + 1, lngRecordCount))
    Debug.Print "heightTotalSsFrm      : " & heightTotalSsFrm
 
    If heightTotalSsFrm < heightMaxAllowedSsFrm Then
        'ctlSsFrm.Width = widthSsFrm + 150     'Largeur automatique du sous-form
        oSsFrm.InsideHeight = heightTotalSsFrm
        oSsFrm.ScrollBars = 0             'aucune barre de défilement
    Else
        'ctlSsFrm.Width = widthSsFrm + 410    'Largeur automatique du sous-form
        oSsFrm.InsideHeight = heightMaxAllowedSsFrm
        oSsFrm.ScrollBars = 2             'barre de défilement verticale
    End If
 
    Debug.Print "lineHeight: " & lineHeight
  
    Set ctlSsFrm = Nothing
    Set oSsFrm = Nothing
 
End Sub
 
 
qu'on appelle par exemple par le code suivant placé dans le formulaire PARENT du sous-form :
Code :
Private Sub Form_Current()    
        Call ssfrmHeightResize(3, Me!ssf_item_vente)
End Sub
Remarque : ce module fonctionne qlqsoient les conditions suivantes :
. SsFrm.AllowAdditions= True or False
. SsFrm.Section(acFooter).Visible=True or False
. pour sous-form en mode Continu ou en mode DS
Adaptez le code si d'autres conditions sont différentes

Cordialement

EDIT 09/06/2008 : ajout Remarque
EDIT 08/10/2008 : nouveau code

Dernière modification par micniv ; 08/10/2008 à 21h33
micniv est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/03/2008, 11h35   #3 (permalink)
Débutant(e)
 
Date d'inscription: juillet 2007
Localisation: Touraine
Âge: 31
Messages: 700
Par défaut

Bonjour Micniv,

Peux t-on avoir ton code et celui de Steph en même temps ? sur le même événement ?

Merci
Nessie37 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/03/2008, 17h16   #4 (permalink)
Membre habitué
 
Avatar de voyou
 
Date d'inscription: septembre 2006
Messages: 168
Par défaut

A priori Micniv a pris le code de Steph et a rajouté du code en plus. Donc, celui de Micniv est le plus complet à ce que j'ai compris.
voyou est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 26/03/2008, 15h22   #5 (permalink)
Débutant(e)
 
Date d'inscription: juillet 2007
Localisation: Touraine
Âge: 31
Messages: 700
Par défaut

Ok Ok !
de toute façon ça ne règle pas mon probl car le code ne fonctionne pas !
J'ai posté dans IMH à ce sujet....
Nessie37 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/10/2008, 10h47   #6 (permalink)
Débutant(e)
 
Date d'inscription: juillet 2007
Localisation: Touraine
Âge: 31
Messages: 700
Par défaut

A nouveau moi,

Bonjour tout le monde.

Je souhaiterais exploiter le code de micniv mais il est vrai que j'ai encore des problèmes de syntaxe.
Micniv, le code que tu proposes serait donc en Private sub form_current() ?
De plus qu'entends tu par objSousFrom et frmSousForm ?

Que dois-je y mettre moi ?

Merci par avance.
Nessie37 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/10/2008, 12h51   #7 (permalink)
Membre Expert
 
Date d'inscription: mai 2005
Localisation: IDF - 94
Messages: 1 070
Par défaut

Citation:
le code que tu proposes serait donc en Private sub form_current() ?
Oui, le sous-form a besoin d'être actualisé à chaque record du form principal.

Citation:
qu'entends tu par objSousFrom et frmSousForm ?'
Regarde les déclarations
Set objSousForm = Me!TonSousForm
Set frmSousForm = objSousForm.Form

TonSousForm : est le nom du contrôle de ton sous-formulaire (à remplacer par le tien)
frmSousForm : est une déclaration de variable pour le ss-form (tu n'y touches pas)

A+
__________________
Merci de ne pas m'envoyer de message privé pour des pb techniques
micniv est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/10/2008, 16h35   #8 (permalink)
Débutant(e)
 
Date d'inscription: juillet 2007
Localisation: Touraine
Âge: 31
Messages: 700
Par défaut

Je n'arrive pas à retranscrire ton code car je ne suis aps très fortiche en syntaxe et je ne sais pas ce qui doit être changé ou gardé car syntaxe d'origine.

De toute façon, si les choses marchaient du premier coup avec moi ça se saurait...

Je ne sais plus qui m'a dit que ce code ne fonctionnait qu'avec des form en mode continu

Moi, il s'agit d'un sous form en mode feuille de données... C'est pour cela qu'il ne se passe rien ?

SI non,
si je veux un ajustement automatique de mon ss-form au nombre de lignes lorsque celui-ci est inférieur à 8 et que dès qu'il y a plus de 8 lignes, ça s'ajuste aux 8 et pas plus avec barre de défilement horizontale, comment je fais ?
Comment dois-je mixer les 2 codes proposés ?
Nessie37 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/10/2008, 17h07   #9 (permalink)
Membre Expert
 
Date d'inscription: mai 2005
Localisation: IDF - 94
Messages: 1 070
Par défaut

1 je viens de mettre à jour le code. Plus moderne : à l'apple, il passe en paramètres, le nombre de lignes max et le nom du controle du sousForm.

2: Effectivement, il ne marche que pour des sous-forms en mode continu. Mais c'est facile de passer d'un mode à l'autre et c'est souvent plus présentable en mode continu (qu'en miode DS (Feuille de données))
__________________
Merci de ne pas m'envoyer de message privé pour des pb techniques
micniv est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 06/10/2008, 17h24   #10 (permalink)
Débutant(e)
 
Date d'inscription: juillet 2007
Localisation: Touraine
Âge: 31
Messages: 700
Par défaut

Le problème est que pour mon cas, le mode DS est plus approprié !


Donc il n'existe pas de code permettant l'ajustement en mode DS ?
Nessie37 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 08h19   #11 (permalink)
Membre Expert
 
Date d'inscription: mai 2005
Localisation: IDF - 94
Messages: 1 070
Par défaut C'est presque ça en mode DS

Je viens de vérifier le code proposé en mode DS.
Il fonctionne ... quand on fait défiler les enregistrements dans l'ordre croissant mais bug effectivement qd on revient en arrière.
J'essaie de regarder ça
__________________
Merci de ne pas m'envoyer de message privé pour des pb techniques
micniv est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 10h21   #12 (permalink)
Débutant(e)
 
Date d'inscription: juillet 2007
Localisation: Touraine
Âge: 31
Messages: 700
Par défaut

Merci bcp de te pencher dessus.

Mais une tite question, est-ce que ce que je souhaite, c'est-à-dire ça :
Citation:
Envoyé par Nessie37 Voir le message
SI non, si je veux un ajustement automatique de mon ss-form au nombre de lignes lorsque celui-ci est inférieur à 8 et que dès qu'il y a plus de 8 lignes, ça s'ajuste aux 8 et pas plus avec barre de défilement horizontale, comment je fais ?
Comment dois-je mixer les 2 codes proposés ?
c'est faisable ?
Nessie37 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 10h49   #13 (permalink)
Membre Expert
 
Date d'inscription: mai 2005
Localisation: IDF - 94
Messages: 1 070
Par défaut

Citation:
si je veux un ajustement automatique de mon ss-form au nombre de lignes lorsque celui-ci est inférieur à 8 et que dès qu'il y a plus de 8 lignes, ça s'ajuste aux 8 et pas plus avec barre de défilement verticale?
C'est exactement le but de la manoeuvre.

Citation:
Comment dois-je mixer les 2 codes proposés ?
dans l'evenement Sur activation du formulaire principal, tu mets l'appel de la procédure (le second code) avec tes données :

Code :
Private Sub Form_Current()    
        Call ssfrmHeightResize( 8, Me!nomDuSousform)
End Sub
 
et tu recopies dans le même module, la 1ére procédure



A+
__________________
Merci de ne pas m'envoyer de message privé pour des pb techniques

Dernière modification par micniv ; 07/10/2008 à 11h04
micniv est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 11h44   #14 (permalink)
Débutant(e)
 
Date d'inscription: juillet 2007
Localisation: Touraine
Âge: 31
Messages: 700
Par défaut

Ya un problème avec mon "verticale" ? Qui fait référence à la barre

Pas si vite Monsieur Micniv ! Tu ne sais pas qui je suis ! Je suis Nessie ! Celle avec qui rien ne marche jamais du premier coup et qui plus est, est une vraie bleue quand les codes deviennent trop compliqués.
Rassure-toi j'ai compris ce que tu me disais là. ce qui me pose problème c'est les codes en eux-mêmes.
J'essaie de les adapter mais parfois, il y a des syntaxes qu'il ne faut pas forcément changer, etc... et donc, c'est pour ça que ça ne marche jamais avec moi

Bref, pour l'instant, je vais attendre tes corrections pour le/les codes en espérant me retrouver.....

Merci
Nessie37 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 07/10/2008, 12h36   #15 (permalink)
Membre Expert
 
Date d'inscription: mai 2005
Localisation: IDF - 94
Messages: 1 070
Par défaut

peux tu mettre un extrait zippé de ta base en PJ (form et ssForm avec quelques données)

A+
__________________
Merci de ne pas m'envoyer de message privé pour des pb techniques
micniv est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Contribuez

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide