Ähnlich wie diese , diese und diese Frage ...
Welche allgemeinen Tipps haben Sie zum Golfen VBA
? Ich bin auf der Suche nach Ideen, die sich auf Code-Golf-Probleme im Allgemeinen anwenden lassen, die zumindest etwas spezifischer sind VBA
(z. B. "Kommentare entfernen" ist keine Antwort). Bitte posten Sie einen Tipp pro Antwort.
Während ich mit anderen Sprachen gearbeitet habe, bin ich am stärksten in VBA
und ich sehe nicht viele Golfer VBA
auf dieser Seite.
Antworten:
Nutzen Sie die
ByRef
Standardeinstellung, wenn Sie Subs anrufenEs ist manchmal möglich, einen
Sub
Anruf anstelle vonFunction
zu verwenden, um ein paar zusätzliche Zeichen zu speichern ...Dies ( 87 Zeichen)
kann überarbeitet werden auf ( 73 Zeichen):
Beachten Sie, dass dies NICHT für immer wiederholt wird, obwohl der
b
Wert anscheinend nie neu zugewiesen wird.Das oben Genannte verwendet keinen
Function
Aufruf, sondern nutzt stattdessen dieByRef
("Nach Referenz") - Funktionalität desSub
Aufrufs. Dies bedeutet, dass das übergebene Argument dieselbe Variable wie in der aufrufenden Funktion ist (im Gegensatz zu derByVal
Übergabe "Nach Wert", bei der es sich um eine Kopie handelt). Alle Änderungen an der übergebenen Variablen werden zurück in die aufrufende Funktion übersetzt.Standardmäßig nimmt vba alle Argumente als an
ByRef
, sodass keine Zeichen für die Definition erforderlich sind.Das obige Beispiel wird möglicherweise nicht perfekt für Sie übersetzt, abhängig vom Rückgabewert Ihrer Funktion. (dh es wird ein anderer Datentyp als der übergebene zurückgegeben), dies ermöglicht jedoch auch die Möglichkeit, einen Rückgabewert abzurufen, während die ursprüngliche Variable weiterhin geändert wird.
Beispielsweise:
quelle
Schreiben Sie den VBA-Code und führen Sie ihn im Direktfenster aus
Das Direktfenster wertet alle gültigen ausführbaren VBA-Anweisungen aus. Geben Sie einfach eine Anweisung in das Direktfenster ein, wie Sie es im Code-Editor tun würden. Es führt schnell VBA-Code aus und kann viele zusätzliche Zeichen speichern, weil:
Hier ist das Beispiel für VBA-Code im Direktfenster, um den Beitrag von PPCG mit dem Tag code-golf zu beantworten : Der Buchstabe A ohne A
von Joffan beantwortet .
Kreditbilder: Excel Campus
quelle
a="value":?a
setzt zuerst den Wert vona
und druckt ihn dann aus.Bedingte Prüfungen vor dem Schleifen
Einige bedingte Prüfungen sind in Verbindung mit Schleifen überflüssig. Beispielsweise wird eine
For
Schleife nicht verarbeitet, wenn die Startbedingung außerhalb des Bereichs der laufenden Bedingung liegt.Mit anderen Worten, dies ( 49 Zeichen):
Kann in diese umgewandelt werden ( 24 Zeichen):
quelle
Variable Aussage
In den meisten Fällen können Sie in VBA viele Ihrer Variablen
Option Explicit
überspringenDim
.Dabei ( 96 Zeichen):
Wird dies ( 46 Zeichen):
Wenn Sie bestimmte Objekte (z. B. Arrays) verwenden müssen, müssen Sie
Dim
diese Variable möglicherweise weiterhin verwenden .quelle
Evaluate()
Und[]
Wie bereits erwähnt, können hartcodierte Reichweitenanrufe mithilfe der
[A1]
Notation in eckigen Klammern reduziert werden . Es hat jedoch viel mehr Verwendungen als nur das.Gemäß der MSDN-Dokumentation verwendet die
Application.Evaluate()
Methode ein einzelnes Argument, dasName
durch die Namenskonvention von Microsoft Excel definiert ist.NB
[string]
ist eine Abkürzung fürEvaluate("string")
(beachten Sie die""
Sprachmarkierungen für den Datentyp der Zeichenfolge), obwohl am Ende einige wichtige Unterschiede behandelt werden.Was bedeutet das alles in Bezug auf die Nutzung?
Stellt im Wesentlichen
[some cell formula here]
eine Zelle in einem Excel-Arbeitsblatt dar, und Sie können so ziemlich alles hineinstecken und alles herausholen, was Sie mit einer normalen Zelle könntenWas geht in
Zusammenfassend mit Beispielen
[B7]
gibt einen Verweis auf diese Zelle zurück?[B7].Address
zurückgegeben"B$7$"
[A1:B5]
gibt eine Bereichsreferenz aufA1:B5
(Range) zurück[A1:B5 A3:D7]
gibt einen Bereichsverweis aufA3:B5
(Intersect) zurück[A1:B5,C1:D5]
gibt einen Bereichsverweis aufA1:D5
(technischA1:B5,C1:D5
) (Union) zurück[myRange]
Bezugnahme auf A1: G5[Table1]
(möglicherweise weniger nützlich für Codegolf)Evaluate()
oder gehen[]
[SUM(1,A1:B5,myRange)]
Gibt eine arithmetische Summe von Werten in den Bereichen zurück. myRange bezieht sich hier auf einen Arbeitsmappennamen und nicht auf eine VBA-Variable[IF(A1=1,"true","false")]
(1 Byte kürzer als VBA-ÄquivalentIif([A1]=1,"true","false")
)[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
- Verbindet alle Zeichenfolgen im Bereich, deren Länge größer als 2 ist, mit einem Leerzeichen!
Operator können Sie auf eine Zelle oder auf einen Namen verweisen, der in einer anderen Arbeitsmappe definiert ist[[BOOK1]Sheet1!A1]
Gibt einen Bereichsverweis auf A1 in BOOK1 oder['[MY WORKBOOK.XLSM]Sheet1!'A1]
für denselben in zurückMY WORKBOOK
'
für Arbeitsmappen mit Leerzeichen im Namen und das Fehlen der Erweiterung für standardmäßig benannte Arbeitsmappen (BOOK+n
)NB Ich habe eine Frage zu SO für diese Info gestellt, also schau dort nach einer besseren Erklärung
Was kommt raus?
Ähnlich dem, was hereinkommt, enthält das, was herauskommt, alles, was eine Arbeitsblattzelle zurückgeben kann. Dies sind die Standard-Excel-Datentypen (und ihre VBA-Entsprechungen):
Boolean
)String
)Double
)Variant/Error
) (Dies sind nicht unterbrechende Fehler, dh sie stoppen die Codeausführung nicht, werden?[1/0]
einwandfrei ausgeführt.)Es können jedoch einige Dinge zurückgegeben werden, die Zellen nicht zurückgeben können:
Range
) (siehe oben)Variant()
)Arrays
Wie gezeigt wurde,
[]
können damit Matrixformeln ausgewertet werden, die einen der Standard-Excel-Datentypen zurückgeben. zB[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
was zurückkommtText
. JedochEvaluate
können auch Anordnungen vonVariant
Rücktyp. Das kann seinHardcoded:
[{1,2;3,4}]
- gibt ein 2D-Array aus:,
Ist das Spaltentrennzeichen,;
trennt Zeilen. Kann ein 1D-Array ausgebenMatrixformeln:
[ROW(A1:A5)]
- gibt ein 2D- Array aus{1,2,3,4,5}
, dh (2,1) ist das zweite Element (dennoch geben einige Funktionen 1D-Arrays aus)[LEN(A1:A5)]
Gibt nur die Länge des Texts in der 1. Zelle eines Bereichs ausSplit([CONCAT(" "&LEN(A1:A5))])
gibt ein 1D-Array von 0 bis 5 an, wobei das erste Element leer ist[INDEX(LEN(A1:A5),)]
Dies ist eine weitere Problemumgehung. Im Wesentlichen müssen Sie eine Arrayhandhabungsfunktion verwenden, um das gewünschte Arrayrückgabeverhalten zu erhalten, ähnlich dem Hinzufügen einer sinnlosen FunktionRAND()
, um Ihre Arbeitsblattformeln flüchtig zu machen.Evaluate()
vs[]
Es gibt ein paar Unterschiede zwischen
Evaluate()
und[]
zu beachtenEvaluate("SUM(B1,1,"&v &",2)")
würde summieren[B1]
,1
,2
und variablev
Arrays
Bei der Rückgabe eines Arrays kann nur Evaluate mit einem Array-Index verwendet werden
ist äquivalent zu
quelle
i=[ROW(A1:A5)]:v=i(2,1):?v
kombinieren Sie
Next
StatementsDarf bis auf kondensiert werden
wo die Iteratoren für die
For
Schleifen sindi
,j
undk
- in dieser Reihenfolge.Zum Beispiel die unten (69 Bytes)
Kann auf 65 Bytes reduziert werden
Und was die Auswirkungen auf Formatierung und Einrückung angeht, ist es meiner Meinung nach am besten, die nächste Anweisung an der äußersten for-Anweisung auszurichten. Z.B.
quelle
If
Anweisungen reduzierenWenn Sie eine Variable mit einem bedingten
If ... Then ... Else
Häkchen zuweisen , können Sie den Code reduzieren, indem Sie dasEnd If
entfernen, indem Sie das gesamte Häkchen in eine Zeile setzen.Zum Beispiel ist dies ( 37 Zeichen):
Kann darauf reduziert werden ( 30 Zeichen)
Wenn Sie mehr als eine verschachtelte Bedingung haben, können Sie diese auch auf diese Weise minimieren:
Beachten
:
Sie, dass Sie innerhalb einesIf
Blocks mehr als eine Zeile / einen Befehl hinzufügen können .In einfachen Fällen wie diesem können Sie das normalerweise auch entfernen,
Else
indem Sie die Variable vor demIf
Check setzen ( 25 Zeichen):Noch besser ist, dass das oben Genannte mit der
IIf()
Funktion ( 20 Zeichen) weiter darauf reduziert werden kann :quelle
Range("A1")
Anrufe reduzieren und likenRange("A1").Value
(17 Bytes) und die einfacherenRange("A1")
(11 Bytes) können auf[A1]
(4 Bytes) reduziert werdenquelle
[]
zum ErsetzenEvaluate()
in VBA viel vielseitiger als nur Bereichsaufrufe. ZB können Sie esWorksheetFunction.FuncName(args)
mit nur ersetzen[FuncName(args)]
, wie?[SUMPRODUCT({1,3,5},{2,7,-1})]
oder die sehr nützliche[MIN(1,2,3)]
/[MAX(1,2,3)]
Evaluate("str")
oder Kurzschrift[str]
ist in VBA sehr mächtig, das habe ich erst kürzlich herausgefunden, und ich vermute, es wird auch zum Golfen nützlich sein!Leerzeichen entfernen
VBA wird automatisch formatiert, um viel Abstand hinzuzufügen, den es eigentlich nicht benötigt. Es gibt eine Antwort auf Meta , die für mich sehr sinnvoll ist, warum wir durch automatische Formatierung hinzugefügte Bytes rabattieren können. Es ist jedoch wichtig, immer zu überprüfen, ob Sie nicht zu viel entfernt haben. Als Beispiel hier eine Antwort von mir , die durch das Entfernen von Leerzeichen um fast 22% reduziert wurde:
Originalversion: (188 Byte)
Reduzierte Version: (146 Bytes)
Wenn Sie die reduzierte Version in VBA kopieren / einfügen, wird sie automatisch im Original erweitert. Sie können damit herumspielen, wo es gültig ist, Leerzeichen zu entfernen. Diejenigen, die ich bisher gefunden habe, scheinen alle dem Muster zu folgen, bei dem von VBA erwartet wird, dass ein bestimmter Befehl angezeigt wird, da es ohne ihn keinen gültigen Code gibt. Hier sind einige, die ich bisher gefunden habe:
+-=/*^
usw.To
undStep
in einerFor
Aussage:For x=-3To 3Step 0.05
To
,&
,Then
, etc.) , wenn es von einer wörtlichen wie beispielsweise eine Zahl vorangestellt ist,)
,?
,%
usw.&
beim Kombinieren von Strings:Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
If s=StrReverse(s)Then
Replace(Space(28)," ",0)
quelle
?
vsPrint
sehe ich akzeptabel, aber setzen bei Typdeklaration wie&
unmittelbar nach einer Variablen zBDebug.?a&"z"
gibtDebug.Print a&; "z"
. Das;
hinzugefügte Zeichen ist für die Ausführung des Codes unerlässlich. Ist dies noch zulässig?If i=1 Then
werden kann ,If i=1Then
weil in der Regel ein reserviertes Wort , das wörtlich folgt, sein , dass eine Reihe,)
,?
,%
, .. etc, muss nicht durch eine getrennt werden Weltraum)
(oder einem anderen Nicht-Zahlen-Literal) und&
Vorbereitung für Pixel Art
Pixelkunst ist bei weitem einer der stärksten Bereiche von Excel, da keine Leinwand erstellt werden muss, da sie bereits für Sie vorhanden ist. Sie müssen lediglich einige kleine Anpassungen vornehmen
1) Stellen Sie die Zellen quadratisch
oder alternativ für 1 Byte mehr, aber weitaus einfacher zu bearbeiten
2) Färben Sie den gewünschten Bereich ein
Jedes
Range
Objekt kann durch Aufrufen eingefärbt werdenHinweis: Dies kann und sollte mit anderen Tricks kombiniert werden, die in diesem Wiki aufgeführt sind, z. B. das Referenzieren von Bereichen mithilfe der
[]
Notation (z. B.[A1:R5,D6]
) über die Verwendung einesCells(r,c)
oder einesRange(cellAddress)
Anrufs. Wie in diesem Wiki erwähnt, kann dies mit einem negativen Farbwert kombiniert werden, um die Größe der Farbreferenzen zu verringernSchnellreferenzen
Bereichsreferenz
Auf die Zelle
A1
kann auf eine der folgenden Arten verwiesen werdenund der Bereich
A1:D4
kann auf eine der folgenden Arten referenziert werdenFarbreferenz
quelle
Integrierte Funktionen vereinfachen
Wenn Sie bestimmte Funktionen häufig verwenden, weisen Sie sie einer benutzerdefinierten Funktion zu.
Der folgende Code ( 127 Zeichen) kann reduziert werden von:
bis ( 124 Zeichen):
In Kombination mit dem ByRef-Trick können Sie noch mehr Zeichen speichern (bis zu 114 ):
Gehen Sie dabei mit Bedacht vor, da VBA zum Definieren von a viele Zeichen benötigt
Function
. Der zweite Codeblock wäre tatsächlich größer als der erste mit einer beliebigen Anzahl von wenigerFormat()
Aufrufen.quelle
a = f(w)
Fall benötigen Sie keinen Zuweisungsaufruf, was bedeutet, dass er auff w
STDIN und STDOUT
Eingabe in
Sub
Routinen undFunction
s über EingabevariablenDarf reduziert werden auf
Die Aufrufe
Public
undByRef
sind die Standardeinstellung für VBA und daher implizit und können (fast) immer verworfen werden.Das Typliteral
$
erzwingtb
den TypString
.Andere Typliterale
!
Single@
Währung#
Doppelt%
Ganze Zahl$
String&
Lange^
LongLong (nur 64 Bit)Darüber hinaus wird allgemein akzeptiert, dass Sie die Eingabevariable als Standardtyp
Variant
belassen und typbasierte Fehler unbehandelt lassen können. Z.B.Sub E(F)
in demF
erwartet wird, dass er vom Typ istBoolean[]
(der wie folgt an die Routine übergeben wirdE Array(True, False, False)
)Eingabe in
Sub
Routinen und Direktfensterfunktionen überCells
VBA hat keine voll funktionsfähige Konsole und daher keine offizielle STDIN und ermöglicht daher ein gewisses Spiel mit der Weitergabe von Eingaben.
In Excel ist es allgemein akzeptiert, Eingaben von einer Zelle oder einem Zellbereich zu übernehmen, wie dies auch geschehen kann
die implizit die
.value
aus der Zelle[A1]
(die auch alscells(1,1)
oder verwiesen werden kannrange("A1")
Beispiel Problem: Zeigen Sie die Eingabe in einer Messagebox an
Über Unterprogramm
Sub A:msgbox[A1]:End Sub
Über die Sofortfensterfunktion
msgbox[A1]
Eingabe über bedingte Kompilierungsargumente
VBA-Projekte unterstützen die Übernahme von Argumenten über die Befehlszeile oder über die VBAProject-Eigenschaften (Ansicht über den Projektexplorer -> [Ihr VBA-Projekt] - (Rechtsklick) -> VBAProject-Eigenschaften -> Bedingte Kompilierungsargumente).
Dies ist vor allem bei Fehlercode-Herausforderungen hilfreich
Mit dem Argument
n=
für bedingte Kompilierung [some_value] kann Code ausgeführt werden, der einen Fehlercode erzeugt, der auf dem Wert von basiertn
. Beachten Sie, dass dies ein Hinzufügen von 2 Byte zu Ihrem Code für denn=
Abschnitt mit den bedingten Kompilierungsargumenten des VBAProject-Eigenschaftsfensters erfordert.Beispielcode
Ausgabe über Funktionswert
Es ist hier nicht viel zu sagen, dass die im Folgenden zitierte allgemeine Form so kompakt ist, wie sie hergestellt werden kann.
HINWEIS: In den allermeisten Fällen ist es mehr Byte, die Methode in eine Unterroutine umzuwandeln und an das VBE-Direktfenster auszugeben (siehe unten).
Ausgabe von
Sub
Routinen undFunction
s über das VBE- DirektfensterDie Ausgabe in das VBE-Direktfenster (AKA, das VBE-Debug-Fenster) ist eine übliche Ausgabemethode für VBA für textbasierte Herausforderungen. Es ist jedoch wichtig zu bedenken, dass der
Debug.Print "Text"
Anruf möglicherweise im Wesentlichen ausgenutzt wird.ist funktional identisch mit
als
?
autoformate zuPrint
.Ausgabe von
Sub
Routinen und VBE- Direktfensterfunktionen über andere MethodenIn seltenen Fällen, in denen die Situation genau richtig ist, können Sie Eingaben von einigen der trivialeren Eingaben für VBA abrufen, z. B. von der Einstellung der Schriftgröße, der Schriftauswahl und dem Zoom. ( Z. B. Emulieren der Wort-Schriftgrößenauswahl )
quelle
Kurzer Hinweis zur Formatierung
Da StackExchange Markdown und Prettify.js verwendet, können Sie Ihren Codierungsantworten ein Sprachkennzeichen hinzufügen, wodurch sie im Allgemeinen professioneller aussehen. Ich kann zwar nicht garantieren, dass Sie dadurch beim Golfen in VBA besser werden, aber ich kann garantieren, dass Sie so aussehen, wie Sie sind.
Wenn Sie eines der folgenden Flags hinzufügen, wird es umgewandelt
zu
VBA-Sprach-Tags
<!-- language: lang-vb -->
<!-- language-all: lang-vb -->
Hinweis: Letzteres transformiert alle Codesegmente in Ihrer Antwort, während das Vorherige nur die unmittelbar folgenden Codesegmente transformiert
quelle
lang-vb
wie? - Seltsamerweise formatiert sich das besser alslang-vba
bei vba-antworten.lang-vba
Hervorhebungen bereitgestellt werden, ist dies eigentlich nur die Standardhervorhebung. Anscheinend wurde VBA nicht in Prettify.js implementiert, daher müssen wir uns an die VB-Hervorhebung haltenmehrere
If .. Then
KontrollenWie in anderen Sprachen können Mehrfachprüfungen
If
normalerweise in einer einzigen Zeile kombiniert werden, wodurch die Verwendung vonAnd
/Or
(dh&&
/||
in C und anderen) ermöglicht wird, das in VBA sowohl aThen
als auch an ersetztEnd If
.Zum Beispiel mit einer verschachtelten Bedingung ( 93 Zeichen):
kann werden ( 69 Zeichen):
Dies funktioniert auch mit nicht verschachtelten Bedingungen.
Betrachten Sie ( 84 Zeichen):
Dies kann ( 51 Zeichen) werden:
quelle
d=iif(a=b or c=b,0,d)
Ending
For
LoopsBei der Verwendung von
For
Schleifen benötigt eineNext
Zeile keinen Variablennamen (obwohl es wahrscheinlich besser ist, sie in der normalen Codierung zu verwenden).Deshalb,
kann gekürzt werden auf:
(Die Einsparungen hängen von Ihrem Variablennamen ab. Wenn Sie jedoch Golf spielen, ist dies wahrscheinlich nur 1 Zeichen + 1 Leerzeichen.)
quelle
Teilen Sie eine Zeichenfolge in ein Zeichenfeld auf
Manchmal kann es nützlich sein, eine Zeichenfolge in einzelne Zeichen aufzuteilen. In VBA kann dies jedoch etwas Code erfordern.
Stattdessen können Sie eine einzeilige, relativ minimale Funktionskette verwenden, um die Aufgabe zu erledigen:
Dadurch wird die Zeichenfolge
s
demVariant
Array zugewiesena
. Seien Sie jedoch vorsichtig, da das letzte Element im Array eine leere Zeichenfolge (""
) ist, die entsprechend behandelt werden muss.So funktioniert es: Die
StrConv
Funktion konvertiert aString
in ein anderes von Ihnen angegebenes Format. In diesem Fall 64 =vbUnicode
, wird also in ein Unicode-Format konvertiert. Bei einfachen ASCII-Zeichenfolgen ist das Ergebnis ein Nullzeichen (keine leere Zeichenfolge""
), das nach jedem Zeichen eingefügt wird.Im Folgenden
Split
wird das ErgebnisString
in ein Array konvertiert , wobei das NullzeichenChr(0)
als Begrenzer verwendet wird.Es ist wichtig zu beachten , dass
Chr(0)
nicht das gleiche wie die leere Zeichenkette ist""
, und die VerwendungSplit
auf""
nicht das Array zurückgeben Sie vielleicht erwarten. Gleiches gilt auch fürvbNullString
(aber wenn Sie Golf spielen, warum sollten Sie dann überhaupt eine solche wortreiche Konstante verwenden?).quelle
Verwenden
With
(Manchmal! Siehe Fußnote)Die Verwendung der
With
Anweisung kann Ihre Codegröße erheblich reduzieren, wenn Sie einige Objekte wiederholt verwenden.dh dies ( 80 Zeichen):
kann codiert werden als ( folgt 79 Zeichen):
Das oben Genannte ist nicht einmal das beste Szenario. Wenn Sie etwas mit verwenden
Application
, z. B.Excel.Application
aus Access heraus, ist die Verbesserung viel bedeutender.* Je nach Situation
With
kann oder kann nicht effizienter sein als dies ( 64 Zeichen):quelle
Endlosschleifen
Sollten Sie sie ersetzen
oder
mit der veralteten aber niedrigeren Byteanzahl
Wenn Sie a
Sub
oderFunction
vorzeitig beenden müssen, verwenden Sie stattExit ...
Erwägen
End
Beachten Sie, dass die
End
gesamte Codeausführung angehalten und alle globalen Variablen gelöscht werden. Gehen Sie also mit Bedacht vorquelle
For
undEnd
) neu zu schreiben, um zu berücksichtigen, dass der Fall100
niemals erfüllt wird, und ein unnötiges Byte hinzuzufügenVerwenden Sie
Spc(n)
überSpace(n)
,[Rept(" ",n)]
oderString(n," ")
Wenn Sie versuchen, mehrere Leerzeichen einzufügen
n
, verwenden SieÜber
Hinweis: Ich bin mir nicht sicher, warum, aber es scheint, dass Sie die Ausgabe
Spc(n)
einer Variablen nicht zuweisen können und dass sie lieber direkt gedruckt werden muss - in bestimmten FällenSpace(n)
ist dies immer noch der beste Weg.quelle
Reduzieren
Debug.Print
undPrint
telefonieren(12 Bytes; beachten Sie das nachfolgende Leerzeichen) kann auf reduziert werden
(7 Bytes; beachte den fehlenden Trailing Space).
Ähnlich,
(6 Bytes) dürfen auf reduziert werden
(1 Byte).
Wenn Sie im Kontext einer anonymen VBE-Direktfensterfunktion arbeiten, wird die
Debug
Anweisung möglicherweise vollständig gelöscht und stattdessen über in das VBE-Direktfenster gedruckt?
Direktfensterfunktion gearbeitet wird, verworfen werden kann angenommen werden, dass das Direktfenster über STDIN / STDOUT erfolgtSpezielle Charaktere
Beim Drucken von Zeichenfolgen können Sie anstelle von auch Sonderzeichen verwenden
&
. Diese ermöglichen alternative Formate beim Drucken oder beim Entfernen von LeerzeichenZum Verbinden von variablen Zeichenfolgen anstelle von
Sie können ein Semikolon verwenden
;
Dieses Semikolon ist das Standardverhalten für aufeinanderfolgende Zeichenfolgen, sofern keine Mehrdeutigkeit vorliegt. Diese sind also gültig:
Aber nicht
Beachten Sie, dass ein; am Ende einer Zeile unterdrückt eine neue Zeile, da diese standardmäßig nach jedem Druck hinzugefügt wird. Das Zählen der vom VBA-Code zurückgegebenen Bytes ist umstritten
Um mit einem Tabulator zu verbinden, verwenden Sie ein Komma
,
(tatsächlich 14 Leerzeichen, aber entsprechend)Schließlich können Sie auch Typdeklarationen verwenden, um Zeichenfolgen anstelle von; zu verbinden. Jede dieser Deklarationen wirkt sich geringfügig auf die Formatierung aus. Für alle unten
a = 3.14159
steht die erste Zeilequelle
Verwenden Sie einen Helfer
Sub
zuPrint
Wenn der Code die Verwendung von mehr als sechs
Debug.?
Anweisungen erfordert, können Sie Bytes reduzieren, indem Sie alle Debug-Anweisungen ersetzen. Leitungen mit einem Anruf zu einem Sub wie der folgenden. Um eine leere Zeile zu drucken, müssen Sie aufrufen,p ""
da ein Parameter erforderlich ist.quelle
p""
oder wenn es nicht abgeschlossen sein kann,p"
. In den allermeisten Fällen ist es jedoch sinnvoller, eine Zeichenfolgenvariable zu verwenden und die Zeichenfolgenvariable nur am Ende zu drucken.Verwenden Sie
Array()
anstelle vonChoose()
Select
oderIf...Then
Wenn Sie eine Variable basierend auf dem Wert einer anderen Variablen zuweisen, ist es sinnvoll, die Schritte
If...Then
wie folgt mit einem Häkchen zu versehen:Dies kann jedoch viel Codeplatz in Anspruch nehmen, wenn mehr als eine oder zwei Variablen zu überprüfen sind (es gibt im Allgemeinen immer noch bessere Möglichkeiten, dies zu tun).
Stattdessen
Select Case
hilft die Anweisung, die Größe der Überprüfungen zu verringern, indem alles in einem Block eingeschlossen wird, wie folgt:Dies kann zu viel kleinerem Code führen, aber für sehr einfache Fälle wie diesen gibt es eine noch effizientere Methode:
Choose()
Diese Funktion wählt einen Wert aus einer Liste basierend auf dem an sie übergebenen Wert aus.Die Auswahlmöglichkeit (
a
in diesem Fall) ist ein ganzzahliger Wert, der als erstes Argument übergeben wird. Bei allen nachfolgenden Argumenten handelt es sich um die Werte, aus denen Sie auswählen können (1-indiziert, wie bei den meisten VBA). Die Werte können beliebige Datentypen sein, solange sie mit der gesetzten Variablen übereinstimmen (dh Objekte funktionieren ohne dasSet
Schlüsselwort nicht) und können sogar Ausdrücke oder Funktionen sein.Eine zusätzliche Option ist die Verwendung der
Array
Funktion, um den gleichen Effekt beim Speichern eines anderen Zeichens zu erzielen:quelle
IIf()
oder anderenChoose()
: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))
Bitverschobene RGB-Werte
Aufgrund der Art und Weise, wie Excel mit Farben umgeht (vorzeichenlose 6-stellige hexadezimale Ganzzahl), können Sie negativ vorzeichenbehaftete Ganzzahlen verwenden, von denen Excel nur die richtigen 6 Bytes verwendet, um einen Farbwert zuzuweisen
Dies ist etwas verwirrend, so dass nachfolgend einige Beispiele aufgeführt sind
Nehmen wir an, Sie möchten die Farbe Weiß verwenden, die als gespeichert ist
und ist äquivalent zu
Um dies abzuspielen, müssen wir nur einen negativen Hexadezimalwert finden, der auf endet,
FFFFFF
und da negative Hexadezimalwerte in dem FormatFFFFXXXXXX
(alsoX
einem gültigen Hexadezimalwert) vorliegen müssen, das vonFFFFFFFFFF
(-1
) bisFFFF000001
(-16777215
) herunterzählt.Wenn wir das wissen, können wir die Formel verallgemeinern
Hiermit sind einige nützliche Konvertierungen verbunden
quelle
rgbWhite
=2^24-1
obwohl möglicherweise weiter reduziert werden könnte, wenn Sie das -1 verpassen, um ungefähr dorthin zu gelangen&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 nicht unbedingt vollständig, aber ich denke, ich habe ziemlich gründliche Arbeit geleistetTerminal auslassen,
"
wenn in Sofortfenster gedruckt wirdDazu die unten stehende Funktion, die im Debug-Fenster verwendet werden soll
Das Terminal
"
kann für -1 Byte gelöscht werden, wobei der String nicht geschlossen bleibt und das Programm das gleiche ohne Fehler ausführen sollNoch überraschender ist, dass dies innerhalb vollständig definierter Subroutinen erfolgen kann.
Die obige Unterroutine wird wie erwartet ausgeführt und formatiert sich automatisch nach
quelle
Verwenden Sie in Bedingungen die Variablen Truthy und Falsey
Manchmal implizite Typumwandlung genannt - direkt einen Nummerntyp in einer Verwendung
If
,[IF(...)]
oderIIf(...)
Anweisung, durch die truthy und Falsey Natur dieser Zahl mit absolut sparen Sie einige Bytes.In VBA wird jede Variable vom Typ Zahl, die nicht Null ist, als wahr angesehen (und daher ist Null
0
der einzige falsche Wert)kann zu kondensiert sein
und weiter zu
quelle
Adressblätter nach Namen
Anstatt ein
WorkSheet
Objekt durch Aufrufen zu adressierenMan darf verwenden
Oder bevorzugter kann man direkt auf das Objekt zugreifen und es verwenden
quelle
Exponentiation und
LongLong
s in 64-Bit-VBADie allgemeine Form der Potenzierung,
Kann wie in VBA als dargestellt werden
Aber nur bei 32-Bit-Installationen von Office , bei 64 -Bit-Installationen von Office , ist dies der kürzeste Weg, den Sie möglicherweise fehlerfrei darstellen
Dies liegt daran, dass in 64-Bit-Versionen von VBA
^
sowohl das Exponentiationsliteral als auch dasLongLong
Typdeklarationszeichen verwendet werden . Dies bedeutet, dass einige seltsam aussehende, aber gültige Syntax auftreten können, wie zdie Variable zuweist
a
, um den Maximalwert von a zu haltenLonglong
quelle
Byte-Arrays als String komprimieren
Für Herausforderungen, bei denen die Lösung konstante Daten speichern muss, kann es nützlich sein, diese Daten als einzelne Zeichenfolge zu komprimieren und anschließend die Zeichenfolge zu durchlaufen, um die Daten abzurufen.
In VBA kann jeder Bytewert mit direkt in ein Zeichen konvertiert werden
Und ein
long
oderinteger
Wert kann mit in zwei Zeichen umgewandelt werdenFür ein
byte
Array würde ein Komprimierungsalgorithmus ungefähr so aussehenBeachten Sie, dass der
Select Case
Abschnitt aufgrund der Zeichen implementiert wird, die möglicherweise nicht als Literale in der Zeichenfolge gespeichert sind.Aus der resultierenden Zeichenfolge, die ungefähr so aussieht
Die Daten können dann unter Verwendung der Funktionen
Asc
und extrahiert werdenMid
, zquelle
Verwenden Sie falsche Konstanten
VBA ermöglicht in einigen Fällen die Verwendung von nicht aufgelisteten oder falschen Konstanten in Ausdrücken, die konstante Werte erfordern. Hierbei handelt es sich häufig um Legacy-Werte, die kürzer sind als die richtigen Werte.
Zum Beispiel können die folgenden Werte verwendet werden, wenn ein Wert von der
rng.HorizantalAlignment
Eigenschaft gehalten werden soll.Dies bedeutet zum Beispiel, dass eine Zelle so eingestellt wird, dass der Text zentriert ist
kann gekürzt werden auf
durch Ersetzen des falschen konstanten Werts
3
durch den richtigen Wert-4108
. Beachten Sie, dass beim Abrufen desrng.HorizantalAlignment
Eigenschaftswerts der richtige Wert zurückgegeben wird. In diesem Fall wäre das-4108
.quelle
Erstellen Sie in Excel numerische Arrays, indem Sie Bereiche zusammenfassen
[{...}]
Split(String)
Beispiel
Zum Beispiel,
kann geschrieben werden als
Es ist ferner anzumerken, dass diese Methode zwar keine direkte Indizierung ermöglicht, jedoch eine direkte Iteration über die for-Schleife, d. H
quelle