IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Passer un argument a Sub UserForm_Initialize(position As Integer)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 175
    Par défaut Passer un argument a Sub UserForm_Initialize(position As Integer)
    Bonjour ,


    je veux passer a la fonction UserForm_Initialize un argument de type Integer qui permet a un formulaire de se positionner a la ligne choisie par l'utilisateur

    mon code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Private Sub UserForm_Initialize(position As Integer)
        
      Const GWL_STYLE = (-16)
      Const GWL_EXSTYLE = (-20)
      Const WS_SIZEBOX = &H40000
      Const WS_EX_APPWINDOW = &H40000
      Dim hwnd As Long, wLong As Long
    
     
        Initialisation = True
        'ci-dessous : renseigner le nom de la feuille ou se trouve la base de données
        Set fl = Worksheets("FichierCentrale")
        fl.Cells(1, 1).Select 'Aucune incidence sur les procédure
        'Nombre de colonnes possédant une entête
        NbreColonnes = fl.Range("B1").SpecialCells(xlCellTypeLastCell).Column
        If NbreColonnes > 69 Then NbreColonnes = 69 'Limité du Nbre de Textbox
        NoLigne = 2 'initiation de la prémière ligne
        Call ScrollBarMax 'Détermine la dernière ligne accessible
        Me.ScrollBar1.Value = position 
        Me.ScrollBar1.Min = 2 'L'entête est sur la ligne 1
        Call NomDesLabels 'lit les entêtes de colonnes pour les afficher
         DoEvents
         wForm = Me.Width: hForm = Me.Height
         hwnd = FindWindow(vbNullString, Me.Caption)
         wLong = GetWindowLongA(hwnd, GWL_EXSTYLE)
         wLong = wLong Or WS_EX_APPWINDOW
         SetWindowLong hwnd, GWL_EXSTYLE, wLong
         wLong = GetWindowLongA(hwnd, GWL_STYLE)
         wLong = wLong Or WS_SIZEBOX
         SetWindowLong hwnd, GWL_STYLE, wLong
         Call lblResize
         Call SaveControlsProperties
    End Sub

    mon souci est que je ne sais pas quel est la fonction qui fait apel a UserForm_Initialize car je veux créer un formulaire qui propose a l'utilisateur de donner la ligne de positionnement et ce formulaire fait apel a un autre formulaire qui affiche les renseignements d'une feuille

    Merci de m'indiquer le chemin

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tu as deux solutions : Ou tu mets ton code dans le module standard d'ouverture de l'userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub ouvrir()
    Dim adresse as range, TopUsf  as single
    Set adresse = Application.InputBox("Sélectionner une cellule / une ligne", "Titre", Type:=8)
        TopUsf = adresse.Top
        Load UserForm1
        UserForm1.Top = TopUsf
        UserForm1.Show
    End Sub
    ou tu déclares une variable Public et tu mets ton code dans Userform_Initialize
    'Dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public TopUsf as single
     
    Sub ouvrir()
    Dim adresse as range
    Set adresse = Application.InputBox("Sélectionner une cellule / une ligne", "Titre", Type:=8)
        TopUsf = adresse.Top
    End Sub
    Dans la feuille de code de l'USF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
    Me.Top = TopUsf
    End Sub
    Tu testes

    Edit
    Corrige mon erreur, j'ai déclaré ToUsf à la place de TopUsf

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 175
    Par défaut
    Merci ouskel'n'or ,

    j'ai pas bien compris la soulution que tu ma proposé, peut être j'étais pas clair dans ma question , en fait je veux passer en argument un Integer a un Userform qui me permet de visuliser toutes les lignes de ma table et les mettre à jour , cet argument indique a mon formulaire la ligne ou il va se positionner en premier ( entre ligne 1 et Ligne 500) , la procedure est la suivante :
    _ j'ouvre un formulaire ou je saisie un chiffre (par exemple :30)
    ce formulaire fait apel a un autre formulaire et lui passe en argument le chiffre 30 , donc ce dérnier fomulaire s'ouvre et et on voi aparaitre le contenu de toutes les cellules de la ligne 30 ,

    et dans le formulaire qui m'affiche ces donnée j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    Private Sub UserForm_Initialize( )
        
      Const GWL_STYLE = (-16)
      Const GWL_EXSTYLE = (-20)
      Const WS_SIZEBOX = &H40000
      Const WS_EX_APPWINDOW = &H40000
      Dim hwnd As Long, wLong As Long
    
     
        Initialisation = True
        'ci-dessous : renseigner le nom de la feuille ou se trouve la base de données
        Set fl = Worksheets("FichierCentrale")
        fl.Cells(1, 1).Select 'Aucune incidence sur les procédure
        'Nombre de colonnes possédant une entête
        NbreColonnes = fl.Range("B1").SpecialCells(xlCellTypeLastCell).Column
        If NbreColonnes > 69 Then NbreColonnes = 69 'Limité du Nbre de Textbox
        NoLigne = 2 'initiation de la prémière ligne
        Call ScrollBarMax 'Détermine la dernière ligne accessible
        Me.ScrollBar1.Value =   2 ' il se position sur la ligne 2
        Me.ScrollBar1.Min = 2 'L'entête est sur la ligne 1
        Call NomDesLabels 'lit les entêtes de colonnes pour les afficher
         DoEvents
         wForm = Me.Width: hForm = Me.Height
         hwnd = FindWindow(vbNullString, Me.Caption)
         wLong = GetWindowLongA(hwnd, GWL_EXSTYLE)
         wLong = wLong Or WS_EX_APPWINDOW
         SetWindowLong hwnd, GWL_EXSTYLE, wLong
         wLong = GetWindowLongA(hwnd, GWL_STYLE)
         wLong = wLong Or WS_SIZEBOX
         SetWindowLong hwnd, GWL_STYLE, wLong
         Call lblResize
         Call SaveControlsProperties
    End Sub
    et je veux remplacer ce code par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    Private Sub UserForm_Initialize(position As Integer)
     
      Const GWL_STYLE = (-16)
      Const GWL_EXSTYLE = (-20)
      Const WS_SIZEBOX = &H40000
      Const WS_EX_APPWINDOW = &H40000
      Dim hwnd As Long, wLong As Long
     
     
        Initialisation = True
        'ci-dessous : renseigner le nom de la feuille ou se trouve la base de données
        Set fl = Worksheets("FichierCentrale")
        fl.Cells(1, 1).Select 'Aucune incidence sur les procédure
        'Nombre de colonnes possédant une entête
        NbreColonnes = fl.Range("B1").SpecialCells(xlCellTypeLastCell).Column
        If NbreColonnes > 69 Then NbreColonnes = 69 'Limité du Nbre de Textbox
        NoLigne = 2 'initiation de la prémière ligne
        Call ScrollBarMax 'Détermine la dernière ligne accessible
        Me.ScrollBar1.Value = position 
        Me.ScrollBar1.Min = 2 'L'entête est sur la ligne 1
        Call NomDesLabels 'lit les entêtes de colonnes pour les afficher
         DoEvents
         wForm = Me.Width: hForm = Me.Height
         hwnd = FindWindow(vbNullString, Me.Caption)
         wLong = GetWindowLongA(hwnd, GWL_EXSTYLE)
         wLong = wLong Or WS_EX_APPWINDOW
         SetWindowLong hwnd, GWL_EXSTYLE, wLong
         wLong = GetWindowLongA(hwnd, GWL_STYLE)
         wLong = wLong Or WS_SIZEBOX
         SetWindowLong hwnd, GWL_STYLE, wLong
         Call lblResize
         Call SaveControlsProperties
    End Sub
    je suis désolé peut être je comprend pas vite mais je sais que avec votre aide je vais arriver

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 175
    Par défaut
    j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub CommandButton6_Click()
    Dim adresse As Range, TopUsf  As Single
    Set adresse = Application.InputBox("Sélectionner une cellule / une ligne", "Titre", Type:=8)
        TopUsf = adresse.Top
        Load UserForm1
        UserForm1.Top = TopUsf
        UserForm1.Show
    End Sub
    mais sa na rien changé car mon formulaire se positione toujours sur la 2ème ligne

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 175
    Par défaut
    Merci ouskel'n'or ,
    je ne sait pas si tu a fait expré , mais j'ai reussi a touver la soulution avec la TOUCHE "F1"

    et j'ai le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim adresse As Integer, TopUsf  As Single
    Dim valeur As Integer
    adresse = Application.InputBox("Sélectionner une cellule / une ligne", "Titre", Type:=1)
        valeur = adresse
        Load UserForm1
        UserForm1.ScrollBar1 = valeur
        UserForm1.Show
     
    'UserForm1.Show
    End Sub
    Par contre j'ai un autre souci qui est le suivant :


    quand le je veux annuler l'affichage du formulaire j'ai un message d'erreur

    et dans toutes mes application et cahque fois que je clic sur Annuler ou fermer j'ai un message d'erreur ,
    peut tu me dire pourquoi ? merci

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Autant pour moi.
    Le Top des cellules dépend de la feuille de calculs et commence à 0 pour la ligne 1
    Le Top de l'userform dépend de l'application. Selon le nombre de barres d'outils affichées, la hauteur de la 1ère ligne de la feuille de calculs est donc variable.
    Pour connaître le top application de la ligne 1, tu dois connaître la hauteur de la première ligne sur l'écran. J'ai "bricolé" quelque chose qui fonctionne pour mon écran. Consiste à connaître le Top de la barre d'outils affichée la plus basse.
    Nécessite un clic sur l'userform pour le positionner.
    Je ne comprends toujours pas pourquoi ce top ne s'initialise pas dans Userform_initialize. Ça a fonctionné une fois mais plus jamais par la suite (???)
    Pour que ça fonctionne, utilise la déclaration Public de TopUsf dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public  TopUsf  As Single ' en tête d'un module standard
    Dans le clic de ton bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Private Sub CommandButton6_Click()
    Dim BarreTop, LaBarre
    Dim adresse As Range
    For Each LaBarre In Application.CommandBars
        If LaBarre.Visible = True Then
            If LaBarre.Top > BarreTop Then 'And LaBarre.Top < 400 Then
                BarreTop = LaBarre.Top
            End If
        End If
    Next
    BarreTop = BarreTop + 47 ' empirique -> Hauteur d'une barre + ?
    Set adresse = Application.InputBox("Sélectionner une cellule / une ligne", "Titre", Type:=8)
        Set Ad = Range(adresse.Address)
        TopUsf = Ad.Top + BarreTop
        Load UserForm1
        UserForm1.Show
    End Sub
    Enfin, dans le click de l'userform
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Click()
    Me.Top = TopUsf
    End Sub
    Pour le moment je n'ai pas mieux à t'offrir
    (jamais eu ce pb, avec VBA 97, pourtant )

Discussions similaires

  1. Comment passer des argument a un script php ?
    Par Florina dans le forum Linux
    Réponses: 2
    Dernier message: 11/12/2005, 14h38
  2. Awk - Passer un argument ?
    Par init dans le forum Linux
    Réponses: 6
    Dernier message: 19/10/2005, 12h56
  3. Comment passer les arguments à un script perl
    Par belgampaul dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2005, 12h52
  4. Réponses: 8
    Dernier message: 30/05/2005, 13h55
  5. [Struts] Passer un argument dans un property
    Par Malaussene dans le forum Struts 1
    Réponses: 4
    Dernier message: 07/09/2004, 10h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo