VBA : Abbréviations d'instructions ?

Besnard68

XLDnaute Occasionnel
Bonsoir Forum,

Comparativement à beaucoup d'entres vous, je suis relativement profane en VBA.
A force d'écrire de longues lignes de procédures, j'essaye, comme tout un chacun, de trouver où et comment je peux réduire celles-ci.

Exite-t'il des abbréviations qui valent instruction (à l'instar, par exemple, de me pour remplacer le nom de la UserForm) ?

D'autre part, j'utilise régulièrement l'instruction With / End With, pour éviter la répétition de l'identification d'un objet et composantes d'objet ; dans ce même esprit, existe t'il la possibilité d'appliquer "une même action" à des objets différents ? (par exemple : éviter de répéter .ColumnWidth pour plusieurs colonnes qui ne se suivent pas et qui n'auront pas, de plus, la même largeur) ?

Je vous remercie par avance de vos lumières.
 

skoobi

XLDnaute Barbatruc
Re : VBA : Abbréviations d'instructions ?

Bonjour,

pour éviter la répétition d'instruction, il existe les boucles (si tu ne connais pas).
Do ...... Loop, For .... To.....
Regarde dans l'aide au cas où ça t'intéresse.
 

Besnard68

XLDnaute Occasionnel
Re : VBA : Abbréviations d'instructions ?

Bonjour Skoobi, Forum,

Je te remercie pour ta réponse.

C'est vrai que l'utilisation de Do..Loop est intéressante ; cette instruction va me permettre d'être soulagé des imbrications de boucles If.. End If à n'en plus finir, qui finissent par rendre la lisibilité de la procédure un peu hard.

En fait je pensais plus au cas que je vais imager dans l'exemple suivant:

- J'ai 3 colonnes (cela pourrait être moins ou alors beaucoup plus) : D, Y et AC (je précise que ça ne sera pas toujours celles-ci, sinon quel intérêt de gérer ceci par programmation)

- Si une certaine condition se réalise, je vais leur attribuer les largeurs respectives suivantes : 12, 15 et 7.

- Actuellement j'écris la procédure suivante :
if ... = ... Then
Range("D: D").ColumnWidth = 12
Range("Y:Y").ColumnWidth = 15
Range("AC:AC").ColumnWidth = 7
End If​

- Ma question était la suivante : Existe t'il une possibilité de ne pas répéter ColumnWidth chaque fois, ou d'utiliser une "abbréviation " qui veuille dire la même chose ?

ColumnWidth étant un exemple, exite t'il des abbréviations pour d'autre instructions du même type ?

Merci encore pour votre aide.
 

skoobi

XLDnaute Barbatruc
Re : VBA : Abbréviations d'instructions ?

Re bonjour,
Existe t'il une possibilité de ne pas répéter ColumnWidth chaque fois, ou d'utiliser une "abbréviation " qui veuille dire la même chose ?
D'après moi non.
Par contre, il existe une abbréviation pour les plages:
Range("A1") et [A1] veut dire la même chose.
 

STephane

XLDnaute Occasionnel
Re : VBA : Abbréviations d'instructions ?

Bonjour,

Ma contribution du jour. Ce n'est pas forcément plus court.

Sub nnn()
Range("D:D").ColumnWidth = 12
Range("Y:Y").ColumnWidth = 20
Range("AC:AC").ColumnWidth = 30
Union([B:B], [D:D], [G:H]).Select
'Union([B:B], [Y:Y], [G:H]).ColumnWidth = [{12,15,7}]
'With Union([B:B], [D:D], [G:H]).Areas
'.Item(1).ColumnWidth = 12
'.Item(2).ColumnWidth = 24
'.Item(3).ColumnWidth = 36
'End With

'utilisation d'une fonction que j'ai nommé ChgWidth pour manipuler la propriété columnwidth.
x = ChgWidth([B:B], 12)
x = ChgWidth([D:D], 24)
x = ChgWidth([G:H], 36)

'tu peux même écrire ces 3 instructions en une seule ligne en les séparant du signe ":"
With Union([B:B], [D:D], [G:H]).Areas
x = ChgWidth(.Item(1), 12)
x = ChgWidth(.Item(2), 24)
x = ChgWidth(.Item(3), 36)
End With

End Sub

Function ChgWidth(rg As Range, largeur As Integer)
ChgWidth = CallByName(rg, "ColumnWidth", VbLet, largeur)
End Function


HTH
 

Besnard68

XLDnaute Occasionnel
Re : VBA : Abbréviations d'instructions ?

Bonjour STéphane, re-Skoobi, Forum,

GENIAL !!! ( Oui, oui, je crie car ça viens du coeur)

Utiliser les accolades permettent vraiment une économie de place tout en restant lisible,

et utiliser Union (que je ne connaissais pas) est vraiment parfait ; C'est exactement ce que je voulais.

Il faut vraiment que je me penche sur l'utilisation des fonctions car là, il y a vraiment des possibilités impressionnantes.

Justement Stéphane, j'ai essayé de construire la fonction indiquée ; peux tu me dire à quoi correspond le X, et comment le gère VBA ?

Je voudrais essayer de tester un mix de ta solution en utilisant la fonction avec Union : quelque chose comme : x = ChgWidth (Union ([B:B],[Y:Y],[G:H]),[{12,15,7}]) ... sous toutes réserves :)

