XL 2019 Lancement d'un userform avec une variable en mémoire

Pieerre69

XLDnaute Junior
Bonjour à toutes et à tous,

Dans un private sub before double click, j'appelle un userform dans lequel je sélectionne des données dans une liste. Cette sélection est ensuite copiée dans une cellule.
J'aurais aimé que la sélection se copie sur la ligne du double click donc j'avais pensé à déclarer une variable public : position = target.row que j'appelais dans mon userform en faisant par exemple cells(position,3).value = [...]

J'avais donc écrit dans le private sub : Userform1(position).show, en pensant faire comme lorsque j'appelle un sub dans un autre sub tout en conservant la valeur d'une variable. Mais ça ne fonctionne pas o_O

Avez-vous une idée de ce que je peux faire ? Je ne sais pas si j'ai été suffisamment clair ..
 
Solution
je traduit en francais
dans la feuille
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
With UserForm1: .ligne = Target.Row: .Show: End With
End Sub
traduction
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
avec l'UserForm1: la variable public ligne = Target.Row: .affiche le userform : End With
End Sub

parti de là ligne est dispo partout dans le userform

bien sur dans le userform en haut de module
public ligne as long
et c'est tout pas la peine d'aller chercher midi 14 heures ;)

si tu pige pas là je peux plus rien pour toi ;)

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Pieerre,
Peut être le plus simple est de créer une variable Public, qui conserverait la valeur et serait accessible par tous, avec, avant le premier sub, :
VB:
Public PosRow%
et dans le code PosRow= Target.row ( Position est un mot réservé au VBA )
Dans votre userform vous pouvez ainsi utiliser PosRow.
 

Pieerre69

XLDnaute Junior
Bonjour Pieerre,
Peut être le plus simple est de créer une variable Public, qui conserverait la valeur et serait accessible par tous, avec, avant le premier sub, :
VB:
Public PosRow%
et dans le code PosRow= Target.row ( Position est un mot réservé au VBA )
Dans votre userform vous pouvez ainsi utiliser PosRow.
Bonjour Sylvanu,

C'est ce que j'avais essayé, parce que d'habitude c'est ce que je fais pour garder en mémoire des variables entre 2 sub..
Mais ici je suis en private sub quand je récupère la valeur de la variable, et je passe ensuite dans un userform.
J'ai essayé en changeant le nom de la variable en "posrow" mais ça ne change pas mon problème.

Ci-dessous le bout de code qui déconne. Si je remplace ["A" & posrow] par ["A2"] ça fonctionne bien.
Et la valeur de posrow est vide quand j'ouvre le panneau des variables locales..

VB:
Private Sub CommandButton1_Click()
For i = 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.Selected(i) = True Then
        Application.ScreenUpdating = False
        Worksheets("Test").Range("A" & posrow).Value = Worksheets("Test").Range("A" & posrow) & Me.ListBox1.List(i, 2) & "/"
        Worksheets("Test").Range("A" & posrow).WrapText = False
        Application.ScreenUpdating = True
    End If
Next i
Unload ListePF
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
et la méthode fonction public d'un userform connais tu ?

exemple
dans le module de la feuille
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
UserForm1.ShowX (Target.Row)
End Sub

dans le userform
on va utiliser un show intermediaire que l'on appelera "ShowX"
Code:
Public ligne As Long

Function ShowX(ligne As Long)
With UserForm1
.ligne = ligne
.Show
End With
End Function

et dans un evenement bouton ou autre tu a ligne dispo partout dans ton userform
Code:
Private Sub CommandButton1_Click()
MsgBox ligne
End Sub

transportabilité 100% ;)
 

Pieerre69

XLDnaute Junior
Re, Bonjour Dranreb,
Si la variable posrow est vide c'est qu'elle n'a pas été initialisée.
Que la macro soit private ou que ce soit un userform, une variable publique est accessible.
Voilà l'initialisation de la variable :
VB:
posrow = Target.Row
ListePF.Show

Posrow est bien déclaré en public posrow% en début de code. Je ne sais pas où est-ce que j'ai pu dérapé
 

patricktoulon

