Similar a esto , esto y esta pregunta ...
¿Qué consejos generales tienes para jugar al golf VBA
? Estoy buscando ideas que se puedan aplicar a los problemas de golf de código en general que sean al menos algo específicos VBA
(por ejemplo, "eliminar comentarios" no es una respuesta). Por favor, publique un consejo por respuesta.
Si bien he trabajado con otros idiomas, soy más fuerte VBA
y no veo que muchos golfistas utilicen VBA
este sitio.
Respuestas:
Explotar el
ByRef
valor predeterminado al llamar a subsA veces es posible usar una
Sub
llamada en lugar de aFunction
para guardar algunos caracteres adicionales ...Esto ( 87 caracteres)
se puede reelaborar para ( 73 caracteres):
Tenga en cuenta que esto NO se repetirá para siempre, aunque parece que nunca está reasignando
b
el valor.Lo anterior no utiliza una
Function
llamada, sino que explota la funcionalidadByRef
("Por referencia") de laSub
llamada. Lo que esto significa es que el argumento pasado es la misma variable que en la función de llamada (en oposición a un pasoByVal
"Por valor", que es una copia). Cualquier modificación a la variable pasada se traducirá de nuevo a la función de llamada.Por defecto, vba toma todos los argumentos como
ByRef
, por lo que no es necesario usar caracteres para definir esto.El ejemplo anterior puede no traducirse perfectamente para usted, dependiendo del valor de retorno de su función. (es decir, devolver un tipo de datos diferente al que se pasa), pero esto también permite la posibilidad de obtener un valor de retorno sin modificar la variable original.
Por ejemplo:
fuente
Escriba y ejecute el código VBA en la ventana Inmediato
La ventana Inmediato evalúa cualquier instrucción ejecutable VBA válida. Simplemente ingrese una declaración en la ventana Inmediato como lo haría en el editor de código. Ejecuta rápidamente el código VBA y puede guardar muchos caracteres adicionales porque:
Aquí está el ejemplo del código VBA en la ventana Inmediato para responder la publicación de PPCG con la etiqueta code-golf : La letra A sin A
respondido por Joffan .
Imágenes de crédito: Excel Campus
fuente
a="value":?a
primero establece el valor dea
, luego lo imprime.Verificaciones condicionales antes de bucles
Algunas verificaciones condicionales son redundantes cuando se usan junto con bucles. Por ejemplo, un
For
bucle no se procesará si la condición de inicio está fuera del alcance de la condición de ejecución.En otras palabras, esto ( 49 caracteres):
Se puede convertir en esto ( 24 caracteres):
fuente
Declaración Variable
En la mayoría de los casos en VBA, puede omitir
Option Explicit
(a menudo se omite de forma predeterminada, de todos modos) y omitirDim
muchas de sus variables.Al hacerlo, esto ( 96 caracteres ):
Se convierte en esto ( 46 caracteres):
Si necesita usar ciertos objetos (por ejemplo, matrices), aún puede necesitar
Dim
esa variable.fuente
Evaluate()
Y[]
Como se señaló anteriormente, las llamadas de rango codificadas pueden reducirse utilizando la
[A1]
notación de corchetes . Sin embargo, tiene muchos más usos además de eso.De acuerdo con la documentación de MSDN , el
Application.Evaluate()
método toma un solo argumento, que es unName
, según lo definido por la convención de nomenclatura de Microsoft Excel.NB
[string]
es la abreviatura deEvaluate("string")
(tenga en cuenta las""
marcas de voz que denotan el tipo de datos de cadena), aunque hay algunas diferencias importantes que se cubren al final.Entonces, ¿qué significa todo eso en términos de uso?
Esencialmente,
[some cell formula here]
representa una celda en una hoja de cálculo de Excel, y puede poner casi cualquier cosa en ella y sacar todo lo que pueda con una celda normalLo que entra
En resumen, con ejemplos.
[B7]
devuelve una referencia a esa celda?[B7].Address
devuelve"B$7$"
[A1:B5]
devuelve una referencia de rango aA1:B5
(Rango)[A1:B5 A3:D7]
devuelve una referencia de rango aA3:B5
(Intersect)[A1:B5,C1:D5]
devuelve una referencia de rango aA1:D5
(técnicamenteA1:B5,C1:D5
) (Unión)[myRange]
referirse a A1: G5[Table1]
(posiblemente menos útil para codegolf)Evaluate()
o[]
[SUM(1,A1:B5,myRange)]
devuelve la suma aritmética de valores en los rangos myRange aquí se refiere al nombre de un libro de trabajo, no a una variable VBA[IF(A1=1,"true","false")]
(1 byte más corto que el equivalente vbaIif([A1]=1,"true","false")
)[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
: une todas las cadenas en el rango cuya longitud es mayor que 2 con un espacio!
operador para referirse a una celda o a un nombre definido en otro libro de trabajo[[BOOK1]Sheet1!A1]
devuelve una referencia de rango a A1 en BOOK1 o['[MY WORKBOOK.XLSM]Sheet1!'A1]
para el mismo enMY WORKBOOK
'
libros de trabajo con espacios en sus nombres y la falta de extensión para los libros de trabajo con nombre predeterminados (BOOK+n
)Nota: hice una pregunta sobre SO para obtener esta información, así que eche un vistazo allí para obtener una mejor explicación
Lo que sale
Similar a lo que entra, lo que sale incluye todo lo que una celda de la hoja de trabajo puede devolver. Estos son los tipos de datos estándar de Excel (y sus equivalentes de VBA):
Boolean
)String
)Double
)Variant/Error
) (estos son errores que no se rompen, es decir, no detienen la ejecución del código, se?[1/0]
ejecuta bien)Pero hay algunas cosas que pueden devolverse que las celdas no pueden:
Range
) (ver secciones anteriores)Variant()
)Matrices
Como se ha mostrado,
[]
se puede usar para evaluar fórmulas de matriz que devuelven uno de los tipos de datos estándar de Excel; por ejemplo,[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
que vuelveText
. Sin embargoEvaluate
, también puede devolver matrices deVariant
tipo. Estos pueden serHardcoded:
[{1,2;3,4}]
- Emite una matriz 2D:,
es el separador de columna,;
separa las filas. Puede generar una matriz 1DFórmulas de matriz:
[ROW(A1:A5)]
- genera una matriz 2D{1,2,3,4,5}
, es decir (2,1) es el segundo elemento (aunque algunas funciones generan matrices 1D)[LEN(A1:A5)]
solo genera la longitud del texto en la primera celda de un rangoSplit([CONCAT(" "&LEN(A1:A5))])
da una matriz 1D de 0 a 5, donde el primer elemento está vacío[INDEX(LEN(A1:A5),)]
Es otra solución, esencialmente debe emplear una función de manejo de matriz para obtener el comportamiento de retorno de matriz deseado, similar a agregar un sin sentidoRAND()
para hacer que sus fórmulas de hoja de trabajo sean volátiles.Evaluate()
vs[]
Hay algunas diferencias entre
Evaluate()
y[]
tener en cuentaEvaluate("SUM(B1,1,"&v &",2)")
sería resumir[B1]
,1
,2
y variablesv
Matrices
Al devolver una matriz, solo se puede usar Evaluate con un índice de matriz, por lo que
es equivalente a
fuente
i=[ROW(A1:A5)]:v=i(2,1):?v
Combinar
Next
declaracionesPuede condensarse hasta
donde los iteradores para los
For
bucles soni
,j
yk
- en ese orden.Por ejemplo, el siguiente (69 Bytes)
Puede condensarse hasta 65 bytes.
Y en cuanto a cómo esto afecta el formato y la sangría, creo que el mejor enfoque para manejar esto es alinear la siguiente declaración con la declaración más externa. P.ej.
fuente
Reductora
If
DeclaracionesAl asignar una variable usando un condicional
If ... Then ... Else
verificación , puede reducir la cantidad de código utilizado al eliminar elEnd If
al poner el cheque completo en una línea.Por ejemplo, esto ( 37 caracteres):
Se puede reducir a esto ( 30 caracteres)
Si tiene más de un condicional anidado, también puede minimizarlos de esta manera:
Nota la
:
que le permite agregar más de una línea / comando dentro de unIf
bloque.En casos simples como este, por lo general, también puede eliminar la
Else
configuración de la variable antes de laIf
verificación ( 25 caracteres):Aún mejor, lo anterior se puede reducir aún más a esto utilizando la
IIf()
función ( 20 caracteres):fuente
Reducir
Range("A1")
y Me gusta llamadasRange("A1").Value
(17 Bytes) y el más simpleRange("A1")
(11 Bytes) pueden reducirse a[A1]
(4 Bytes)fuente
[]
para reemplazarEvaluate()
en VBA es mucho más versátil que solo las llamadas de rango. Por ejemplo, puede usarlo para reemplazarWorksheetFunction.FuncName(args)
con just[FuncName(args)]
, como?[SUMPRODUCT({1,3,5},{2,7,-1})]
o el muy útil[MIN(1,2,3)]
/[MAX(1,2,3)]
Evaluate("str")
o la taquigrafía[str]
es muy poderosa en VBA, solo lo descubrí recientemente, ¡y supongo que también será útil para jugar al golf!Eliminar espacios
VBA se formateará automáticamente para agregar mucho espacio que realmente no necesita. Hay una respuesta sobre meta que tiene mucho sentido para mí por qué podemos descontar los bytes agregados mediante el formateo automático. Sin embargo, es importante verificar siempre que no haya eliminado demasiado. Por ejemplo, aquí hay una respuesta mía que se redujo casi un 22% simplemente eliminando espacios:
Versión original: (188 bytes)
Versión reducida: (146 bytes)
Si copia / pega la versión reducida en VBA, se expandirá automáticamente al original. Puedes jugar con dónde es válido eliminar espacios. Los que he encontrado hasta ahora parecen seguir el patrón donde se espera que VBA aparezca un cierto comando porque, sin él, no es un código válido. Aquí hay algunos que he encontrado hasta ahora:
+-=/*^
etc.To
yStep
en unFor
comunicado:For x=-3To 3Step 0.05
To
,&
,Then
, etc.) si está precedida por un literal, como un número,)
,?
,%
, etc.&
al combinar cadenas:Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
If s=StrReverse(s)Then
Replace(Space(28)," ",0)
fuente
?
vsPrint
Veo es aceptable, pero poner una declaración de tipo como&
inmediatamente después de una variable, por ejemplo,Debug.?a&"z"
daDebug.Print a&; "z"
. El;
carácter agregado es esencial para que se ejecute el código. ¿Todavía está permitido?If i=1 Then
puede llegar a serIf i=1Then
, ya que, como regla general, una palabra reservada que sigue un literal, ser que un número,)
,?
,%
, etc .., no necesitan ser separados por una espacio)
(o cualquier otro literal que no sea un número) y&
Prepárate para Pixel Art
Pixel art es, con mucho, una de las áreas más fuertes de Excel, ya que no hay necesidad de construir un lienzo, ya que está allí para usted, todo lo que necesita hacer es hacer algunos pequeños ajustes
1) Haz las celdas cuadradas
o, Alternativamente, por 1 byte más, pero es mucho más fácil trabajar con
2) Colorea el rango necesario
Cualquier
Range
objeto puede ser coloreado llamandoNota: esto puede y debe combinarse con otros trucos mencionados en este wiki, como los rangos de referencia mediante el uso de la
[]
notación (p[A1:R5,D6]
. Ej. ) Sobre el uso de unaCells(r,c)
o unaRange(cellAddress)
llamada. Además, como se señaló en este wiki, esto se puede combinar con un valor de color negativo para reducir el tamaño de las referencias de colorReferencias rápidas
Referencia de rango
Se
A1
puede hacer referencia a la celda de cualquiera de las siguientes manerasy se
A1:D4
puede hacer referencia al Rango de cualquiera de las siguientes manerasReferencia de color
fuente
Simplifica las funciones integradas
Cuando use ciertas funciones con frecuencia, reasignelas a una función definida por el usuario.
El siguiente código ( 127 caracteres) se puede reducir de:
a ( 124 caracteres):
Combinando esto con el truco ByRef , puede guardar aún más caracteres (hasta 114 ):
Haga esto juiciosamente, ya que VBA toma muchos personajes para definir a
Function
. El segundo bloque de código en realidad sería más grande que el primero con cualquier número deFormat()
llamadas menos .fuente
a = f(w)
se puede reducir af w
STDIN y STDOUT
Ingreso a
Sub
rutinas yFunction
s mediante variables de entradaPuede reducirse a
los
Public
yByRef
llamadas son las predeterminadas para VBA y, por lo tanto, son implícitas, y pueden (casi) siempre descartarse.El tipo literal
$
obligab
a ser del tipoString
.Otros literales tipo
!
Soltero@
Moneda#
Doble%
Entero$
Cuerda&
Largo^
LongLong (solo 64 bits)Además, generalmente se acepta que puede dejar la variable de entrada como el tipo predeterminado,
Variant
y dejar los errores basados en el tipo sin controlar. P.ej.Sub E(F)
en el queF
se espera que sea de tipoBoolean[]
(que se pasaría a la rutina comoE Array(True, False, False)
)Ingresando a
Sub
rutinas y funciones de ventana inmediata a través deCells
VBA no tiene una consola completamente funcional y, por lo tanto, no tiene ningún STDIN oficial , y por lo tanto permite algunos juego con el paso de entrada.
En Excel, generalmente se acepta tomar datos de una celda o rango de celdas, lo que se puede hacer como
que implícitamente pone el
.value
de la celda[A1]
(que también puede ser referenciado comocells(1,1)
orange("A1")
Problema de ejemplo: mostrar la entrada en un cuadro de mensaje
Vía subrutina
Sub A:msgbox[A1]:End Sub
Vía Función de ventana inmediata
msgbox[A1]
Ingreso a través de argumentos de compilación condicional
Los proyectos de VBA admiten la toma de argumentos desde la línea de comandos o mediante las propiedades de VBAProject (ver a través del explorador de proyectos -> [Su proyecto de VBA] - (Clic derecho) -> Propiedades de VBAProject -> Argumentos de compilación condicional)
Esto es en gran medida útil para los desafíos de código de error
Dado el argumento de compilación condicional
n=
[some_value], esto permite ejecutar código que producirá un código de error, basado en el valor den
. tenga en cuenta que esto requiere una adición de 2 bytes a su código para lan=
sección de argumentos de compilación condicional del Panel de propiedades de VBAProject.Código de ejemplo
Salida a través del valor de la función
No hay mucho que decir aquí, la forma general de citada a continuación es tan compacta como se puede hacer.
NOTA: en la gran mayoría de los casos, es más byte convertir el método a una subrutina y enviarlo a la ventana de VBE inmediata (ver más abajo)
Salida desde
Sub
rutinasFunction
ys a través de la ventana Inmediatos de VBELa salida a la ventana de inmediatos de VBE (también conocida como la ventana de depuración de VBE) es un método de salida común para VBA para desafíos basados en texto, sin embargo, es importante recordar que la
Debug.Print "Text"
llamada puede ser sustancialmente mejorada.es funcionalmente idéntico a
como
?
autoformatos paraPrint
.Salida de
Sub
rutinas y funciones de la ventana Inmediato de VBE a través de otros métodosEn raras ocasiones, cuando la situación es correcta, puede recibir información de algunas de las entradas más triviales disponibles para VBA, como el ajustador de tamaño de fuente, el selector de fuente y el zoom. (Por ejemplo, emular el selector de tamaño de fuente de Word )
fuente
Nota rápida sobre formateo
Porque StackExchange usa Markdown y Prettify.js , es posible agregar un indicador de idioma a sus respuestas de codificación, lo que generalmente las hace ver más profesionales. Si bien no puedo garantizar que esto te hará mejorar en el golf en VBA, sí puedo garantizar que te hará ver como eres.
Agregar cualquiera de las siguientes banderas transformará
a
Etiquetas de lenguaje VBA
<!-- language: lang-vb -->
<!-- language-all: lang-vb -->
Nota: el último transforma todos los segmentos de código en su respuesta, mientras que el anterior solo transforma los segmentos de código que siguen inmediatamente
fuente
lang-vb
eh? - Es extraño que eso formatee mejor quelang-vba
para las respuestas vba.lang-vba
si bien proporcionará resaltado, en realidad es solo el resaltado predeterminado. Aparentemente, VBA no se ha implementado realmente en Prettify.js, por lo que tendremos que seguir con el resaltado de VBMúltiples
If .. Then
controlesComo en otros idiomas, múltiples
If
controles generalmente se pueden combinar en una sola línea, lo que permite el uso deAnd
/Or
(es decir&&
/||
en C y otros), que en VBA sustituye a la vez unaThen
y unaEnd If
.Por ejemplo, con un condicional anidado ( 93 caracteres):
puede convertirse ( 69 caracteres):
Esto también funciona con condicionales no anidados.
Considere ( 84 caracteres):
Esto puede convertirse ( 51 caracteres):
fuente
d=iif(a=b or c=b,0,d)
terminando
For
LoopsAl usar
For
bucles, unNext
línea no necesita un nombre de variable (aunque probablemente sea mejor usarla en la codificación normal).Por lo tanto,
se puede acortar a:
(Los ahorros dependen de su nombre de variable, aunque si está jugando al golf, probablemente sea solo 1 carácter + 1 espacio).
fuente
Dividir una cadena en una matriz de caracteres
A veces puede ser útil separar una cadena en caracteres individuales, pero puede tomar un poco de código hacer esto manualmente en VBA.
En cambio, puede usar una sola línea, una cadena de funciones relativamente mínima para hacer el trabajo:
Esto asignará su cadena
s
a laVariant
matriza
. Sin embargo, tenga cuidado, ya que el último elemento de la matriz será una cadena vacía (""
), que deberá manejarse adecuadamente.Así es como funciona: la
StrConv
función convierte aString
a otro formato que especifique. En este caso, 64 =vbUnicode
, por lo que se convierte a un formato unicode. Cuando se trata de cadenas ASCII simples, el resultado es un carácter nulo (no una cadena vacía,""
) insertado después de cada carácter.Lo siguiente
Split
convertirá el resultadoString
en una matriz, utilizando el carácter nuloChr(0)
como delimitador.Es importante tener en cuenta que
Chr(0)
no es lo mismo que la cadena vacía""
, y usarSplit
on""
no devolverá la matriz que podría esperar. Lo mismo también es cierto paravbNullString
(pero si estás jugando al golf, ¿por qué usarías una constante tan detallada en primer lugar?).fuente
Uso
With
(¡A veces! Ver nota al pie)El uso de la
With
declaración puede reducir el tamaño de su código significativamente si usa algunos objetos repetidamente.es decir, esto ( 80 caracteres):
puede codificarse como ( 79 caracteres):
Lo anterior ni siquiera es el mejor de los casos. Si usa algo con
Application
, comoExcel.Application
desde Access, la mejora será mucho más significativa.* Dependiendo de la situación,
With
puede o no ser más eficiente que esto ( 64 caracteres):fuente
Bucles infinitos
Considere reemplazar
o
con el anticuado pero menor recuento de bytes
Si necesita salir
Sub
oFunction
prematuramente, en lugar deExit ...
considerar
End
Tenga en cuenta que
End
detiene toda la ejecución de código y borra las variables globales, así que use con prudenciafuente
For
yEnd
) para reflejar que el caso100
nunca se resolverá y agrega un byte innecesarioUtilizar
Spc(n)
másSpace(n)
,[Rept(" ",n)]
oString(n," ")
Cuando intente insertar varios espacios de longitud
n
, useterminado
Nota: No estoy seguro de por qué, pero parece que no puede asignar la salida de
Spc(n)
una variable, y que debe imprimirse directamente, por lo que en ciertos casosSpace(n)
sigue siendo la mejor manera de hacerlo.fuente
Reduce
Debug.Print
yPrint
llama(12 bytes; tenga en cuenta el espacio final) puede reducirse a
(7 bytes; tenga en cuenta la falta de espacio final).
Similar,
(6 bytes) puede reducirse a
(1 byte).
Además, cuando se opera en el contexto de una función de ventana inmediata anónima de VBE, la
Debug
declaración se puede descartar por completo, y en su lugar?
se puede suponer que la impresión en la ventana inmediata de VBE es STDIN / STDOUTCaracteres especiales
Al imprimir cadenas también puede usar caracteres especiales en lugar de
&
. Estos permiten formatos alternativos en lo que se imprime o eliminación de espacios en blancoPara unir cadenas variables, en lugar de
Puedes usar un punto y coma
;
Este punto y coma es el comportamiento predeterminado para cadenas consecutivas, siempre que no haya ambigüedad. Por lo tanto, estos son válidos:
Pero no
Tenga en cuenta que a; al final de una línea suprime una nueva línea, ya que las nuevas líneas se agregan por defecto después de cada impresión. El conteo de bytes devueltos por el código VBA está en debate
Para unirse con una pestaña use una coma
,
(en realidad 14 espacios, pero según)Finalmente, puede usar declaraciones de tipo para unir cadenas en lugar de; cada una tiene su propio ligero efecto en el formateo. Para todo lo que sigue
a = 3.14159
es la primera líneafuente
Use un ayudante
Sub
paraPrint
Si el código requiere el uso de más de seis
Debug.?
declaraciones, puede reducir los bytes reemplazando todos los Depuración. líneas con una llamada a un Sub como el de abajo. Para imprimir una línea en blanco, debe llamarp ""
ya que se requiere un parámetro.fuente
p""
o si puede ser sin terminar,p"
. Sin embargo, en la gran mayoría de los casos en los que esto puede aplicarse, tiene más sentido usar una variable de cadena y solo imprimir la variable de cadena al final.Usar en
Array()
lugar deChoose()
Select
oIf...Then
Al asignar una variable basada en el valor de otra variable, tiene sentido escribir los pasos con
If...Then
cheques, así:Sin embargo, esto puede ocupar mucho espacio de código si hay más de una o dos variables para verificar (de todos modos, en general todavía hay mejores maneras de hacerlo).
En cambio, la
Select Case
declaración ayuda a reducir el tamaño de los cheques al encerrar todo en un bloque, así:Esto puede conducir a un código mucho más pequeño, pero para casos muy simples como este, existe un método aún más eficiente:
Choose()
esta función seleccionará un valor de una lista, en función del valor que se le pase.La opción para seleccionar (
a
en este caso) es un valor entero pasado como primer argumento. Todos los argumentos posteriores son los valores para elegir (1 indexado, como la mayoría de VBA). Los valores pueden ser de cualquier tipo de datos siempre que coincidan con la variable establecida (es decir, los objetos no funcionan sin laSet
palabra clave) e incluso pueden ser expresiones o funciones.Una opción adicional es usar la
Array
función para obtener el mismo efecto mientras se guarda otro personaje:fuente
IIf()
u otroChoose()
: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))
Valores RGB con desplazamiento de bits
Debido a la forma en que Excel maneja los colores, (entero hexadecimal de 6 caracteres sin signo) puede usar enteros con signo negativo, de los cuales Excel solo usará los 6 bytes correctos para asignar un valor de color
Esto es un poco confuso, por lo que a continuación se proporcionan algunos ejemplos.
Digamos que desea utilizar el color blanco, que se almacena como
y es equivalente a
para reducir esto todo lo que tenemos que hacer es encontrar un valor hexadecimal negativo que termine en
FFFFFF
y dado que los valores hexadecimales negativos deben estar en el formato deFFFFXXXXXX
(tal queX
sea un hexadecimal válido) contando desdeFFFFFFFFFF
(-1
) hastaFFFF000001
(-16777215
)Sabiendo esto podemos generalizar que la fórmula
Usando esto, algunas conversiones útiles son
fuente
rgbWhite
=2^24-1
aunque posiblemente podría reducirse aún más si se pierde el -1 para llegar más o menos allí&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
nb no necesariamente completo, pero creo que hice un trabajo bastante exhaustivoOmitir terminal
"
al imprimir en Ventana InmediataDada la función a continuación, que se utilizará en la ventana de depuración
La Terminal
"
puede dejarse caer por -1 Byte, dejando la cadena sin cerrar y el programa ejecutará lo mismo, sin errorAún más sorprendente que esto es que esto se puede hacer dentro de subrutinas completamente definidas.
La subrutina anterior se ejecuta como se esperaba y los autoformatos para
fuente
Utilice las variables Truthy y Falsey en condicionales
A veces se llama conversión implícita - directamente a través de un tipo de número en una
If
,[IF(...)]
oIIf(...)
declaración, mediante el uso de la naturaleza y Truthy Falsey- de ese número puede absolutamente salvarte algunos bytes.En VBA, cualquier variable de tipo de número que no sea cero se considera verdadera (y, por lo tanto, cero
0
, es el único valor falsey) y, por lo tanto,puede condensarse a
y más allá de
fuente
Hojas de direcciones por nombre
En lugar de direccionar un
WorkSheet
objeto llamandoUno puede usar
O más preferiblemente, uno puede acceder al objeto directamente y usar
fuente
Exponenciación y
LongLong
s en VBA de 64 bitsLa forma general de exponenciación,
Se puede representar como en VBA como
Pero solo en las instalaciones de Office de 32 bits , en las instalaciones de Office de 64 bits, la forma más corta que puede representar sin error es
Esto se debe a que en las versiones de 64 bits de VBA
^
sirve tanto el literal de exponenciación como elLongLong
carácter de declaración de tipo . Esto significa que puede surgir una sintaxis válida pero de aspecto extraño, comoque asigna variable
a
para mantener el valor máximo de unLonglong
fuente
Comprimir matrices de bytes como cadena
Para los desafíos que requieren que la solución contenga datos constantes, puede ser útil comprimir esos datos como una sola cadena y luego iterar a través de la cadena para obtener los datos.
En VBA, cualquier valor de byte se puede convertir directamente a un carácter con
Y un valor
long
ointeger
puede convertirse a dos caracteres conEntonces, para una
byte
matriz, un algoritmo de compresión se vería algo asíObservando que la
Select Case
sección se implementa debido a los caracteres que no pueden almacenarse como literales en la cadena.De la cadena resultante, que se verá algo así
Los datos se pueden extraer utilizando las funciones
Asc
yMid
, p. Ej.fuente
Usar constantes impropias
VBA permite, en algunos casos, el uso de constantes no listadas o impropias en expresiones que requieren valores constantes. A menudo, estos son valores heredados y tienen una longitud más corta que los valores adecuados.
Por ejemplo, los valores a continuación se pueden usar cuando se deja que la
rng.HorizantalAlignment
propiedad mantenga un valor .Esto significa, por ejemplo, que configurar una celda para centrar su texto con
puede acortarse a
reemplazando el valor constante incorrecto
3
por el valor apropiado-4108
. Tenga en cuenta que si obtiene elrng.HorizantalAlignment
valor de la propiedad, devolverá el valor adecuado. En este caso, eso sería-4108
.fuente
En Excel, cree matrices numéricas coaccionando rangos
Cuando un conjunto constante unidimensional de números de longitud mixta,S es necesario, será más eficiente usar
[{...}]
notación para declarar un rango y luego forzarlo en una matriz numérica en lugar de usar laSplit(String)
notación o similar.Usando este método, un cambio deΔrecuento de bytes= - 5 bytes se devengará para todos S .
Ejemplo
Por ejemplo,
puede escribirse como
Vale la pena señalar que, si bien este método no permite la indexación directa, sí permite la iteración sobre el ciclo for directamente, es decir
fuente