En tous cas, merci encore pour votre aide à tous les deux.

Bon après-midi
 

STephane

XLDnaute Occasionnel
Re : VBA : Abbréviations d'instructions ?

attention, l'essai de l'instruction Union([B:B], [Y:Y], [G:H]).ColumnWidth = [{12,15,7}] ne fonctionne pas, j'aurais du l'enlever.

c'est pour ça que je me suis orienté sur l'appel de fonction.
la variable x sert éventuellement à savoir la fonction ChgWidth s'est bien déroulée.
mais peut-être que quelqu'un trouvera encore autre chose.



les braquets [ ] servent à excel à évaluer(interpéter) l'expression entre guillemets.
les accolades { } sont utilisées pour une notation matricielle.

il faut bien faire attention avec l'écriture matricielle [{ ... } ] d'ailleurs, pour voir ce que cela donne, tu peux essayer de dérouler les instructions suivantes :
[A1].CurrentRegion.ClearContents
[A1:B1] = [{"Coucou","Yannick"}]
[A2:C2] = [{"Coucou","Yannick","Quétal"}]
[A3:B3,C3] = [{"Coucou","Yannick","Quétal"}]
[A4:B4,C4:E4] = [{"Coucou","Yannick","Quétal"}]
 

Creepy

XLDnaute Accro
Re : VBA : Abbréviations d'instructions ?

Bonjour le Forum, les participants,

J'y vais de ma petite contribution, mois je passe par un tableau

Code:
Sub Tableau()
Dim Tbl_Colonne As Variant
Dim Tbl_Larg As Variant
Dim Boucle As Integer
Tbl_Colonne = Array("A", "B", "C")
Tbl_Larg = Array(15, 20, 25)
For Boucle = 0 To UBound(Tbl_Colonne)
   Columns(Tbl_Colonne(Boucle) & ":" & Tbl_Colonne(Boucle)).ColumnWidth = Tbl_Larg(Boucle)
Next Boucle
End Sub

@+

Creepy
 

STephane

XLDnaute Occasionnel
Re : VBA : Abbréviations d'instructions ?

attention, un essai de fonction pas souple du tout.

elle marchera dans ce cas là :
Sub djdjd()
x = ChgWidth_SecondeduNom(Union([B:B], [D:D], [G:H]), [{5,30,7}])
End Sub

mais ne fonctionnera pas dans le cas suivant :
sub dada
x = ChgWidth_SecondeduNom([B:B], 5)
end sub

Function ChgWidth_SecondeduNom(ParamArray vInput() As Variant) As Variant
'Dim plages As Variant, xy As Range, taille As Variant, valeurs As Variant
Set plages = vInput(0) ' :Debug.Print TypeName(plages)
valeurs = vInput(1) ' :Debug.Print TypeName(valeurs)
For Each ar In plages.Areas
i = i + 1: taille = valeurs(i) ':Debug.Print ar.Address
Result = CallByName(ar, "ColumnWidth", VbLet, taille)
Next ar
End Function
 

Besnard68

XLDnaute Occasionnel
Re : VBA : Abbréviations d'instructions ?

Stéphane,


attention, l'essai de l'instruction Union([B:B], [Y:Y], [G:H]).ColumnWidth = [{12,15,7}] ne fonctionne pas, j'aurais du l'enlever.]

Non, je te confirme que ça marche, et même très bien.

Une seule exigence par contre : en effectuant des tests, s'il y a plus de 9 items dans la commande Union, ça ne marche effectivement pas.

Pour les autres possibilités que vous suggérez, toi et Creepy, ça devient difficilement gérable pour un usage rapide.

En tous cas, merci pour vos très précieuses contributions.

Bonne soirée.
 

STephane

XLDnaute Occasionnel
Re : VBA : Abbréviations d'instructions ?

salut,


chez moi j'ai beau réessayé ça marche pas bien.
mais bon c'est logiquemelnt que j'étais vu à la tenter.
peut-être que ça marche mieux sur certaines versions d'excel

Union([B:B], [Y:Y], [G:H]).ColumnWidth = [{12,15,7}]
 

Besnard68

XLDnaute Occasionnel
Re : VBA : Abbréviations d'instructions ?

Bonjour Stéphane, Forum,

Je viens de découvrir que cette commande, avec 3 items (donc, comme dans ton exemple), ça ne fonctionne pas non plus.

Fais l'essai avec 2 ou 8 items (chez moi ça marche) et dis moi si ça fonctionne pour toi.
Si oui, j'aimerai bien savoir pourquoi il y a ce problème (bug ?) parce que l'aide en ligne indique bien "Spécifiez au moins deux objets Range"

A te lire.

Cordialement
 

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 023
Messages
2 084 713
Membres
102 637
dernier inscrit
TOTO33000