Podobne do tego , tego i tego pytania ...
Jakie masz ogólne wskazówki na temat gry w golfa VBA
? Szukam pomysłów, które można by zastosować do ogólnych problemów z golfem, które są przynajmniej nieco specyficzne VBA
(np. „Usuń komentarze” nie jest odpowiedzią). Proszę zamieścić jedną wskazówkę na odpowiedź.
Chociaż pracuję z innymi językami, jestem najmocniejszy VBA
i nie widzę wielu golfistów korzystających VBA
z tej strony.
Odpowiedzi:
Wykorzystaj wartość
ByRef
domyślną podczas wywoływania subskrypcjiCzasami można użyć
Sub
połączenia zamiast a,Function
aby zapisać kilka dodatkowych znaków ...To ( 87 znaków)
można przerobić do ( 73 znaków):
Zauważ, że to NIE zapętla się wiecznie, choć wydaje się, że nigdy nie zmieniasz
b
wartości.Powyższe nie korzysta z
Function
połączenia, ale zamiast tego wykorzystuje funkcjęByRef
(„Przez odniesienie”)Sub
połączenia. Oznacza to, że przekazany argument jest tą samą zmienną, co w funkcji wywołującej (w przeciwieństwie doByVal
przekazywania „By Value”, które jest kopią). Wszelkie modyfikacje przekazanej zmiennej przełożą się z powrotem na funkcję wywołującą.Domyślnie vba przyjmuje wszystkie argumenty jako
ByRef
, więc nie ma potrzeby używania znaków do zdefiniowania tego.Powyższy przykład może nie tłumaczyć dla Ciebie idealnie, w zależności od wartości zwracanej przez twoją funkcję. (tj. zwracanie innego typu danych niż przekazywany), ale pozwala to również na uzyskanie wartości zwracanej przy jednoczesnym modyfikowaniu oryginalnej zmiennej.
Na przykład:
źródło
Napisz i uruchom kod VBA w oknie natychmiastowym
Natychmiastowe okno ocenia każdą poprawną instrukcję wykonywalną VBA. Wystarczy wpisać instrukcję w Natychmiastowym oknie, tak jak w edytorze kodu. Szybko wykonuje kod VBA i może zapisać wiele dodatkowych znaków, ponieważ:
Oto przykład kodu VBA w Natychmiastowym oknie, aby odpowiedzieć na post PPCG tagiem golf-golf : Litera A bez A
odpowiedział Joffan .
Zdjęcia kredytowe: kampus Excel
źródło
a="value":?a
najpierw ustawia wartośća
, a następnie drukuje ją.Kontrole warunkowe przed zapętleniem
Niektóre kontrole warunkowe są zbędne, gdy są używane w połączeniu z pętlami. Na przykład
For
pętla nie będzie przetwarzana, jeśli warunek początkowy jest poza zakresem warunku działania.Innymi słowy, to ( 49 znaków):
Można przekształcić w to ( 24 znaki):
źródło
Deklaracja zmienna
W większości przypadków w VBA możesz pominąć
Option Explicit
(często zresztą często pomijany) i pominąćDim
wiele zmiennych.W ten sposób ( 96 znaków):
Staje się tym ( 46 znaków):
Jeśli potrzebujesz użyć niektórych obiektów (na przykład tablic), może być konieczne zastosowanie
Dim
tej zmiennej.źródło
Evaluate()
I[]
Jak już wspomniano wcześniej, zakodowane na stałe wywołania zakresu można zmniejszyć za pomocą
[A1]
zapisu w nawiasach kwadratowych . Ma jednak znacznie więcej zastosowań niż tylko to.Według dokumentacji MSDN The
Application.Evaluate()
metoda przyjmuje jeden argument, który jestName
, jak określono w konwencji nazewnictwa programu Microsoft Excel.NB
[string]
jest skrótem odEvaluate("string")
(zwróć uwagę na""
znaki mowy oznaczające typ ciągu znaków), chociaż istnieje kilka ważnych różnic, które są omówione na końcu.Co to wszystko oznacza pod względem użytkowania?
Zasadniczo
[some cell formula here]
reprezentuje komórkę w arkuszu programu Excel i można w nią umieścić prawie wszystko i wyciągnąć z niej wszystko, co można uzyskać za pomocą normalnej komórkiCo wchodzi
Podsumowując, z przykładami
[B7]
zwraca odwołanie do tej komórki?[B7].Address
zwraca"B$7$"
[A1:B5]
zwraca odniesienie zakresu doA1:B5
(Range)[A1:B5 A3:D7]
zwraca odniesienie zakresu doA3:B5
(Przecięcie)[A1:B5,C1:D5]
zwraca odwołanie do zakresuA1:D5
(technicznieA1:B5,C1:D5
) (Unia)[myRange]
odnoszące się do A1: G5[Table1]
(być może mniej przydatne dla codegolf)Evaluate()
lub[]
[SUM(1,A1:B5,myRange)]
zwraca sumę arytmetyczną wartości w zakresach myRange tutaj odnosi się do nazwy skoroszytu, a nie zmiennej VBA[IF(A1=1,"true","false")]
(1 bajt krótszy niż odpowiednik VBAIif([A1]=1,"true","false")
)[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
- łączy wszystkie ciągi w zakresie, których długość jest większa niż 2, spacją!
operatora można odwoływać się do komórki lub nazwy zdefiniowanej w innym skoroszycie[[BOOK1]Sheet1!A1]
zwraca odniesienie zakresu do A1 w BOOK1 lub['[MY WORKBOOK.XLSM]Sheet1!'A1]
dla tego samego wMY WORKBOOK
'
na skoroszyty ze spacjami w nazwach i brak rozszerzenia dla domyślnych nazwanych skoroszytów (BOOK+n
)Uwaga: zadałem pytanie dotyczące SO dla tej informacji, więc zajrzyj tam, aby uzyskać lepsze wyjaśnienie
Co wychodzi
Podobnie do tego, co wchodzi, to, co wychodzi, obejmuje wszystko, co komórka arkusza roboczego może zwrócić. Są to standardowe typy danych Excel (i ich odpowiedniki VBA):
Boolean
)String
)Double
)Variant/Error
) (są to błędy nierozerwalne, tj. Nie wstrzymują wykonywania kodu, działają?[1/0]
poprawnie)Ale jest kilka rzeczy, które można zwrócić, których komórki nie mogą:
Range
) (patrz powyższe sekcje)Variant()
)Tablice
Jak pokazano,
[]
można go użyć do oceny formuł tablicowych, które zwracają jeden ze standardowych typów danych Excel; np.[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
który zwracaText
.Evaluate
Może jednak również zwracać tabliceVariant
typu. Mogą byćMocno zakodowane:
[{1,2;3,4}]
- wyprowadza tablicę 2D:,
jest separatorem kolumn,;
oddziela wiersze. Może wyprowadzać tablicę 1DFormuły tablicowe:
[ROW(A1:A5)]
- wypisuje tablicę 2D{1,2,3,4,5}
, tzn. (2,1) jest drugim elementem (jednak niektóre funkcje generują tablice 1D)[LEN(A1:A5)]
wyświetla tylko długość tekstu w pierwszej komórce zakresuSplit([CONCAT(" "&LEN(A1:A5))])
daje tablicę 1D od 0 do 5, gdzie pierwszy element jest pusty[INDEX(LEN(A1:A5),)]
to kolejne obejście, w zasadzie musisz zastosować funkcję obsługi tablicy, aby uzyskać pożądane zachowanie zwracania tablicy, podobnie jak dodawanie bez znaczenia,RAND()
aby formuły arkusza kalkulacyjnego były zmienne.Evaluate()
vs[]
Istnieje kilka różnic
Evaluate()
i[]
aby mieć świadomośćEvaluate("SUM(B1,1,"&v &",2)")
byłoby podsumować[B1]
,1
,2
oraz zmiennąv
Tablice
Zwracając tablicę, tylko ocena może być używana z indeksem tablicy, więc
jest równa
źródło
i=[ROW(A1:A5)]:v=i(2,1):?v
Połącz
Next
wyciągiMoże być skondensowany do
gdzie iteratory dla
For
pętli sąi
,j
ik
- w tej kolejności.Na przykład poniżej (69 bajtów)
Może być skondensowany do 65 bajtów
I jeśli chodzi o to, jak wpływa to na formatowanie i wcięcia, myślę, że najlepszym podejściem do rozwiązania tego problemu jest wyrównanie następnej instrukcji z najbardziej zewnętrzną dla instrukcji. Na przykład.
źródło
Zmniejszenie
If
oświadczeńPrzypisując zmienną za pomocą
If ... Then ... Else
testu warunkowego , można zmniejszyć ilość używanego kodu, eliminującEnd If
go, umieszczając cały test w jednym wierszu.Na przykład to ( 37 znaków):
Można sprowadzić do tego ( 30 znaków)
Jeśli masz więcej niż jedną opcję zagnieżdżoną, możesz ją również zminimalizować w ten sposób:
Uwaga:
:
pozwala dodać więcej niż jedną linię / polecenie wIf
bloku.W prostych przypadkach, takich jak ten, zwykle można również usunąć
Else
, ustawiając zmienną przedIf
sprawdzeniem ( 25 znaków):Co więcej, powyższe można dodatkowo sprowadzić do tego za pomocą
IIf()
funkcji ( 20 znaków):źródło
Zmniejsz
Range("A1")
i polub połączeniaRange("A1").Value
(17 bajtów) i prostszeRange("A1")
(11 bajtów) można zmniejszyć do[A1]
(4 bajtów)źródło
[]
zamianyEvaluate()
w VBA jest o wiele bardziej wszechstronne niż zwykłe wywołania zasięgu. Np. Możesz go użyć do zastąpieniaWorksheetFunction.FuncName(args)
just[FuncName(args)]
, np.?[SUMPRODUCT({1,3,5},{2,7,-1})]
Lub bardzo przydatnym[MIN(1,2,3)]
/[MAX(1,2,3)]
Evaluate("str")
lub stenografia[str]
jest bardzo mocna w VBA, dopiero niedawno się dowiedziałam i myślę, że przyda się również w golfa!Usuń spacje
VBA automatycznie sformatuje się, aby dodać dużo odstępów, których tak naprawdę nie potrzebuje. Tam jest odpowiedź na meta sprawia, że wiele sensu dla mnie, dlaczego możemy zniżka bajtów dodane przez auto-formatowania. Ważne jest jednak, aby zawsze sprawdzać, czy nie usunięto zbyt wiele. Na przykład, oto moja odpowiedź, która została zmniejszona prawie o 22% poprzez usunięcie spacji:
Wersja oryginalna: (188 bajtów)
Wersja zredukowana: (146 bajtów)
Jeśli skopiujesz / wkleisz zredukowaną wersję do VBA, automatycznie rozwinie się ona do oryginału. Możesz bawić się, gdzie jest to właściwe, aby usunąć spacje. Te, które do tej pory znalazłem, wydają się być zgodne ze wzorem, w którym oczekuje się, że VBA pojawi się pewne polecenie, ponieważ bez niego nie jest to prawidłowy kod. Oto niektóre, które do tej pory znalazłem:
+-=/*^
itp.To
iStep
wFor
oświadczeniu:For x=-3To 3Step 0.05
To
,&
,Then
, itd.), Jeśli jest poprzedzony dosłownym takie jak numer,)
,?
,%
, itd.&
połączeniu ciągów:Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
If s=StrReverse(s)Then
Replace(Space(28)," ",0)
źródło
?
vsPrint
widzę jest akceptowalne, ale umieszczanie deklaracji typu jak&
natychmiast po zmiennej np .Debug.?a&"z"
DajeDebug.Print a&; "z"
.;
Jest zasadniczy charakter dodany do kodu, aby uruchomić - jest to nadal dozwolone?If i=1 Then
może staćIf i=1Then
, ponieważ, zgodnie z ogólną zasadą zarezerwowanym słowem, które następuje dosłownym, możliwe, że liczba,)
,?
,%
, .. etc, nie muszą być oddzielone space)
(lub innym dosłownym nieliczbowym) a&
Przygotuj się na Pixel Art
Grafika pikselowa jest zdecydowanie jednym z najsilniejszych obszarów programu Excel, ponieważ nie ma potrzeby budowania płótna, ponieważ jest już dla Ciebie - wystarczy wprowadzić niewielkie poprawki
1) Ustaw komórki w kwadrat
lub, alternatywnie, o 1 bajt więcej, ale o wiele łatwiejsze w pracy
2) Pokoloruj potrzebny zakres
Każdy
Range
obiekt może być pokolorowany przez wywołanieUwaga: można to i należy łączyć z innymi sztuczkami zanotowanymi na tej wiki, takimi jak odwoływanie się do zakresów za pomocą
[]
notacji (np.[A1:R5,D6]
) Nad użyciem aCells(r,c)
lubRange(cellAddress)
wywołania. Ponadto, jak zauważono na tej wiki, można to połączyć z ujemną wartością koloru, aby zmniejszyć rozmiar odniesień kolorówSzybkie referencje
Zakres odniesienia
Do komórki
A1
można się odwoływać na jeden z poniższych sposobówa Zasięg
A1:D4
może być przywoływany na jeden z poniższych sposobówKolor odniesienia
źródło
Uprość wbudowane funkcje
W przypadku częstego korzystania z niektórych funkcji należy ponownie przypisać je do funkcji zdefiniowanej przez użytkownika.
Poniższy kod ( 127 znaków) można zmniejszyć z:
do ( 124 znaków):
Łącząc to ze sztuczką ByRef , możesz zapisać jeszcze więcej znaków (do 114 ):
Zrób to rozsądnie, ponieważ VBA wymaga wielu znaków do zdefiniowania
Function
. Drugi blok kodu byłby w rzeczywistości większy niż pierwszy przy dowolnej liczbieFormat()
połączeń mniejszej .źródło
a = f(w)
można je zredukować dof w
STDIN i STDOUT
Wprowadzanie do
Sub
procedur isFunction
za pomocą zmiennych wejściowychMożna zmniejszyć do
Public
IByRef
rozmowy są domyślne dla VBA i tym samym implicite, a może (prawie) zawsze zostać pominięte.Literał typu
$
wymuszab
na nim typString
.Literały innego rodzaju
!
Pojedynczy@
Waluta#
Podwójnie%
Liczba całkowita$
Strunowy&
Długo^
LongLong (tylko wersja 64-bitowa)Ponadto ogólnie przyjmuje się, że można pozostawić zmienną wejściową jako typ domyślny
Variant
i pozostawić wszelkie błędy związane z typem bez obsługi. Na przykład.Sub E(F)
w którymF
oczekuje się, że będzie typuBoolean[]
(który zostałby przekazany do procedury podobnej doE Array(True, False, False)
)Wprowadzanie do
Sub
procedur i natychmiastowych funkcji okna za pośrednictwemCells
VBA nie ma w pełni funkcjonalnej konsoli, a zatem nie ma oficjalnego STDIN, a zatem pozwala niektóre grę z przekazywaniem danych wejściowych.
W programie Excel ogólnie przyjmuje się dane wejściowe z komórki lub zakresu komórek, co można zrobić podobnie
która niejawnie umieszcza
.value
komórkę[A1]
(która może być również określana jakocells(1,1)
lubrange("A1")
Przykład problemu: wyświetl dane wejściowe w oknie komunikatu
Poprzez podprogram
Sub A:msgbox[A1]:End Sub
Za pośrednictwem natychmiastowej funkcji okna
msgbox[A1]
Wprowadzanie za pomocą argumentów warunkowej kompilacji
Projekty VBA obsługują pobieranie argumentów z wiersza poleceń lub właściwości VBAProject (widok za pomocą eksploratora projektu -> [Twój projekt VBA] - (Kliknij prawym przyciskiem myszy) -> Właściwości VBAProject -> Argumenty warunkowej kompilacji)
Jest to w dużej mierze przydatne w przypadku wyzwań związanych z kodami błędów
Biorąc pod uwagę argument warunkowej kompilacji
n=
[some_value] pozwala to na wykonanie kodu, który wygeneruje kod błędu na podstawie wartościn
. uwaga: wymaga to dodania 2 bajtów do kodun=
w sekcji argumentów kompilacji warunkowej w panelu właściwości VBAProject.Przykładowy kod
Wyprowadzanie przez wartość funkcji
Nie wspominając już o tym, ogólna forma cytowania poniżej jest tak zwarta, jak to tylko możliwe.
UWAGA: w zdecydowanej większości przypadków konwersja metody na podprogram jest bardziej bajtowa, a wyjście do okna natychmiastowego VBE (patrz poniżej)
Wyjście z
Sub
procedur isFunction
za pośrednictwem okna natychmiastowego VBEWyjście do okna natychmiastowego VBE (AKA to okno debugowania VBE) jest powszechną metodą wyjściową dla VBA dla wyzwań opartych na tekście, jednak ważne jest, aby pamiętać, że
Debug.Print "Text"
połączenie może być znacznie golfowane.jest funkcjonalnie identyczny z
jako
?
autoformatowanie doPrint
.Wyprowadzanie z
Sub
procedur i VBE Immediates funkcje okna za pomocą innych metodW rzadkich przypadkach, gdy sytuacja jest w porządku, możesz wziąć dane z niektórych bardziej trywialnych danych wejściowych dostępnych dla VBA, takich jak regulacja rozmiaru czcionki, wybór czcionki i powiększenie. (Np. Emulowanie selektora rozmiaru czcionki Word )
źródło
Szybka uwaga na temat formatowania
Ponieważ StackExchange używa Markdown i Prettify.js , możliwe jest dodanie flagi języka do twoich odpowiedzi na kodowanie, co ogólnie sprawia, że wyglądają bardziej profesjonalnie. Chociaż nie mogę zagwarantować, że sprawi to, że będziesz lepiej grać w golfa w VBA, mogę zagwarantować, że sprawi, że będziesz wyglądać jak jesteś.
Dodanie jednej z poniższych flag zmieni się
do
Tagi językowe VBA
<!-- language: lang-vb -->
<!-- language-all: lang-vb -->
Uwaga: ten ostatni przekształca wszystkie segmenty kodu w twojej odpowiedzi, podczas gdy poprzedni przekształca tylko bezpośrednio następujące segmenty kodu
źródło
lang-vb
co? - Dziwne, że ten format jest lepszy niżlang-vba
przypadku odpowiedzi VBA.lang-vba
zapewni podświetlanie, jest tak naprawdę tylko domyślnym podświetleniem. Najwyraźniej VBA nie zostało zaimplementowane w Prettify.js, więc będziemy musieli trzymać się podświetlenia VBWiele
If .. Then
kontroliPodobnie jak w innych językach, wiele
If
kontroli można zwykle połączyć w jedną linię, co pozwala na użycieAnd
/Or
(tj.&&
/||
W C i innych), co w VBA zastępuje zarówno a, jakThen
i anEnd If
.Na przykład z zagnieżdżoną funkcją warunkową ( 93 znaki):
może zostać ( 69 znaków):
Działa to również z nie zagnieżdżonymi warunkami.
Rozważ ( 84 znaków):
Może to być ( 51 znaków):
źródło
d=iif(a=b or c=b,0,d)
Kończący się
For
pętliPodczas używania
For
pętli aNext
linia nie potrzebuje nazwy zmiennej (chociaż prawdopodobnie lepiej jest użyć jej w normalnym kodowaniu).W związku z tym,
można skrócić do:
(Oszczędności zależą od twojej zmiennej nazwy, choć jeśli grasz w golfa, prawdopodobnie jest to tylko 1 znak + 1 spacja).
źródło
Podziel ciąg na tablicę znaków
Czasami może być przydatne podzielenie łańcucha na poszczególne znaki, ale może to wymagać trochę kodu, aby to zrobić ręcznie w VBA.
Zamiast tego możesz użyć jednego wiersza, względnie minimalnego łańcucha funkcji, aby wykonać zadanie:
Spowoduje to przypisanie łańcucha
s
doVariant
tablicya
. Uważaj jednak, ponieważ ostatnim elementem w tablicy będzie pusty ciąg (""
), z którym trzeba będzie odpowiednio się obchodzić.Oto jak to działa:
StrConv
Funkcja konwertuje aString
na inny określony format. W tym przypadku 64 =vbUnicode
, więc konwertuje do formatu Unicode. W przypadku prostych ciągów ASCII wynikiem jest znak pusty (nie ciąg pusty""
) wstawiany po każdym znaku.Poniższe
Split
przekształci wynikString
w tablicę, używając znaku pustegoChr(0)
jako separatora.Ważne jest, aby pamiętać, że
Chr(0)
to nie to samo co pusty ciąg""
, a użycieSplit
on""
nie zwróci oczekiwanej tablicy. To samo dotyczy równieżvbNullString
(ale jeśli grasz w golfa, to dlaczego miałbyś w ogóle używać takiej pełnej stałej?).źródło
Za pomocą
With
(czasami! Patrz przypis)Używając
With
instrukcji może znacznie zmniejszyć rozmiar kodu, jeśli wielokrotnie używasz niektórych obiektów.tj. to ( 80 znaków):
może być zakodowany jako ( 79 znaków):
Powyższe nie jest nawet najlepszym scenariuszem. Jeśli korzystasz z czegokolwiek
Application
, na przykładExcel.Application
z poziomu programu Access, poprawa będzie znacznie bardziej znacząca.* W zależności od sytuacji
With
może, ale nie musi być bardziej wydajny ( 64 znaki):źródło
Nieskończone pętle
Rozważyć wymianę
lub
z przestarzałą, ale niższą liczbą bajtów
Jeśli musisz wyjść z
Sub
lubFunction
przedwcześnie, to zamiastExit ...
rozważać
End
Pamiętaj, że
End
zatrzymuje wykonywanie kodu i usuwa wszystkie zmienne globalne, więc używaj mądrzeźródło
For
iEnd
), aby odzwierciedlić, że sprawa100
nigdy nie zostanie spełniona, i doda niepotrzebny bajtUżyj
Spc(n)
nadSpace(n)
,[Rept(" ",n)]
lubString(n," ")
Podczas próby wstawienia kilku spacji długości
n
, użyjnad
Uwaga: Nie jestem pewien, dlaczego, ale wydaje się, że nie można przypisać wyniku
Spc(n)
do zmiennej i że należy ją wydrukować bezpośrednio - więc w niektórych przypadkachSpace(n)
jest to nadal najlepsza droga.źródło
Zmniejsz
Debug.Print
iPrint
połączenia(12 bajtów; zwróć uwagę na spację końcową) można zmniejszyć do
(7 bajtów; zwróć uwagę na brak spacji końcowej).
Podobnie,
(6 bajtów) można zmniejszyć do
(1 bajt).
Ponadto, podczas działania w kontekście anonimowej funkcji bezpośredniego okna VBE,
Debug
instrukcja może zostać całkowicie usunięta, a zamiast tego drukowana do bezpośredniego okna VBE za pośrednictwem?
STDIN / STDOUTZnaki specjalne
Podczas drukowania ciągów możesz również użyć znaków specjalnych zamiast
&
. Umożliwiają one alternatywne formaty w drukowaniu lub usuwaniu białych znakówAby połączyć łańcuchy zmiennych zamiast
Możesz użyć średnika
;
Ten średnik jest domyślnym zachowaniem dla kolejnych ciągów, o ile nie ma dwuznaczności, więc są one poprawne:
Ale nie
Zauważ, że a; na końcu linii pomija nową linię, ponieważ nowe linie są domyślnie dodawane po każdym wydruku. Liczenie bajtów zwróconych przez kod VBA jest przedmiotem dyskusji
Aby połączyć się tabulatorem, użyj przecinka
,
(właściwie 14 spacji, ale zgodnie z)Na koniec możesz użyć deklaracji typu do łączenia ciągów zamiast; każda z nich ma swój niewielki wpływ na formatowanie. Dla wszystkich poniżej
a = 3.14159
jest pierwszy wierszźródło
Użyj pomocnika
Sub
doPrint
Jeśli kod wymaga użycia więcej niż sześciu
Debug.?
instrukcji, możesz zmniejszyć bajty, zastępując wszystkie Debugowanie. linie z wywołaniem subwoofera, takiego jak ten poniżej. Aby wydrukować pustą linię, musisz zadzwonić,p ""
ponieważ wymagany jest parametr.źródło
p""
czy może to być niezakończony,p"
. Jednak w zdecydowanej większości przypadków, gdy może to mieć zastosowanie, bardziej sensowne jest użycie zmiennej łańcuchowej i drukowanie zmiennej łańcuchowej tylko na końcu.Posługiwać się
Array()
zamiastChoose()
Select
lubIf...Then
Przypisując zmienną na podstawie wartości innej zmiennej, sensowne jest zapisanie kroków za pomocą
If...Then
czeków:Może to jednak zająć dużo miejsca w kodzie, jeśli do sprawdzenia jest więcej niż jedna lub dwie zmienne (i tak są ogólnie lepsze sposoby).
Zamiast tego
Select Case
instrukcja pomaga zmniejszyć rozmiar kontroli, otaczając wszystko w jednym bloku, na przykład:Może to prowadzić do znacznie mniejszego kodu, ale w bardzo prostych przypadkach, takich jak ten, istnieje jeszcze bardziej wydajna metoda:
Choose()
Ta funkcja wybierze wartość z listy na podstawie przekazanej jej wartości.Opcja wyboru (
a
w tym przypadku) to wartość całkowita przekazywana jako pierwszy argument. Wszystkie kolejne argumenty są wartościami do wyboru (indeksowane 1, jak większość VBA). Wartości mogą być dowolnego typu danych, o ile są zgodne z ustawianą zmienną (tzn. Obiekty nie działają bezSet
słowa kluczowego), a nawet mogą być wyrażeniami lub funkcjami.Dodatkową opcją jest użycie
Array
funkcji, aby uzyskać ten sam efekt podczas zapisywania innej postaci:źródło
IIf()
lub innymChoose()
: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))
Przesunięte bitowo wartości RGB
Ze względu na sposób, w jaki Excel obsługuje kolory ((bez znaku, 6-znakowa liczba szesnastkowa), możesz korzystać z liczb całkowitych ujemnie podpisanych, z których program Excel użyje tylko 6 bajtów, aby przypisać wartość koloru
Jest to nieco mylące, dlatego niektóre przykłady podano poniżej
Powiedzmy, że chcesz użyć koloru białego, który jest zapisany jako
i jest równoważne z
aby zagrać w golfa wszystko, co musimy zrobić, to znaleźć ujemną wartość szesnastkową, która kończy się w,
FFFFFF
a ponieważ ujemne wartości szesnastkowe muszą mieć formatFFFFXXXXXX
(taki, któryX
jest prawidłowym szesnastkowym) odliczający odFFFFFFFFFF
(-1
) doFFFF000001
(-16777215
)Wiedząc o tym, możemy uogólnić ten wzór
Korzystając z tego, przydatne są konwersje
źródło
rgbWhite
=2^24-1
chociaż może być jeszcze bardziej zredukowany, jeśli spudłujesz z -1, aby dostać się tam mniej więcej&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 niekoniecznie kompletne, ale myślę, że wykonałem dość dokładną robotęPomiń terminal
"
podczas drukowania do okna natychmiastowegoBiorąc pod uwagę poniższą funkcję, która ma być używana w oknie debugowania
Terminal
"
może zostać upuszczony na -1 bajt, pozostawiając ciąg niezamknięty, a program wykona to samo, bez błędówJeszcze bardziej zaskakujące jest to, że można tego dokonać w ramach w pełni zdefiniowanych podprogramów.
Powyższy podprogram działa zgodnie z oczekiwaniami i automatycznie formatuje do
źródło
Używaj zmiennych prawdy i falsey w warunkowych
Czasami nazywany niejawną konwersją typu - bezpośrednio przy użyciu typu liczby w
If
,[IF(...)]
lubIIf(...)
oświadczenie, używając truthy i falsey charakter tego numer może absolutnie zaoszczędzić trochę bajtów.W języku VBA dowolna niezerowa zmienna typu liczbowego jest uważana za prawdziwą (a zatem zero
0
jest jedyną wartością falsey), a zatemmoże być skondensowane
i dalej
źródło
Arkusze adresów według nazwy
Zamiast adresowania
WorkSheet
obiektu przez wywołanieMożna użyć
Lub, bardziej korzystnie, można uzyskać bezpośredni dostęp do obiektu i korzystać z niego
źródło
Potęgowanie i
LongLong
si w 64-bitowym VBAOgólna forma potęgowania,
Może być reprezentowany jak w VBA jako
Ale tylko w 32-bitowych instalacjach pakietu Office , w 64 -bitowych instalacjach pakietu Office, najkrótszym sposobem, który można przedstawić bezbłędnie, jest to
Jest tak, ponieważ w 64-bitowych wersjach VBA
^
służy zarówno jako literał potęgowania, jak iLongLong
znak deklaracji typu . Oznacza to, że może pojawić się dość dziwnie wyglądająca, ale poprawna składnia, taka jakktóra przypisuje zmienną
a
do przechowywania maksymalnej wartości aLonglong
źródło
Kompresuj tablice bajtów jako ciąg
W przypadku wyzwań wymagających rozwiązania do przechowywania stałych danych przydatne może być skompresowanie tych danych jako pojedynczego ciągu, a następnie iteracja po nim w celu pobrania danych.
W języku VBA dowolna wartość bajtu może być bezpośrednio przekształcona na znak z
A a
long
lubinteger
wartość można przekonwertować na dwa znaki za pomocąTak więc dla
byte
tablicy algorytm kompresji wyglądałby mniej więcej takZwracając uwagę, że
Select Case
sekcja jest zaimplementowana ze względu na znaki, które nie mogą być przechowywane jako literały w ciągu.Z powstałego ciągu, który będzie wyglądał jak
Dane można następnie wyodrębnić za pomocą funkcji
Asc
iMid
, npźródło
Używaj niewłaściwych stałych
VBA pozwala, w niektórych przypadkach, na stosowanie niepublicznych lub niewłaściwych stałych w wyrażeniach wymagających stałych wartości. Są to często wartości starsze i krótsze niż wartości prawidłowe.
Na przykład poniższe wartości mogą być użyte, gdy
rng.HorizantalAlignment
właściwość jest w posiadaniu wartości.Oznacza to na przykład, że ustawienie komórki tak, aby tekst był wyśrodkowany
może zostać skrócony do
poprzez zastąpienie niewłaściwej stałej wartości
3
prawidłową wartością-4108
. Pamiętaj, że jeślirng.HorizantalAlignment
pobierzesz wartość właściwości, zwróci ona prawidłową wartość. W tym przypadku tak by było-4108
.źródło
W programie Excel utwórz tablice numeryczne, wymuszając zakresy
Gdy stały jednowymiarowy zestaw liczb o mieszanej długości,S. jest potrzebne, bardziej efektywne będzie użycie
[{...}]
notacji do zadeklarowania zakresu, a następnie przymuszenie go do tablicy numerycznej, niż użycieSplit(String)
notacji lub podobnego.Przy użyciu tej metody zmianaΔliczba bajtów= - 5 bajtów będą naliczane za wszystkich S. .
Przykład
Na przykład,
może być zapisane jako
Warto ponadto zauważyć, że chociaż ta metoda nie pozwala na bezpośrednie indeksowanie, umożliwia iterację bezpośrednio w pętli for, tj.
źródło