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...)
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.
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
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
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
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
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
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
C'est sûr Private Const ColNom = 6, ColPrénom = 7 C'est plus court.
Quant à des expressions qui ne peuvent être définies comme constantes, c'est dans la Sub UserForm_Initialise que des variables Private correspondantes doivent être initialisées.
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é.
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 :
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...
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 ....................'
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.
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)