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

Antoine C.

XLDnaute Nouveau
Premiers tests :
Dans un Module MConst :
VB:
Public Const ColNom = 6, ColPrenom = 7

Dans le code de mon UserForm :
VB:
    .txtNom.Text = Feuil1.Cells(NumLigne, ColNom)
    .txtPrenom.Text = Feuil1.Cells(NumLigne, ColPrenom)

Et celà fonctionne parfaitement !

*****
@_Thierry
Je viens de voir vos messages entre-temps... Cool ! J'allais poser la question sur la déclaration as Byte (j'ai retenu la leçon), comme je ne risque pas le débordement de 255 colonnes...

*****
@Roblochon
Idem, je viens de voir votre message.
La présentation Enum me plait énormément.

Cependant, la déclaration as Byte n'est plus possible ? Comment bien définir ces données ?

Merci
 

Antoine C.

XLDnaute Nouveau
Bonjour @Roblochon
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)

Celà veut dire que l'on ne peut pas utiliser la fonction Enum dans un With ou que l'on ne peut pas utliser le résultat d'un Enum dans un with ? (Comme ColNom ?)
 

_Thierry

XLDnaute Barbatruc
Repose en paix
C'est bien ce que Microsoft écrit en effet, voir l'article , ils mettent bien à part dans un paragraphe.
Si c'était un autre site, je n'y porterais pas forcément cas, mais un homme averti en vaut deux !
@+Thierry
 

eriiic

XLDnaute Barbatruc
Bonjour à tous,

Enum est une une bonne solution que j'utilise lorsque la majorité des colonnes sont utilisées dans le code.
Si elles ne sont que quelques unes et dispersées, pour éviter de devoir toutes les nommer dans Enum, tu peux aussi nommer la cellule titre sur la feuille et ton code devient :
VB:
me.txtPrenom.Text = Feuil1.Cells(NumLigne, Range("Prénom").column)
' abrégé :
me.txtPrenom.Text = Feuil1.Cells(NumLigne, [Prénom].column)'
Un nom sur feuile est absolu et suis toute insertion/suppression de colonne.
eric
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,
"You can't use an Enum type as the target in a With block. "
Je ne sais pas exactement ce que veut dire par là l'ami crosoft.
Personnellement je les utilise dans des block with comme ceci:
VB:
With TableauAssoc("Adhérents")
     If NouvelleLigne Then
            idxLigne = Application.CountA(.Columns(colNum)) + 1
         Else
            idxLigne = Application.Match(Precom(colNum), .Columns(colNum), 0)
        End If
End With

' Où TableauAssoc est une fonction renvoyant un objet Range et Precom() un tableau mémoire.
Jusqu'à présent aucun utilisateur n'a signalé de problème.

De plus les variables lignes et colonnes sont toujours converties en long par excel depuis excel 2007 (si je me souviens bien)

Cependant, la déclaration as Byte n'est plus possible ? Comment bien définir ces données ?

A vous de connaître les limites et avantages de chaque structure. J'ai choisi les énuméraiton, car elles sont parlantes, même quand on forme une macro ou une fonction avec paramètres, et l'intellisense les propose:

Code:
Function Truc(Colonne as colAdhCom) as Variant

End Function



'Ou



Sub Truc(Optional Colonne as colAdhCom = colRN)

End Sub

Cordialement
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Rebonjour à tous,

De plus les variables lignes et colonnes sont toujours converties en long par excel depuis excel 2007 (si je me souviens bien)

Ah bon, et comment ce miracle se produit-il ? Excel va transformer un Variable "DerLigne" déclarée as Integer en Long ? où je n'ai pas bien compris ?
D'ailleurs même avec Excel 2000 on avait 65536 Lignes et on "explosait" les "DerLigne" si déclarées en Integer...
Je n'ai sûrement pas compris quelque chose dans cette affirmation ?

Bien @ vous
@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
A l'éxécution, oui je me doute
Mais je ne comprends tout de même, c'est clair que si on ne déclare rien ça passe !

VB:
Sub MaDerLigneDéclarée()
Dim DerLigne

DerLigne = Range("A1").End(xlDown).Row
MsgBox DerLigne
End Sub

Mais BOUM "Overflow" si j'amais on déclare c'est pire que les douanes.... Vous n'avez rien à déclarer, bon aller circulez !!! ;)

@+Thierry
 

eriiic

XLDnaute Barbatruc
Bonjour,

De plus les variables lignes et colonnes sont toujours converties en long par excel
Exact.
Et tous les Integer, il ne distingue pas l'usage qui en est fait (colonne ou ligne).
Fais ce test :
VB:
Sub comp_IntegerLong()
    Dim k As Long, t As Single
    Dim i As Integer, a(0 To 99) As Integer
    Dim j As Long, b(0 To 99) As Long
   'Integer
    t = Timer
    For k = 1 To 1000000
        Erase a
        For i = 0 To 99
            a(i) = a(i) + i
        Next i
    Next k
    Debug.Print "Integer : "; Timer - t
    'Long
    t = Timer
    For k = 1 To 1000000
        Erase b
        For j = 0 To 99
            b(j) = b(j) + j
        Next j
    Next k
    Debug.Print "Long : "; Timer - t
End Sub
Integer est plus lent que Long à cause de la conversion Integer => Long
De mémoire, comme indice de boucle Integer reste quand même plus rapide. Je ne m'embête plus : tout en Long et basta ;-)
Quant à Variant c'est 4 fois plus lent
eric
 

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Les mystères de VBA n'ont jamais cessé de me déconcerter et m'enchanter. A la fois mesquin et permissif.;)

@eriic , ne faisiez-vous pas partie de la discussion (avant 2010) à ce sujet avec @Staple1600 et dont je parlais tout à l'heure. Je cherche et ne la retrouve pas.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Eriiiic, Merci de ces informations

"Tous les Interger sont convertis en Long par Excel ..."

Mais pourtant donc ils sont bien Overflow si jamais on dépasse 32,767
Plus rapide ou pas, ca n'est pas ma question, une conversion d'interprétation en background de la variable convertie en Long, mais qui la laisse exploser, je ne vois pas la finalité ... Ce doit être le confinement ! Arf LoL

Et pour Variant, oui là nous sommes 100% d'accord, à proscrire tant qu'on n'en pas pas réellement besoin (Array etc) et puis aussi pour le debugage comme j'expliquais à Antoine dans mon post #10

Bien à toi, à vous
@+Thierry
 

eriiic

XLDnaute Barbatruc
Pour être cohérents, ils pouvaient difficilement ne pas utiliser les limites officielles des Integer et Bytes rajoutés (au rabais ?) chez MS.
D'un autre coté, travailler aujourd'hui avec des bytes alors que les mots sur presque tous les processeurs font 8 octets et que la taille mémoire n'est (presque) plus un problème, on comprend qu'ils n'aient pas eu envie de se fouler ;-)
 

Discussions similaires

Réponses
16
Affichages
981
Réponses
22
Affichages
574