VBA - Variables

Antoine C.

XLDnaute Nouveau
Bonjour,

Le code de mon logiciel évoluant grandement, je voulais simplifier une tache. Voici pour exemple l'une des lignes :
VB:
me.txtPrenom.Text = Feuil1.Cells(NumLigne, 7)

pour le remplacer par
VB:
me.txtPrenom.Text = CellXlsPrenom

Car très souvent, je vais devoir aller rechercher la Feuil1.Cells(NumLigne, 7) : Pour completer un mail, un questionnaire, une impression, une recherche... etc. Et quand je veux éditer le numéro de colonne, je me retrouver à aller faire un rechercher/remplacer pas pratique du tout.

Je voulais déclarer dès le début, mais je ne sais pas où le faire ou comment, pour qu'il soit utilisé dans tout le code de mon UserForm, quelquechose comme ça :
VB:
Dim NumLigne as Variant
NumLigne = me.TxtNumLigne.Value

CellXlsNom = Feuil1.Cells(NumLigne, 6)
CellXlsPrenom = Feuil1.Cells(NumLigne, 7)
'etc.'

Ce sera en une seule fois et pas répété autant de fois que nécessaire. Mais je ne trouve pas la solution malgré bon nombre d'essais (UserForm, Module...)

Merci pour votre aide.
 
Solution
Bonjour,

Personnellement, je m'occupe d'une association pour laquelle j'ai développé un utilitaire et utilisé les Enumérations :

VB:
Public Enum colAdhCom
    colRN = 1
    colNum = 2
    colNom = 3
    colPrenom = 4
    colAdresse = 5
    colCp = 6
    colVille = 7
    ColEmail = 8
    colTel1 = 9
    colTel2 = 10
    colEnergie = 11
    colDate = 11
    colRemarques = 12
    colNotes = 12
    colValide = 13
    colGoogle = 14
    colMode = 14
End Enum

Ce n'est là qu'une partie

Je leur ai donné explicitement une valeur car certaines servent à 2 tableau légèrement différents
ex la colonne Remarques dans un fichier s'appelle Notes un autre.

Cordialement

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Antoine,
Peut être en faisant appel à des fonctions perso :
VB:
Function Nom(L)
    Nom = Feuil1.Cells(L, 7)
End Function

Function Prénom(L)
    Prénom = Feuil1.Cells(L, 6)
End Function

Sub test()
    Me.txtPrenom.Text = Prénom(Numligne)
End Sub
Ca simplifie l'écriture et la lisibilité.
Ou encore plus simple à l'écriture avec N pour Nom et P pour Prénom :
VB:
Function N(L)
    N = Feuil1.Cells(L, 7) ' Nom
End Function

Function P(L)
    P = Feuil1.Cells(L, 6) 'Prénom
End Function

Sub test()
    L = NumLigne
    Me.txtPrenom.Text = P(L)
End Sub
 
Dernière édition:

Valtrase

XLDnaute Occasionnel
Salut Antoine
Si tu veux qu'il soit disponible sur ton UserForm tu le déclare en tête de module de ton UserForm
Si tu veux qu'il soit disponible partout tu le déclares dans un module par exemple ModConstantes
Sinon voilà un peu de lecture.
Ensuite évites les variant pour ta compréhension ce sera mieux
VB:
Dim NumLigne As Long
C'est plus parlant
 

laurent950

XLDnaute Accro
Bonsoir
une solution avec une variable Type :
VB:
Dim CellXls As Info
Type Info
    Wkbs As Workbook
    Wks As Worksheet
    NumLigne As Long
    NumColoneNom As Integer
    NumColonePrenomNom As Integer
End Type
'*******************************************************************************************
A placer en tête de Module avant le premier SUB Or Function Etc..
' ******************************************************************************************
Sub test()
    Set CellXls.Wkbs = Workbooks(ActiveWorkbook.Name) ' Définir le classeur qui contient la feuille 1
    Set CellXls.Wks = CellXls.Wkbs.Worksheets("Feuil1")
'
' Lignes
    CellXls.NumLigne = 15
' Colonne
    CellXls.NumColoneNom = 6
    CellXls.NumColonePrenomNom = 7
' Nom
Me.txtPrenom.Text = CellXls.Wks.Cells(CellXls.NumLigne, CellXls.NumColoneNom)
' Prenom
Me.txtPrenom.Text = CellXls.Wks(CellXls.NumLigne, CellXls.NumColonePrenomNom)
End Sub
 

