Semblable à ceci , ceci et cette question ...
Quels conseils généraux avez-vous pour jouer au golf VBA
? Je recherche des idées qui peuvent être appliquées aux problèmes de golf de code en général qui sont au moins quelque peu spécifiques VBA
(par exemple, "supprimer les commentaires" n'est pas une réponse). Veuillez poster un pourboire par réponse.
Bien que j'ai travaillé avec d'autres langues, je suis le plus fort VBA
et je ne vois pas beaucoup de golfeurs utiliser VBA
sur ce site.
Réponses:
Exploitez la
ByRef
valeur par défaut lors de l'appel de sous-marinsIl est parfois possible d'utiliser un
Sub
appel à la place d'unFunction
pour enregistrer quelques caractères supplémentaires ...Ce ( 87 caractères)
peut être retravaillé pour ( 73 caractères):
Notez que cela ne bouclera PAS indéfiniment, bien qu'il semble que vous ne réaffectiez jamais
b
la valeur deCe qui précède n'utilise pas de
Function
appel, mais exploite à la place la fonctionnalitéByRef
("Par référence") de l'Sub
appel. Cela signifie que l'argument passé est la même variable que dans la fonction appelante (par opposition à unByVal
"By Value", qui est une copie). Toutes les modifications apportées à la variable transmise se traduiront par la fonction appelante.Par défaut, vba accepte tous les arguments
ByRef
, il n'est donc pas nécessaire d'utiliser des caractères pour le définir.L'exemple ci-dessus peut ne pas se traduire parfaitement pour vous, selon la valeur de retour de votre fonction. (c'est-à-dire renvoyer un type de données différent de ce qui est transmis), mais cela permet également d'obtenir une valeur de retour tout en modifiant votre variable d'origine.
Par exemple:
la source
Écrivez et exécutez le code VBA dans la fenêtre Exécution
La fenêtre immédiate évalue toute instruction exécutable VBA valide. Entrez simplement une instruction dans la fenêtre immédiate comme vous le feriez dans l'éditeur de code. Il exécute rapidement le code VBA et peut enregistrer de nombreux caractères supplémentaires car:
Voici l'exemple de code VBA dans la fenêtre immédiate pour répondre au message de PPCG avec le code code-golf : La lettre A sans A
répondu par Joffan .
Images de crédit: Excel Campus
la source
a="value":?a
définit d'abord la valeur dea
, puis l'imprime.Vérifications conditionnelles avant la boucle
Certains contrôles conditionnels sont redondants lorsqu'ils sont utilisés conjointement avec des boucles. Par exemple, un
For
boucle ne sera pas traitée si la condition de démarrage est en dehors de la portée de la condition en cours d'exécution.En d'autres termes, ceci ( 49 caractères):
Peut être transformé en ceci ( 24 caractères):
la source
Déclaration variable
Dans la plupart des cas dans VBA, vous pouvez laisser de côté
Option Explicit
(souvent omis par défaut de toute façon) et ignorerDim
un grand nombre de vos variables.Ce faisant, cela ( 96 caractères ):
Devient ceci ( 46 caractères):
Si vous devez utiliser certains objets (par exemple, des tableaux), vous devrez peut-être toujours utiliser
Dim
cette variable.la source
Evaluate()
Et[]
Comme cela a été souligné précédemment, les appels de plage codés en dur peuvent être réduits en utilisant les crochets
[A1]
notation . Cependant, il a beaucoup plus d'utilisations que cela.Selon la documentation MSDN , la
Application.Evaluate()
méthode prend un seul argument, qui est unName
, tel que défini par la convention de dénomination de Microsoft Excel.NB
[string]
est un raccourci pourEvaluate("string")
(notez les""
marques vocales indiquant le type de données de chaîne), bien qu'il y ait quelques différences importantes qui sont couvertes à la fin.Alors qu'est-ce que tout cela signifie en termes d'utilisation?
Essentiellement,
[some cell formula here]
représente une cellule dans une feuille de calcul Excel, et vous pouvez y mettre à peu près n'importe quoi et en retirer tout ce que vous pourriez avec une cellule normaleQue se passe-t-il
En résumé, avec des exemples
[B7]
renvoie une référence à cette cellule?[B7].Address
renvoie"B$7$"
[A1:B5]
renvoie une référence de plage àA1:B5
(Plage)[A1:B5 A3:D7]
renvoie une référence de plage àA3:B5
(Intersect)[A1:B5,C1:D5]
renvoie une référence de plage àA1:D5
(techniquementA1:B5,C1:D5
) (Union)[myRange]
référant à A1: G5[Table1]
(peut-être moins utile pour codegolf)Evaluate()
ou[]
[SUM(1,A1:B5,myRange)]
renvoie une somme arithmétique de valeurs dans les plages myRange fait référence ici à un nom de classeur et non à une variable VBA[IF(A1=1,"true","false")]
(1 octet plus court que l'équivalent vbaIif([A1]=1,"true","false")
)[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
- joint toutes les chaînes de la plage dont la longueur est supérieure à 2 avec un espace!
opérateur pour faire référence à une cellule ou à un nom défini dans un autre classeur[[BOOK1]Sheet1!A1]
renvoie une référence de plage à A1 dans BOOK1 ou['[MY WORKBOOK.XLSM]Sheet1!'A1]
pour la même chose dansMY WORKBOOK
'
pour les classeurs avec des espaces dans leurs noms et le manque d'extension pour les classeurs nommés par défaut (BOOK+n
)NB J'ai posé une question sur SO pour cette info, alors jetez un œil là pour une meilleure explication
Ce qui sort
Semblable à ce qui entre, ce qui sort inclut tout ce qu'une cellule de feuille de calcul peut renvoyer. Ce sont les types de données Excel standard (et leurs équivalents VBA):
Boolean
)String
)Double
)Variant/Error
) (ce sont des erreurs insécables, c'est-à-dire qu'elles n'interrompent pas l'exécution du code,?[1/0]
s'exécutent correctement)Mais il y a quelques choses qui peuvent être retournées que les cellules ne peuvent pas:
Range
) (voir les sections ci-dessus)Variant()
)Tableaux
Comme cela a été montré,
[]
peut être utilisé pour évaluer des formules matricielles qui renvoient l'un des types de données Excel standard; par exemple,[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
qui revientText
. Cependant, ilEvaluate
peut également renvoyer des tableaux deVariant
type. Celles-ci peuvent êtreHardcoded:
[{1,2;3,4}]
- sort un tableau 2D:,
est le séparateur de colonnes,;
sépare les lignes. Peut sortir un tableau 1DFormules matricielles:
[ROW(A1:A5)]
- génère un tableau 2D{1,2,3,4,5}
, c'est-à-dire que (2,1) est le deuxième élément (pourtant certaines fonctions produisent des tableaux 1D)[LEN(A1:A5)]
affiche uniquement la longueur du texte dans la 1ère cellule d'une plageSplit([CONCAT(" "&LEN(A1:A5))])
donne un tableau 1D 0 à 5, où le premier élément est vide[INDEX(LEN(A1:A5),)]
est une autre solution de contournement, vous devez essentiellement utiliser une fonction de gestion de tableau pour obtenir le comportement de retour de tableau souhaité, similaire à l'ajout d'un videRAND()
de sens pour rendre vos formules de feuille de calcul volatiles.Evaluate()
contre[]
Il y a quelques différences entre
Evaluate()
et[]
être conscient deEvaluate("SUM(B1,1,"&v &",2)")
résumerais[B1]
,1
,2
et variablev
Tableaux
Lors du retour d'un tableau, seul Evaluate peut être utilisé avec un index de tableau, donc
est équivalent à
la source
i=[ROW(A1:A5)]:v=i(2,1):?v
Combiner des
Next
déclarationsPeut être condensé jusqu'à
où les itérateurs pour les
For
boucles sonti
,j
etk
- dans cet ordre.Par exemple ci-dessous (69 octets)
Peut être condensé jusqu'à 65 octets
Et en ce qui concerne la façon dont cela affecte la mise en forme et l'indentation, je pense que la meilleure approche pour gérer cela est d'aligner la prochaine déclaration avec la plus externe pour la déclaration. Par exemple.
la source
Réduire les
If
déclarationsLors de l'affectation d'une variable à l'aide d'un conditionnel
If ... Then ... Else
vérification , vous pouvez réduire la quantité de code utilisée en éliminant leEnd If
en mettant la vérification entière sur une seule ligne.Par exemple, ceci ( 37 caractères):
Peut être réduit à cela ( 30 caractères)
Si vous avez plusieurs conditions conditionnelles imbriquées, vous pouvez également les réduire de cette façon:
Noter la
:
vous permet d'ajouter plus d'une ligne / commande dans unIf
bloc.Dans des cas simples comme celui-ci, vous pouvez généralement supprimer le
Else
en définissant la variable avant leIf
contrôle ( 25 caractères):Encore mieux, ce qui précède peut être encore réduit à cela en utilisant la
IIf()
fonction ( 20 caractères):la source
Réduire
Range("A1")
et aimer les appelsRange("A1").Value
(17 octets) et le plus simpleRange("A1")
(11 octets) peuvent être réduits à[A1]
(4 octets)la source
[]
pour remplacerEvaluate()
dans VBA est beaucoup plus polyvalente que les appels de gamme. Par exemple, vous pouvez l'utiliser pour remplacerWorksheetFunction.FuncName(args)
par juste[FuncName(args)]
, comme?[SUMPRODUCT({1,3,5},{2,7,-1})]
ou le très utile[MIN(1,2,3)]
/[MAX(1,2,3)]
Evaluate("str")
ou la sténographie[str]
est très puissante en VBA, je ne l'ai découvert que récemment, et je suppose que cela sera également utile pour le golf!Supprimer les espaces
VBA se formatera automatiquement pour ajouter beaucoup d'espacement dont il n'a pas réellement besoin. Il y a une réponse sur meta qui a beaucoup de sens pour moi pourquoi nous pouvons réduire les octets ajoutés par formatage automatique. Il est cependant important de toujours vérifier que vous n'en avez pas trop retiré. Par exemple, voici une de mes réponses qui a été réduite de près de 22% simplement en supprimant des espaces:
Version originale: (188 octets)
Version réduite: (146 octets)
Si vous copiez / collez la version réduite dans VBA, elle se développera automatiquement dans l'original. Vous pouvez jouer avec l'endroit où il est valide pour supprimer des espaces. Ceux que j'ai trouvés jusqu'à présent semblent tous suivre le modèle dans lequel VBA attend qu'une certaine commande apparaisse car, sans elle, ce n'est pas du code valide. En voici quelques-unes que j'ai trouvées jusqu'à présent:
+-=/*^
etc.To
etStep
dans uneFor
déclaration:For x=-3To 3Step 0.05
To
,&
,Then
, etc.) si elle est précédée d'un littéral comme un numéro,)
,?
,%
, etc.&
combinaison de chaînes:Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
If s=StrReverse(s)Then
Replace(Space(28)," ",0)
la source
?
vsPrint
je vois est acceptable, mais mettre à la déclaration de type comme&
immédiatement après une variableDebug.?a&"z"
donne par exempleDebug.Print a&; "z"
. Le;
caractère ajouté est essentiel pour l'exécution du code - est-ce toujours autorisé?If i=1 Then
peut devenirIf i=1Then
parce que, en règle générale , un mot réservé qui suit un littéral, que ce soit un numéro,)
,?
,%
, .. etc, n'a pas besoin d'être séparés par un espace)
(ou tout autre littéral non numérique) et&
Préparez-vous au Pixel Art
Le pixel art est de loin l'un des domaines les plus forts d'Excel, car il n'est pas nécessaire de construire un canevas, car il est déjà là pour vous - tout ce que vous devez faire est de faire de petits ajustements
1) Rendre les cellules carrées
ou, alternativement, pour 1 octet de plus, mais beaucoup plus facile à utiliser
2) Colorez la plage nécessaire
Tout
Range
objet peut être coloré en appelantRemarque: cela peut et doit être combiné avec d'autres astuces notées sur ce wiki, telles que le référencement de plages par l'utilisation de la
[]
notation (par exemple[A1:R5,D6]
) sur l'utilisation d'unCells(r,c)
ou d'unRange(cellAddress)
appel. De plus, comme indiqué sur ce wiki, cela peut être combiné avec une valeur de couleur négative pour réduire la taille des références de couleurRéférences rapides
Référence de plage
Cellule
A1
peut être référencée de l'une des manières suivanteset la gamme
A1:D4
peut être référencée de l'une des manières suivantesRéférence de couleur
la source
Simplifiez les fonctions intégrées
Lorsque vous utilisez fréquemment certaines fonctions, réaffectez-les à une fonction définie par l'utilisateur.
Le code suivant ( 127 caractères) peut être réduit de:
à ( 124 caractères):
En combinant cela avec l' astuce ByRef , vous pouvez enregistrer encore plus de caractères (jusqu'à 114 ):
Faites-le judicieusement, car VBA prend beaucoup de caractères pour définir un
Function
. Le deuxième bloc de code serait en fait plus grand que le premier avec un nombre moindre d'Format()
appels.la source
a = f(w)
peut être réduit àf w
STDIN et STDOUT
Entrée dans les
Sub
routines et lesFunction
s via des variables d'entréePeut être réduit à
Le
Public
etByRef
appels sont la valeur par défaut pour VBA et donc implicites, et peuvent (presque) toujours être supprimés.Le type littéral
$
obligeb
à être du typeString
.Littéraux d'autres types
!
Célibataire@
Devise#
Double%
Entier$
Chaîne&
Longue^
LongLong (64 bits uniquement)En outre, il est généralement admis que vous pouvez laisser la variable d'entrée comme type par défaut
Variant
et laisser toute erreur basée sur le type non gérée. Par exemple.Sub E(F)
dans lequelF
on s'attend à être de typeBoolean[]
(qui serait passé à la routine commeE Array(True, False, False)
)Saisie des
Sub
routines et des fonctions de fenêtre immédiate viaCells
VBA n'a pas de console entièrement fonctionnelle et n'a donc pas de STDIN officiel , et permet donc à certains lecture avec l' entrée de passage.
Dans Excel, il est généralement accepté de prendre des données à partir d'une cellule ou d'une plage de cellules, ce qui peut se faire comme
qui met implicitement le
.value
de la cellule[A1]
(qui peut également être référencé commecells(1,1)
ourange("A1")
Exemple de problème: afficher l'entrée dans une boîte de message
Via Subroutine
Sub A:msgbox[A1]:End Sub
Via la fonction de fenêtre Immediates
msgbox[A1]
Saisie via des arguments de compilation conditionnelle
Les projets VBA prennent en charge la prise d'arguments à partir de la ligne de commande ou via les propriétés VBAProject (affichage via l'explorateur de projet -> [Votre projet VBA] - (clic droit) -> Propriétés VBAProject -> Arguments de compilation conditionnelle)
Ceci est largement utile pour les défis de code d'erreur
Étant donné l'argument de compilation conditionnelle
n=
[some_value], cela permet d'exécuter du code qui produira un code d'erreur, basé sur la valeur den
. notez que cela nécessite l'ajout de 2 octets à votre code pour lan=
section des arguments de compilation conditionnelle du volet Propriétés de VBAProject.Exemple de code
Sortie via la valeur de fonction
Pas grand-chose à dire ici, la forme générale de la citation ci-dessous est à peu près aussi compacte que possible.
REMARQUE: dans la grande majorité des cas, il est préférable de convertir la méthode en sous-programme et de la sortir vers la fenêtre VBE Immediates (voir ci-dessous)
Sortie des
Sub
routines et desFunction
s via la fenêtre VBE ImmediatesLa sortie vers la fenêtre VBE Immediates (AKA la fenêtre de débogage VBE) est une méthode de sortie courante pour VBA pour les défis basés sur du texte, cependant, il est important de se rappeler que l'
Debug.Print "Text"
appel peut être considérablement joué.est fonctionnellement identique à
comme
?
formats automatiques pourPrint
.Sortie à partir de
Sub
routines et de fonctions de fenêtre VBE Immediates via d'autres méthodesEn de rares occasions, lorsque la situation est parfaite, vous pouvez prendre des données à partir de certaines des entrées les plus triviales disponibles pour VBA, telles que le réglage de la taille de police, le sélecteur de police et le zoom. (Par exemple, émulation du sélecteur de taille de police Word )
la source
Note rapide sur le formatage
Parce que StackExchange utilise Markdown et Prettify.js il est possible d'ajouter un indicateur de langue à vos réponses de codage, ce qui les rend généralement plus professionnelles. Bien que je ne puisse pas garantir que cela vous rendra meilleur au golf à VBA, je peux garantir que cela vous fera ressembler à vous.
L'ajout de l'un des drapeaux ci-dessous transformera
à
Balises de langue VBA
<!-- language: lang-vb -->
<!-- language-all: lang-vb -->
Remarque: ce dernier transforme tous les segments de code dans votre réponse, tandis que le précédent transforme uniquement les segments de code immédiatement suivants
la source
lang-vb
hein? - Étrange que ça formate mieux quelang-vba
pour les réponses vba.lang-vba
fournira la surbrillance, c'est en fait juste la surbrillance par défaut. Apparemment, VBA n'a pas été réellement implémenté dans Prettify.js, nous devrons donc nous en tenir à la mise en évidence de VBPlusieurs
If .. Then
ContrôlesComme dans d'autres langues, plusieurs
If
contrôles peuvent généralement être combinés en une seule ligne, permettant l'utilisation deAnd
/Or
(c'est&&
-||
à- dire / en C et autres), qui en VBA remplace à la fois aThen
et anEnd If
.Par exemple, avec un conditionnel imbriqué ( 93 caractères):
peut devenir ( 69 caractères):
Cela fonctionne également avec les conditions non imbriquées.
Considérez ( 84 caractères):
Cela peut devenir ( 51 caractères):
la source
d=iif(a=b or c=b,0,d)
Fin des
For
bouclesLorsque vous utilisez des
For
boucles, unNext
ligne n'a pas besoin d'un nom de variable (bien qu'il soit probablement préférable de l'utiliser dans le codage normal).Donc,
peut être raccourci à:
(Les économies dépendent du nom de votre variable, mais si vous jouez au golf, c'est probablement juste 1 caractère + 1 espace.)
la source
Fractionner une chaîne en un tableau de caractères
Parfois, il peut être utile de séparer une chaîne en caractères individuels, mais cela peut prendre un peu de code pour le faire manuellement dans VBA.
Au lieu de cela, vous pouvez utiliser une seule ligne, une chaîne de fonctions relativement minimale pour faire le travail:
Cela affectera votre chaîne
s
auVariant
tableaua
. Soyez prudent, cependant, car le dernier élément du tableau sera une chaîne vide (""
), qui devra être gérée de manière appropriée.Voici comment cela fonctionne: La
StrConv
fonction convertit aString
dans un autre format que vous spécifiez. Dans ce cas, 64 =vbUnicode
, il se convertit donc au format unicode. Lorsqu'il s'agit de chaînes ASCII simples, le résultat est un caractère nul (pas une chaîne vide""
) inséré après chaque caractère.Ce qui suit
Split
convertira ensuite le résultatString
en un tableau, en utilisant le caractère nulChr(0)
comme délimiteur.Il est important de noter que ce
Chr(0)
n'est pas la même chose que la chaîne vide""
, et l'utilisationSplit
de""
on ne retournera pas le tableau auquel vous vous attendez. La même chose est également vraie pourvbNullString
(mais si vous jouez au golf, alors pourquoi utiliseriez-vous une telle constante verbeuse en premier lieu?).la source
Utilisation
With
(Parfois! Voir note de bas de page)En utilisant le
With
instruction peut réduire considérablement la taille de votre code si vous utilisez plusieurs objets à plusieurs reprises.c'est-à-dire ceci ( 80 caractères):
peut être codé comme ( 79 caractères):
Ce qui précède n'est même pas le meilleur des cas. Si vous utilisez quoi que ce soit avec
Application
, par exempleExcel.Application
depuis Access, l'amélioration sera beaucoup plus importante.* Selon la situation,
With
peut ou peut ne pas être plus efficace que cela ( 64 caractères):la source
Boucles infinies
Envisager de remplacer
ou
avec le nombre d'octets archaïque mais inférieur
Si vous devez quitter a
Sub
ouFunction
prématurément, au lieu deExit ...
considérer
End
Notez que
End
stoppe toute exécution de code et efface toutes les variables globales, donc utilisez-les judicieusementla source
For
etEnd
) pour refléter que le cas100
ne sera jamais satisfait et ajouter un octet inutileUtilisez
Spc(n)
plusSpace(n)
,[Rept(" ",n)]
ouString(n," ")
Lorsque vous essayez d'insérer plusieurs espaces de longueur
n
, utilisezplus de
Remarque: je ne sais pas pourquoi, mais il semble que vous ne pouvez pas affecter la sortie de
Spc(n)
à une variable, et qu'elle doit plutôt être imprimée directement - donc dans certains cas,Space(n)
c'est toujours la meilleure façon de procéder.la source
Réduction
Debug.Print
etPrint
appels(12 octets; notez l'espace de fin) peut être réduit à
(7 octets; notez le manque d'espace de fin).
De même,
(6 octets) peut être réduit à
(1 octet).
De plus, lorsque vous travaillez dans le contexte d'une fonction de fenêtre immédiate VBE anonyme, l'
Debug
instruction peut être entièrement supprimée et l'impression à la place dans la fenêtre immédiate VBE via?
peut être supposée être STDIN / STDOUTCaractères spéciaux
Lors de l'impression de chaînes, vous pouvez également utiliser des caractères spéciaux à la place de
&
. Ceux-ci permettent des formats alternatifs dans ce qui est imprimé ou la suppression des espacesPour joindre des chaînes variables, au lieu de
Vous pouvez utiliser un point-virgule
;
Ce point-virgule est le comportement par défaut pour les chaînes consécutives, tant qu'il n'y a pas d'ambiguïté. Donc, celles-ci sont valides:
Mais non
Notez que a; à la fin d'une ligne supprime une nouvelle ligne, car les nouvelles lignes sont ajoutées par défaut après chaque impression. Le comptage des octets retournés par le code VBA est en débat
Pour rejoindre un onglet, utilisez une virgule
,
(en fait 14 espaces, mais selon)Enfin, vous pouvez utiliser des déclarations de type pour joindre des chaînes au lieu de;, chacune ayant son propre léger effet sur la mise en forme. Pour tout ce qui suit
a = 3.14159
est la première lignela source
Utilisez un assistant
Sub
pourPrint
Si le code nécessite l'utilisation de plus de six
Debug.?
instructions, vous pouvez réduire les octets en remplaçant tous les débogages. lignes avec un appel à un Sub comme celui ci-dessous. Pour imprimer une ligne vierge, vous devez appelerp ""
car un paramètre est requis.la source
p""
ou si elle peut être unterminated,p"
. Cependant, dans la grande majorité des cas où cela peut s'appliquer, il est plus logique d'utiliser une variable de chaîne et de n'imprimer la variable de chaîne qu'à la fin.Utiliser
Array()
au lieu deChoose()
Select
ouIf...Then
Lorsque vous affectez une variable en fonction de la valeur d'une autre variable, il est logique d'écrire les étapes avec des
If...Then
contrôles, comme ceci:Cependant, cela peut prendre beaucoup d'espace de code s'il y a plus d'une ou deux variables à vérifier (il y a quand même généralement de meilleures façons de le faire).
Au lieu de cela, l'
Select Case
instruction permet de réduire la taille des vérifications en regroupant tout dans un bloc, comme suit:Cela peut conduire à un code beaucoup plus petit, mais pour des cas très simples comme celui-ci, il existe une méthode encore plus efficace:
Choose()
cette fonction sélectionne une valeur dans une liste, en fonction de la valeur qui lui est transmise.L'option à sélectionner (
a
dans ce cas) est une valeur entière passée comme premier argument. Tous les arguments suivants sont les valeurs à choisir (indexées 1, comme la plupart des VBA). Les valeurs peuvent être de n'importe quel type de données tant qu'elles correspondent à la variable définie (c'est-à-dire que les objets ne fonctionnent pas sans leSet
mot - clé) et peuvent même être des expressions ou des fonctions.Une option supplémentaire consiste à utiliser la
Array
fonction pour obtenir le même effet tout en enregistrant un autre caractère:la source
IIf()
or anotherChoose()
:A1=IIf(a=Choose(b,c,d,e),Choose(Choose(f,g,h,i),j,k,l),Choose(IIf(m=n,Choose(p,q,r,s),IIf(t=u,v,w)),x,y,z))
Bit-Shifted RGB Values
Because of the way that Excel handles colors, (unsigned, 6-character hexadecimal integer) you can make use of negatively signed integers, of which excel will only use the right 6 bytes to assign a color value
This is a bit confusing so some examples are provided below
Lets say you want to use the color white, which is stored as
and is equivalent to
to golf this down all we need to do is find a negative hexadecimal value which terminates in
FFFFFF
and since negative Hex values in must be in the format ofFFFFXXXXXX
(such thatX
is a valid hexadecimal) counting down fromFFFFFFFFFF
(-1
) toFFFF000001
(-16777215
)Knowing this we can generalize that the formula
Using this, some useful conversions are
la source
rgbWhite
=2^24-1
although could possibly be reduced further if you miss off the -1 to get roughly there&000080: 2^7, &000100: 2^8, &000200: 2^9, &000400: 2^10, &000800: 2^11, &001000: 2^12, &002000: 2^13, &004000: 2^14, &008000: 2^15, &010000: 2^16, &01FFFF: 2^17-1, &020000: 2^17, &03FFFF: 2^18-1, &040000: 2^18, &07FFFF: 2^19-1, &080000: 2^19, &0FFFFF: 2^20-1, &100000: 2^20, &1FFFFF: 2^21-1, &3FFFFF: 2^22-1, &400000: 2^22, &7FFFFF: 2^23-1
n.b. not necessarily complete, but I think I did a fairly thorough jobOmit terminal
"
when printing to Immediate WindowGiven the function below, which is to be used in the debug window
The Terminal
"
may be dropped for -1 Byte, leaving the string unclosed and the program shall execute the same, without errorEven more surprising than this is that this may be done within fully defined subroutines.
The subroutine above runs as expected and autoformats to
la source
Use Truthy and Falsey Variables in conditionals
Sometimes called implicit type conversion - directly using a number type in a
If
,[IF(...)]
orIIf(...)
statement, by using the truthy and falsey nature of that number can absolutely save you some bytes.In VBA, any number type variable that is non-zero is considered to be truthy ( and thus zero,
0
, is the only value falsey) and thusmay be condensed to
and further to
la source
Address Sheets By Name
Instead of Addressing a
WorkSheet
object by callingOne may use
Or More preferably one may access the object directly and use
la source
Exponentiation and
LongLong
s in 64-Bit VBAThe general form of exponentiation,
Can be represented as in VBA as
But Only in 32-Bit Installs of Office, in 64-Bits installs of Office, the shortest way that you may represent without error this is
This is because in 64-Bit versions of VBA
^
serves as both the exponentiation literal and theLongLong
type declaration character. This means that some rather odd-looking but valid syntax can arise such aswhich assigns variable
a
to hold the max value of aLonglong
la source
Compress Byte Arrays as String
For challanges that require the solution to hold constant data, it shall may be useful to compress that data as a single string and to then iterate across the string to fetch the data.
In VBA, any byte value may be directly converted to a character with
And a
long
orinteger
value may be converted to two characters withSo for a
byte
array a compression algorithm would look something likeNoting that the
Select Case
section is implemented due to the characters which may not be stored as literals in the string.From the resulting string, which will look something like
The data may then be extracted using the
Asc
andMid
functions, egla source
Use Improper Constants
VBA allows, in some cases, for the use of unlisted or improper constants in expressions which require constant values. These are often legacy values, and shorter in length than the proper values.
For example the values below may be used when letting a value be held by the
rng.HorizantalAlignment
property.This means, for example that setting a cell to having its text centered with
may be shortened down to
by replacing the improper constant value
3
for the proper value-4108
. Note that if you fetch therng.HorizantalAlignment
property value, it will return the proper value. In this case, that would be-4108
.la source
In Excel, Create Numeric Arrays by Coercing Ranges
When a constant single dimensional set of numerics of mixed length,S is needed, it shall be more efficient to use
[{...}]
notation to declare a range and then coerce that into a numeric array rather than to use theSplit(String)
notation or similar.Using this method, a change ofΔbyte count=−5 bytes shall be accrued for all S .
Example
For instance,
may be written as
It is further worth noting that while this method does not allow for direct indexing, it does allow for iteration over the for loop directly, ie
la source