XLDnaute Barbatruc
ou alors plus simple
dans la feuille
VB:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
With UserForm1: .ligne = Target.Row: .Show: End With
End Sub
dans le userform
VB:
Public ligne As Long

Private Sub CommandButton1_Click()
MsgBox ligne
End Sub
 

Pieerre69

XLDnaute Junior
Une variable publique doit être déclarée hors macro.
Perl:
Public Posrow%
Private Sub Macro()
Postrow=xxx
...
End sub
Je sais bien, c'est ce que j'ai fais !
Je vous transmet les deux codes.

VB:
Public old_color, old_sel
Public posrow%
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim Cn As ADODB.Connection
Dim Rs As ADODB.Recordset

'On Error GoTo DisplayErrorInfo
Set Cn = New ADODB.Connection
Cn.ConnectionString = "driver={SQL Server};" & _
     "server=GI-ERP;uid=Int;pwd=!Huttopia!;database=" & Worksheets("Param").Cells(1, 2).Value
Cn.Open

'On Error GoTo DisplayErrorClient
Set Rs = New ADODB.Recordset
Rs.ActiveConnection = Cn
Worksheets("Données").Unprotect "Gitotel2019"    'ou mdp est ton mot de passe

' Nettoyage
NbLig = Worksheets("Données").Range("A" & Rows.Count).End(xlUp).Row
Worksheets("Données").Range("A2:C" & NbLig + 1).ClearContents

Requete = "SELECT S.DPKTCODART, S.DPKTCOMART, S.DPKTNUMLOT FROM STDEPLOT AS S, ARTICLE AS A WHERE S.DPKTCODART = '" & Target.Value & "' AND S.DPKTCOMART = '" & Cells(Target.Row, 5).Value & "' AND S.DPKTCODART = A.ARKTCODART AND S.DPKTCOMART = A.ARKTCOMART AND A.ARCTFATN = '31'"
Rs.Open Requete
If Not IsEmpty(Target.Value) Then
    If Not Rs.EOF Then
        Lig = 1
        Do While Not Rs.EOF
            Lig = Lig + 1
            Worksheets("Données").Cells(Lig, 1) = Trim(Rs.Fields(0))                          ' Num série
            Worksheets("Données").Range("A" & Lig).HorizontalAlignment = xlCenter
            Worksheets("Données").Cells(Lig, 2) = Trim(Rs.Fields(1))                          ' code comp
            Worksheets("Données").Range("B" & Lig).HorizontalAlignment = xlCenter
            Worksheets("Données").Cells(Lig, 3) = Trim(Rs.Fields(2))                          ' CC composant
            Worksheets("Données").Range("C" & Lig).HorizontalAlignment = xlCenter
            Rs.MoveNext
         Loop
         Rs.Close
         posrow = Target.Row
         ListePF.Show
    End If
End If
    Cn.Close
    Worksheets("Données").Protect "Gitotel2019", AllowFiltering:=True
'Etiquettes de gestion des erreurs
GoTo DisplayEnd
DisplayErrorClient:
        MsgBox ("La requête a échoué, contactez votre service de développement")
        GoTo DisplayEnd
DisplayErrorInfo:
        MsgBox ("Impossible de se connecter à la base de données")
        GoTo DisplayEnd
DisplayEnd:

End Sub

Code:
Private Sub CommandButton1_Click()
For i = 0 To Me.ListBox1.ListCount - 1
    If Me.ListBox1.Selected(i) = True Then
        Application.ScreenUpdating = False
        Worksheets("Test").Range("A" & posrow).Value = Worksheets("Test").Range("A" & posrow) & Me.ListBox1.List(i, 2) & "/"
        Worksheets("Test").Range("A" & posrow).WrapText = False
        Application.ScreenUpdating = True
    End If
Next i
Unload ListePF
End Sub

Private Sub UserForm_Initialize()
Lig = Worksheets("Données").Range("A" & Rows.Count).End(xlUp).Row
ListBox1.RowSource = "Données!A2:C" & Lig
ListBox1.ColumnHeads = True
ListBox1.ColumnCount = 3
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 102
Messages
2 085 303
Membres
102 857
dernier inscrit
Nony1931