Antoine C.

XLDnaute Nouveau
Bonjour Antoine,
Peut être en faisant appel à des fonctions perso :
VB:
Function Nom(L)
    Nom = Feuil1.Cells(L, 7)
End Function

Function Prénom(L)
    Prénom = Feuil1.Cells(L, 6)
End Function

Sub test()
    Me.txtPrenom.Text = Prénom(Numligne)
End Sub
Ca simplifie l'écriture et la lisibilité.
Ou encore plus simple à l'écriture avec N pour Nom et P pour Prénom :
VB:
Function N(L)
    N = Feuil1.Cells(L, 7) ' Nom
End Function

Function P(L)
    P = Feuil1.Cells(L, 6) 'Prénom
End Function

Sub test()
    L = NumLigne
    Me.txtPrenom.Text = P(L)
End Sub

Pour les tests, j'ai appliqué ceci :
VB:
Function ColNom()
    ColNom = 6
End Function

Function TJour()
    ColPrenom = 7
End Function
Mais cela fait un paquet de lignes pour une valeur à chaque fois... je garde sous le coude.
 

Antoine C.

XLDnaute Nouveau
Salut Antoine
Si tu veux qu'il soit disponible sur ton UserForm tu le déclare en tête de module de ton UserForm
Si tu veux qu'il soit disponible partout tu le déclares dans un module par exemple ModConstantes
Sinon voilà un peu de lecture.
Ensuite évites les variant pour ta compréhension ce sera mieux
VB:
Dim NumLigne As Long
C'est plus parlant

@valtrase Ton lien lecture ne marche pas, si tu peux modifier ton message stp.

Merci pour l'astuce Module

J'avais remplacé as Long par as Variant car j'avais lu un article sur la rapidité d’exécution qui conseillait Variant.
 

Antoine C.

XLDnaute Nouveau
Bonsoir
une solution avec une variable Type :
VB:
Dim CellXls As Info
Type Info
    Wkbs As Workbook
    Wks As Worksheet
    NumLigne As Long
    NumColoneNom As Integer
    NumColonePrenomNom As Integer
End Type
'*******************************************************************************************
A placer en tête de Module avant le premier SUB Or Function Etc..
' ******************************************************************************************
Sub test()
    Set CellXls.Wkbs = Workbooks(ActiveWorkbook.Name) ' Définir le classeur qui contient la feuille 1
    Set CellXls.Wks = CellXls.Wkbs.Worksheets("Feuil1")
'
' Lignes
    CellXls.NumLigne = 15
' Colonne
    CellXls.NumColoneNom = 6
    CellXls.NumColonePrenomNom = 7
' Nom
Me.txtPrenom.Text = CellXls.Wks.Cells(CellXls.NumLigne, CellXls.NumColoneNom)
' Prenom
Me.txtPrenom.Text = CellXls.Wks(CellXls.NumLigne, CellXls.NumColonePrenomNom)
End Sub

@laurent950 , je n'ai pas réussi à appliquer tes propositions.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Antoine, le Fil, le Forum

On peut en effet déclarer en Top de module des variables pour qu'elles soient accessibles à toutes les Sub...

Toutefois, "NumLigne" sonne comme étant typiquement une variable au sein d'une boucle... Donc se modifiant en permanence... A ce stade, je ne sais pas si il est approprié de la déclarer en Public ou en Private en Top de module...

En fait tout dépend de l'usage de la Variable et de sa fréquence de mise à jour et de sa durée.

Pour Déclaration As Variant, certainement pas pour sa "rapidité d’exécution", ce n'est pas du tout le cas, et ce n'est pas non plus pour être "C'est plus parlant". Non Variant est par défaut quand on ne déclare pas ses variables, et à part les Tableau "Array" qui sont très souvent Variant, on peut presque tout définir de manière précise et appropriée, ce qui a pour effet immédiat de limiter l'usage de la RAM quand le programme est exécuté.

Microsoft Data type summary

Microsoft Declaring variables

En prime, quand on a bien tout déclaré comme il se doit, on évite bien des bugs quand on a une erreur d'incompatibilté de types, au lieu que quand tout est Variant "ça risque de passer" mais sans guarantie de résultats...

