Semelhante a isso , isso e essa pergunta ...
Que dicas gerais você tem para jogar golfe VBA
? Estou procurando idéias que possam ser aplicadas aos problemas de código de golfe em geral que sejam pelo menos um pouco específicos VBA
(por exemplo, "remover comentários" não é uma resposta). Poste uma dica por resposta.
Embora tenha trabalhado com outros idiomas, sou mais forte VBA
e não vejo muitos jogadores usando VBA
este site.
Respostas:
Explorar o
ByRef
padrão ao chamar subsÀs vezes, é possível usar uma
Sub
chamada no lugar de aFunction
para salvar alguns caracteres adicionais ...Isso ( 87 caracteres)
pode ser retrabalhado para ( 73 caracteres):
Observe que isso NÃO funcionará para sempre, embora pareça que você nunca está reatribuindo
b
o valor.O item acima não usa uma
Function
chamada, mas explora a funcionalidadeByRef
("Por referência") daSub
chamada. O que isso significa é que o argumento passado é a mesma variável que na função de chamada (em oposição a umaByVal
passagem "Por valor", que é uma cópia). Quaisquer modificações na variável passada serão convertidas de volta para a função de chamada.Por padrão, o vba aceita todos os argumentos como
ByRef
, portanto, não há necessidade de usar caracteres para definir isso.O exemplo acima pode não se traduzir perfeitamente para você, dependendo do valor de retorno da sua função. (ou seja, retornar um tipo de dados diferente do que é passado), mas isso também permite a possibilidade de obter um valor de retorno enquanto modifica sua variável original.
Por exemplo:
fonte
Escreva e execute o código VBA na janela imediata
A janela imediata avalia qualquer declaração executável do VBA válida. Simplesmente insira uma instrução na Janela Imediata como faria no editor de código. Ele executa rapidamente o código VBA e pode salvar muitos caracteres adicionais porque:
Aqui está o exemplo do código VBA na janela Immediate para responder à postagem do PPCG com a tag code-golf : A letra A sem A
respondido por Joffan .
Imagens de crédito: Excel Campus
fonte
a="value":?a
primeiro define o valor dea
e depois o imprime.Verificações condicionais antes do loop
Algumas verificações condicionais são redundantes quando usadas em conjunto com loops. Por exemplo, um
For
loop não será processado se a condição inicial estiver fora do escopo da condição em execução.Em outras palavras, isso ( 49 caracteres):
Pode ser transformado neste ( 24 caracteres):
fonte
Declaração Variável
Na maioria dos casos, no VBA, você pode deixar de fora
Option Explicit
(geralmente omitido por padrão) e pularDim
muitas de suas variáveis.Ao fazer isso, este ( 96 caracteres ):
Torna-se este ( 46 caracteres):
Se você precisar usar determinados objetos (por exemplo, matrizes), ainda poderá precisar
Dim
dessa variável.fonte
Evaluate()
E[]
Como foi apontado anteriormente, as chamadas de faixa codificadas podem ser reduzidas usando a
[A1]
notação entre colchetes . No entanto, tem muitos outros usos além disso.De acordo com a documentação do MSDN , o
Application.Evaluate()
método usa um único argumentoName
, conforme definido pela convenção de nomenclatura do Microsoft Excel.NB
[string]
é uma abreviação deEvaluate("string")
(observe as""
marcas de fala que indicam o tipo de dados da string), embora haja algumas diferenças importantes abordadas no final.Então, o que tudo isso significa em termos de uso?
Essencialmente,
[some cell formula here]
representa uma célula em uma planilha do Excel, e você pode colocar praticamente qualquer coisa nela e obter tudo o que poderia com uma célula normalO que se passa
Em resumo, com exemplos
[B7]
retorna uma referência a essa célula?[B7].Address
retornos"B$7$"
[A1:B5]
retorna uma referência de intervalo paraA1:B5
(Intervalo)[A1:B5 A3:D7]
retorna uma referência de intervalo paraA3:B5
(Intersect)[A1:B5,C1:D5]
retorna uma referência de intervalo paraA1:D5
(tecnicamenteA1:B5,C1:D5
) (União)[myRange]
referindo-se a A1: G5[Table1]
(possivelmente menos úteis para codegolf)Evaluate()
ou[]
[SUM(1,A1:B5,myRange)]
retorna a soma aritmética dos valores nos intervalos que myRange aqui se refere a um nome de pasta de trabalho e não a uma variável VBA[IF(A1=1,"true","false")]
(1 byte menor que o equivalente em vbaIif([A1]=1,"true","false")
)[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
- une todas as cadeias no intervalo cujo comprimento é maior que 2 com um espaço!
operador para se referir a uma célula ou a um nome definido em outra pasta de trabalho[[BOOK1]Sheet1!A1]
retorna uma referência de intervalo para A1 no BOOK1 ou['[MY WORKBOOK.XLSM]Sheet1!'A1]
para o mesmo emMY WORKBOOK
'
pastas de trabalho com espaços em seus nomes e a falta de extensão das pastas de trabalho nomeadas padrão (BOOK+n
)NB: eu fiz uma pergunta no SO para essas informações, então dê uma olhada lá para uma melhor explicação
O que sai
Semelhante ao que entra, o que sai inclui tudo o que uma célula da planilha pode retornar. Estes são os tipos de dados padrão do Excel (e seus equivalentes em VBA):
Boolean
)String
)Double
)Variant/Error
) (são erros sem interrupção, ou seja, não interrompem a execução do código,?[1/0]
executam bem)Mas há algumas coisas que podem ser retornadas que as células não podem:
Range
) (consulte as seções acima)Variant()
)Matrizes
Como foi mostrado,
[]
pode ser usado para avaliar fórmulas de matriz que retornam um dos tipos de dados padrão do Excel; por exemplo,[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
qual retornaText
. No entanto,Evaluate
também pode retornar matrizes doVariant
tipo. Estes podem serCodificado:
[{1,2;3,4}]
- gera uma matriz 2D:,
é o separador de colunas,;
separa linhas. Pode gerar uma matriz 1DFórmulas de matriz:
[ROW(A1:A5)]
- gera uma matriz 2D{1,2,3,4,5}
, ou seja, (2,1) é o segundo item (ainda que algumas funções gerem matrizes 1D)[LEN(A1:A5)]
gera apenas o comprimento do texto na 1ª célula de um intervaloSplit([CONCAT(" "&LEN(A1:A5))])
dá uma matriz 1D de 0 a 5, onde o primeiro item está vazio[INDEX(LEN(A1:A5),)]
é outra solução alternativa, essencialmente você deve empregar uma função de manipulação de matriz para obter o comportamento de retorno de matriz desejado, semelhante a adicionar um significadoRAND()
para tornar voláteis as fórmulas da planilha.Evaluate()
vs[]
Existem algumas diferenças entre
Evaluate()
e[]
estar ciente deEvaluate("SUM(B1,1,"&v &",2)")
resumiria[B1]
,1
,2
e variávelv
Matrizes
Ao retornar uma matriz, apenas o botão Avaliar pode ser usado com um índice de matriz, portanto
é equivalente a
fonte
i=[ROW(A1:A5)]:v=i(2,1):?v
Combinar
Next
declaraçõesPode ser condensado até
onde os iterators para as
For
laçadas sãoi
,j
, ek
- nessa ordem.Por exemplo, o abaixo (69 bytes)
Pode ser condensado em até 65 bytes
E, na medida em que isso afeta a formatação e o recuo, acho que a melhor abordagem para lidar com isso é alinhar a próxima declaração pela mais externa. Por exemplo.
fonte
Reduzindo
If
declaraçõesAo atribuir uma variável usando uma
If ... Then ... Else
verificação condicional , você pode reduzir a quantidade de código usada, eliminando oEnd If
colocando toda a verificação em uma linha.Por exemplo, este ( 37 caracteres):
Pode ser reduzido a isso ( 30 caracteres)
Se você tiver mais de uma condicional aninhada, também poderá minimizá-las desta maneira:
Observe que
:
permite adicionar mais de uma linha / comando dentro de umIf
bloco.Em casos simples como esse, você também pode remover a
Else
configuração da variável antes daIf
verificação ( 25 caracteres):Ainda melhor, o acima pode ser reduzido ainda mais usando a
IIf()
função ( 20 caracteres):fonte
Reduzir
Range("A1")
e curtir chamadasRange("A1").Value
(17 bytes) e o mais simplesRange("A1")
(11 bytes) pode ser reduzido para[A1]
(4 bytes)fonte
[]
para substituirEvaluate()
no VBA é muito mais versátil do que apenas chamadas de intervalo. Por exemplo, você pode usá-lo para substituirWorksheetFunction.FuncName(args)
com apenas[FuncName(args)]
, como?[SUMPRODUCT({1,3,5},{2,7,-1})]
ou o muito útil[MIN(1,2,3)]
/[MAX(1,2,3)]
Evaluate("str")
ou taquigrafia[str]
é muito poderoso no VBA, descobri recentemente e acho que também será útil para o golfe!Remover espaços
O VBA será formatado automaticamente para adicionar muito espaçamento que ele realmente não precisa. Há uma resposta na meta que faz muito sentido para mim porque podemos descontar os bytes adicionados pela formatação automática. É importante sempre verificar se você não removeu muito, no entanto. Por exemplo, aqui está uma resposta minha que foi reduzida em quase 22% apenas com a remoção de espaços:
Versão original: (188 bytes)
Versão reduzida: (146 bytes)
Se você copiar / colar a versão reduzida no VBA, ela será automaticamente expandida para o original. Você pode brincar com onde é válido remover espaços. Os que encontrei até agora parecem seguir o padrão em que o VBA espera que um determinado comando apareça porque, sem ele, não é um código válido. Aqui estão alguns que eu encontrei até agora:
+-=/*^
etc.To
eStep
em umaFor
declaração:For x=-3To 3Step 0.05
To
,&
,Then
, etc.) se for precedido por um literal, como um número,)
,?
,%
, etc.&
combinação de strings:Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
If s=StrReverse(s)Then
Replace(Space(28)," ",0)
fonte
?
vsPrint
eu vejo é aceitável, mas colocar declaração de tipo como&
imediatamente após uma variável, por exemplo,Debug.?a&"z"
dáDebug.Print a&; "z"
. O;
caractere adicionado é essencial para a execução do código - isso ainda é permitido?If i=1 Then
pode tornar-seIf i=1Then
, pois, como regra geral uma palavra reservada que segue um literal, seja um número,)
,?
,%
, .. etc, não precisam ser separados por um espaço)
(ou qualquer outro não-número literal) e&
Prepare-se para Pixel Art
A arte em pixel é de longe uma das áreas mais fortes do Excel, pois não há necessidade de construir uma tela, pois ela já existe para você - tudo o que você precisa fazer é fazer alguns pequenos ajustes
1) Faça as células quadradas
ou, alternativamente, por mais 1 byte, mas é muito mais fácil trabalhar com
2) Colorir a faixa necessária
Qualquer
Range
objeto pode ser colorido chamandoNota: isso pode e deve ser combinado com outros truques mencionados neste wiki, como referenciar intervalos pelo uso da
[]
notação (por exemplo[A1:R5,D6]
) sobre o uso de umCells(r,c)
ou umRange(cellAddress)
chamada. Além disso, conforme observado neste wiki, isso pode ser combinado com um valor de cor negativo para reduzir o tamanho das referências de coresReferências Rápidas
Referência de Gama
Célula
A1
pode ser referenciada de qualquer uma das seguintes maneirase a gama
A1:D4
podem ser referenciados de qualquer uma das seguintes maneirasReferência de cores
fonte
Simplifique as funções incorporadas
Ao usar determinadas funções com freqüência, reatribua-as a uma função definida pelo usuário.
O código a seguir ( 127 caracteres) pode ser reduzido de:
para ( 124 caracteres):
Combinando isso com o truque ByRef , você pode salvar ainda mais caracteres (até 114 ):
Faça isso criteriosamente, pois o VBA ocupa muitos caracteres para definir a
Function
. O segundo bloco de código seria realmente maior que o primeiro com um número menor deFormat()
chamadas.fonte
a = f(w)
pode ser reduzido af w
STDIN e STDOUT
Introdução a
Sub
rotinasFunction
es através de variáveis de entradaPode ser reduzido para
O
Public
eByRef
chamadas são o padrão para o VBA e, portanto, implícitas, e podem (quase) sempre ser descartadas.O tipo literal
$
forçab
a ser do tipoString
.Outros literais de tipo
!
solteiro@
Moeda#
Duplo%
Inteiro$
Corda&
Grandes^
LongLong (somente 64 bits)Além disso, é geralmente aceito que você possa deixar a variável de entrada como o tipo padrão
Variant
e deixar os erros baseados em tipo sem tratamento. Por exemplo.Sub E(F)
no qualF
se espera que seja do tipoBoolean[]
(que seria passado para a rotina comoE Array(True, False, False)
)Introdução a
Sub
rotinas e funções imediatas da janela viaCells
O VBA não tem um console totalmente funcional e, portanto, não tem qualquer oficial STDIN, e, portanto, permite a alguns jogadas com entradas passantes.
No Excel, geralmente é aceito receber informações de uma célula ou intervalo de células, o que pode ser feito como
que coloca implicitamente o
.value
da célula[A1]
(que também pode ser referenciado comocells(1,1)
ourange("A1")
Exemplo de problema: Exibir a entrada em uma caixa de mensagens
Via Sub-rotina
Sub A:msgbox[A1]:End Sub
Via janela Função
msgbox[A1]
Introdução através de argumentos de compilação condicional
Os Projetos VBA suportam a tomada de argumentos na linha de comando ou nas Propriedades do VBAProject (veja através do explorador de projeto -> [Seu projeto VBA] - (Clique com o botão direito do mouse) -> Propriedades do VBAProject -> Argumentos de compilação condicionais)
Isso é amplamente útil para desafios de código de erro
Dado o argumento de compilação condicional
n=
[some_value], isso permite executar o código que produzirá um código de erro, com base no valor den
. note que isso exige uma adição de 2 bytes ao seu código para an=
seção de argumentos de compilação condicional do Painel de Propriedades do VBAProject.Código de exemplo
Saída através do valor da função
Não há muito a dizer aqui, a forma geral de citar abaixo é tão compacta quanto possível.
OBSERVAÇÃO: na grande maioria dos casos, é mais byte converter o método em uma sub-rotina e enviar para a janela do VBE imediatamente (veja abaixo)
Saída de
Sub
rotinasFunction
es através da janela do VBE ImmediatesA saída para a janela imediata do VBE (também conhecida como janela de depuração do VBE) é um método de saída comum para o VBA para desafios baseados em texto; no entanto, é importante lembrar que a
Debug.Print "Text"
chamada pode ser substancialmente prejudicada.é funcionalmente idêntico ao
como
?
formatação automática paraPrint
.Saída de
Sub
rotinas e funções da janela VBE Immediates através de outros métodosEm raras ocasiões, quando a situação é certa, você pode receber informações de algumas das entradas mais triviais disponíveis para o VBA, como o ajustador de tamanho da fonte, o seletor de fontes e o zoom. (Por exemplo, emulando o seletor de tamanho de fonte do Word )
fonte
Nota rápida sobre formatação
Como o StackExchange usa Markdown e Prettify.js , é possível adicionar um sinalizador de idioma às suas respostas de codificação, o que geralmente as faz parecer mais profissionais. Embora eu não possa garantir que isso o melhore no golfe no VBA, posso garantir que isso fará com que você pareça.
A adição de um dos sinalizadores abaixo transformará
para
Tags de idioma do VBA
<!-- language: lang-vb -->
<!-- language-all: lang-vb -->
Nota: o último transforma todos os segmentos de código em sua resposta, enquanto o anterior transforma apenas os seguintes segmentos de código imediatamente
fonte
lang-vb
Eh? - Estranho que isso formate melhor do quelang-vba
para respostas vba.lang-vba
fornecerá destaque, na verdade é apenas o destaque padrão. Aparentemente VBA realmente não foi implementado em Prettify.js, por isso vamos ter que ficar com o destaque VBMúltiplo
If .. Then
verificaçõesComo em outros idiomas, várias
If
verificações geralmente podem ser combinadas em uma única linha, permitindo o uso deAnd
/Or
(ou seja,&&
/||
em C e outros), que no VBA substitui aThen
e aEnd If
.Por exemplo, com uma condicional aninhada ( 93 caracteres):
pode se tornar ( 69 caracteres):
Isso também funciona com condicionais não aninhados.
Considere ( 84 caracteres):
Isso pode se tornar ( 51 caracteres):
fonte
d=iif(a=b or c=b,0,d)
Final
For
LoopsAo usar
For
loops, umNext
linha não precisa de um nome de variável (embora provavelmente seja melhor usar na codificação normal).Portanto,
pode ser reduzido para:
(A economia depende do nome da sua variável, embora se você estiver jogando golfe, provavelmente seja apenas 1 caractere + 1 espaço.)
fonte
Dividir uma sequência em uma matriz de caracteres
Às vezes, pode ser útil dividir uma sequência em caracteres individuais, mas pode ser necessário um pouco de código para fazer isso manualmente no VBA.
Em vez disso, você pode usar uma única linha, uma cadeia de funções relativamente mínima para realizar o trabalho:
Isso atribuirá sua string
s
àVariant
matriza
. Porém, tenha cuidado, pois o último item da matriz será uma string vazia (""
), que precisará ser manuseada adequadamente.Eis como funciona: A
StrConv
função converte aString
em outro formato que você especificar. Nesse caso, 64 =vbUnicode
, então ele converte para um formato unicode. Ao lidar com cadeias ASCII simples, o resultado é um caractere nulo (não uma cadeia vazia""
) , inserido após cada caractere.A seguir
Split
, converteremos o resultado resultanteString
em uma matriz, usando o caractere nuloChr(0)
como delimitador.É importante observar que
Chr(0)
não é o mesmo que a string vazia""
, e usarSplit
on""
não retornará a matriz que você poderia esperar. O mesmo se aplica avbNullString
(mas se você está jogando golfe, por que você usaria uma constante tão detalhada em primeiro lugar?).fonte
Usando
With
(Às vezes! Ver nota de rodapé)Usando o
With
instrução pode reduzir significativamente o tamanho do código se você usar alguns objetos repetidamente.isto é ( 80 caracteres):
pode ser codificado como ( 79 caracteres):
O exposto acima nem é o melhor cenário. Se você usar algo com
Application
, comoExcel.Application
no Access, a melhoria será muito mais significativa.* Dependendo da situação,
With
pode ou não ser mais eficiente do que isso ( 64 caracteres):fonte
Loops infinitos
Considere a substituição
ou
com a contagem de bytes antiga, mas mais baixa
Se você precisar sair de um
Sub
ouFunction
prematuramente, em vez deExit ...
considerar
End
Observe que
End
interrompe toda a execução do código e limpa quaisquer variáveis globais, portanto, use com sabedoriafonte
For
eEnd
) para refletir que o caso100
nunca serão atingidos e adiciona um byte desnecessárioUse
Spc(n)
sobreSpace(n)
,[Rept(" ",n)]
ouString(n," ")
Ao tentar inserir vários espaços de comprimento
n
, usesobre
Nota: Não sei por que, mas parece que você não pode atribuir a saída de
Spc(n)
a uma variável e que ela deve ser impressa diretamente - portanto, em certos casos,Space(n)
ainda é o melhor caminho a percorrer.fonte
Reduzir
Debug.Print
ePrint
ligar(12 bytes; observe o espaço à direita) pode ser reduzido para
(7 bytes; observe a falta de espaço à direita).
Similarmente,
(6 bytes) pode ser reduzido para
(1 byte).
Além disso, ao operar no contexto de uma função de janela imediata anônima do VBE, a
Debug
instrução pode ser descartada inteiramente e, em vez disso, a impressão na janela imediata do VBE via?
pode ser assumida como STDIN / STDOUTCaracteres especiais
Ao imprimir strings, você também pode usar caracteres especiais no lugar de
&
. Eles permitem formatos alternativos no que é impresso ou na remoção de espaços em brancoPara juntar cadeias variáveis, em vez de
Você pode usar um ponto e vírgula
;
Esse ponto-e-vírgula é o comportamento padrão para seqüências consecutivas, desde que não haja ambiguidade. Portanto, elas são válidas:
Mas não
Observe que a; no final de uma linha suprime uma nova linha, pois as novas são adicionadas por padrão após cada impressão. Contagem de bytes retornados pelo código VBA está em debate
Para ingressar em uma guia, use uma vírgula
,
(na verdade, 14 espaços, mas de acordo com)Por fim, você pode usar declarações de tipo para unir seqüências de caracteres em vez de; cada uma tendo seu próprio efeito leve na formatação. Para todos os itens abaixo
a = 3.14159
é a primeira linhafonte
Use um ajudante
Sub
paraPrint
Se o código exigir o uso de mais de seis
Debug.?
instruções, você poderá reduzir os bytes substituindo todos os Debug. linhas com uma chamada para um Sub como o abaixo. Para imprimir uma linha em branco, é necessário chamar,p ""
pois é necessário um parâmetro.fonte
p""
ou se não puder ser terminadap"
,. No entanto, na grande maioria dos casos em que isso se aplica, faz mais sentido usar uma variável de sequência e imprimir apenas a variável de sequência no final.Use em
Array()
vez deChoose()
Select
ouIf...Then
Ao atribuir uma variável com base no valor de outra variável, faz sentido escrever as etapas com
If...Then
verificações, da seguinte maneira:No entanto, isso pode ocupar muito espaço de código se houver mais de uma ou duas variáveis para verificar (geralmente ainda existem maneiras melhores de fazer isso).
Em vez disso, a
Select Case
instrução ajuda a reduzir o tamanho das verificações, envolvendo tudo em um bloco, da seguinte maneira:Isso pode levar a um código muito menor, mas em casos muito simples como esse, existe um método ainda mais eficiente:
Choose()
Essa função seleciona um valor de uma lista, com base no valor passado para ela.A opção para selecionar (
a
neste caso) é um valor inteiro passado como o primeiro argumento. Todos os argumentos subseqüentes são os valores para escolher (indexado em 1, como a maioria dos VBA). Os valores podem ser de qualquer tipo de dados, desde que correspondam à variável que está sendo definida (ou seja, os objetos não funcionam sem aSet
palavra - chave) e podem até ser expressões ou funções.Uma opção adicional é usar a
Array
função para obter o mesmo efeito e salvar outro caractere:fonte
IIf()
ou outraChoose()
: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 com deslocamento de bits
Devido à maneira como o Excel lida com cores (número inteiro hexadecimal de 6 caracteres não assinado), você pode usar números inteiros assinados negativamente, dos quais o Excel usará apenas os 6 bytes corretos para atribuir um valor de cor
Isso é um pouco confuso, então alguns exemplos são fornecidos abaixo
Digamos que você queira usar a cor branca, que é armazenada como
e é equivalente a
Para reduzir isso tudo o que precisamos fazer é encontrar um valor hexadecimal negativo que termine em
FFFFFF
e, como valores hexadecimais negativos devem estar no formato deFFFFXXXXXX
(comoX
um hexadecimal válido), contando deFFFFFFFFFF
(-1
) aFFFF000001
(-16777215
)Sabendo disso, podemos generalizar que a fórmula
Usando isso, algumas conversões úteis são
fonte
rgbWhite
=2^24-1
Embora poderia ser reduzida ainda mais se você perder fora da -1 para obter cerca de lá&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 não necessariamente completos, mas eu acho que fiz um trabalho bastante minuciosoOmita o terminal
"
ao imprimir na janela imediataDada a função abaixo, que deve ser usada na janela de depuração
O Terminal
"
pode ser descartado por -1 Byte, deixando a string não fechada e o programa deve executar o mesmo, sem errosAinda mais surpreendente do que isso é que isso pode ser feito dentro de sub-rotinas totalmente definidas.
A sub-rotina acima é executada conforme o esperado e formata automaticamente
fonte
Use Variáveis Truthy e Falsey em condicionais
Às vezes chamada de conversão de tipo implícito - directamente utilizando um tipo de número em um
If
,[IF(...)]
ouIIf(...)
declaração, usando a natureza truthy e Falsey desse número pode absolutamente poupar alguns bytes.No VBA, qualquer variável de tipo numérico diferente de zero é considerada verdadeira (e, portanto, zero
0
, é o único valor falsey) e, portanto,pode ser condensado para
e ainda mais
fonte
Folhas de endereço por nome
Em vez de endereçar um
WorkSheet
objeto chamandoPode-se usar
Ou, mais preferencialmente, pode-se acessar o objeto diretamente e usar
fonte
Exponenciação e
LongLong
es no VBA de 64 bitsA forma geral de exponenciação,
Pode ser representado como no VBA como
Mas somente em instalações de 32 bits do Office , em instalações de 64 bits do Office, a maneira mais curta que você pode representar sem erro é
Isso ocorre porque nas versões de 64 bits do VBA
^
serve tanto o literal de exponenciação quanto oLongLong
caractere de declaração de tipo . Isso significa que pode surgir uma sintaxe bastante estranha, mas válida, comoque atribui a variável
a
para armazenar o valor máximo de umLonglong
fonte
Compactar matrizes de bytes como sequência
Para desafios que exigem que a solução mantenha dados constantes, pode ser útil compactar esses dados como uma única sequência e, em seguida, percorrer a sequência para buscar os dados.
No VBA, qualquer valor de byte pode ser convertido diretamente em um caractere com
E um valor
long
ouinteger
pode ser convertido em dois caracteres comPortanto, para uma
byte
matriz, um algoritmo de compressão seria algo comoObservando que a
Select Case
seção é implementada devido aos caracteres que não podem ser armazenados como literais na string.A partir da string resultante, que será algo como
Os dados podem então ser extraídos usando as funções
Asc
eMid
, por exemplofonte
Use constantes impróprias
O VBA permite, em alguns casos, o uso de constantes não listadas ou impróprias em expressões que exigem valores constantes. Geralmente, esses são valores herdados e mais curtos que os valores adequados.
Por exemplo, os valores abaixo podem ser usados ao permitir que um valor seja mantido pela
rng.HorizantalAlignment
propriedade.Isso significa, por exemplo, que definir uma célula para ter seu texto centralizado com
pode ser reduzido para
substituindo o valor constante incorreto
3
pelo valor adequado-4108
. Observe que, se você buscar orng.HorizantalAlignment
valor da propriedade, ele retornará o valor adequado. Nesse caso, isso seria-4108
.fonte
No Excel, crie matrizes numéricas por faixas de coagulação
Quando um conjunto unidimensional constante de números de comprimento misto,S for necessário, deve ser mais eficiente usar a
[{...}]
notação para declarar um intervalo e depois coagi-lo em uma matriz numérica, em vez de usar aSplit(String)
notação ou similar.Usando esse método, uma mudança deΔcontagem de bytes= - 5 bytes deve ser acumulado para todos S .
Exemplo
Por exemplo,
pode ser escrito como
Também é importante notar que, embora esse método não permita a indexação direta, ele permite a iteração diretamente no loop for, ou seja,
fonte