Pour les Variables Type (Définies par l'utilsateur), proposée par Laurent, tu as cet article aussi :

Microsoft Type statement

Bonne découverte
@+Thierry
 

Antoine C.

XLDnaute Nouveau
Merci pour ces nouveaux retours auxquels je vais me pencher.

NumLigne est bien une variable au sein d'un boucle, et permet de donner le numéro de la ligne sur laquelle les informations sont remontées (Tableau de liste clients). Ce n'est pas un souci et fonctionne bien.

Ce qui me pose problème, est l'utilisation du numéro de colonne, par exemple le "7" dans
VB:
me.txtPrenom.Text = Feuil1.Cells(NumLigne, 7)

Car je vais par exemple envoyer un mail, et je vais utiliser dans un module de nouveau
Code:
& me.txtPrenom.Text = Feuil1.Cells(NumLigne, 7) &
par exemple.

Et quand je vais adapter finalement mon tableau, en modifiant les colonnes, je vais devoir reprendre tous les codes contenant cette information pour remplacer le 7 par 6 par exemple.
Ce qui me fais avoir un risque d'erreur que je ne souhaite pas prendre.

J'ai bien pensé au Ctrl+H, mais je dois parcourir mes modules, ainsi que ma userform. Mais celà me semble "cavalier" dans ce cas.

Si au moins je peux déclarer une information pour toutes les userform / modules / modules de classe en disant une bonne fois pour toute que ma colonne Nom est le numéro 7, c'est top. Comme ça, je n'ai qu'un endroit à modifier pour adapter le projet.

J'espère vous avoir éclairés pour m'aider... Je suis novice, et toutes les informations trouvées sur ce forum sans avoir à poser de question m'ont été extrêmement utiles ! Maintenant que je creuse un peu plus...

Merci à vous tous pour votre aide.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Antoine

Alors dans ce cas ce sont vers les Constantes que tu dois t'orienter, je crois que Dranreb te l'a suggéré.

En Top d'un Module Normal que tu nomeras (pas exemple) "Module_00_Constante"

VB:
Option Explicit

Public Const ColLastName As Integer = 7
Public Const ColFirstName As Integer = 8
Public Const ColMail As Integer = 9
'etc ....................'

Bien à toi, à vous
@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Dans un souci d'économie de taille on pourrait même les déclarer as Byte (0 to 255 , 1 byte storage)
Code:
Option Explicit

Public Const ColLastName As Byte = 7
Public Const ColFirstName As Byte = 8
Public Const ColMail As Byte = 9
'etc ....................'

@+Thierry
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Personnellement, je m'occupe d'une association pour laquelle j'ai développé un utilitaire et utilisé les Enumérations :

VB:
Public Enum colAdhCom
    colRN = 1
    colNum = 2
    colNom = 3
    colPrenom = 4
    colAdresse = 5
    colCp = 6
    colVille = 7
    ColEmail = 8
    colTel1 = 9
    colTel2 = 10
    colEnergie = 11
    colDate = 11
    colRemarques = 12
    colNotes = 12
    colValide = 13
    colGoogle = 14
    colMode = 14
End Enum

Ce n'est là qu'une partie

Je leur ai donné explicitement une valeur car certaines servent à 2 tableau légèrement différents
ex la colonne Remarques dans un fichier s'appelle Notes un autre.

Cordialement
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @Roblochon

Oui Enum Statement est aussi une possibilité, voir article Microsoft Enum statement
Il faut toutefois y faire attention car Microsoft indique clairement que la constant en résultant sera de Type Long et il y a aussi une limitation : "You can't use an Enum type as the target in a With block. "
(Ca peut éviter de s'arracher les cheveux)

L'exemple type d'usage :

VB:
Public Enum InterfaceColors
 icMistyRose = &HE1E4FF&
 icSlateGray = &H908070&
 icDodgerBlue = &HFF901E&
 icDeepSkyBlue = &HFFBF00&
 icSpringGreen = &H7FFF00&
 icForestGreen = &H228B22&
 icGoldenrod = &H20A5DA&
 icFirebrick = &H2222B2&
End Enum


Bien à toi, à vous
@+Thierry
 

Discussions similaires

Réponses
16
Affichages
983
Réponses
22
Affichages
574

Statistiques des forums

Discussions
311 740
Messages
2 082 049
Membres
101 882
dernier inscrit
XaK_