Подобно этому , этому и этому вопросу ...
Какие общие советы у вас есть для игры в гольф VBA
? Я ищу идеи, которые могут быть применены к кодовым проблемам гольфа в целом, по крайней мере, несколько специфичны для них VBA
(например, «удалить комментарии» - это не ответ). Пожалуйста, оставьте один совет за ответ.
Хотя я работал с другими языками, я сильнейший VBA
, и я не вижу много игроков в гольф, использующих VBA
на этом сайте.
Ответы:
Использование по
ByRef
умолчанию при вызове подпрограммИногда можно использовать
Sub
вызов вместо a,Function
чтобы сохранить несколько дополнительных символов ...Это ( 87 символов)
может быть переработано до ( 73 символа):
Обратите внимание, что это НЕ будет зацикливаться вечно, хотя кажется, что вы никогда не переназначаете
b
значение.Вышеупомянутое не использует
Function
вызов, но вместо этого использует функциональностьByRef
(«По ссылке»)Sub
вызова. Это означает, что переданный аргумент - это та же переменная, что и в вызывающей функции (в отличие отByVal
передачи «По значению», которая является копией). Любые изменения переданной переменной будут преобразованы обратно в вызывающую функцию.По умолчанию vba принимает все аргументы как
ByRef
, поэтому нет необходимости использовать символы для определения этого.Приведенный выше пример может не совсем идеально подходить для вас, в зависимости от возвращаемого значения вашей функции. (т.е. возвращает тип данных, отличный от передаваемого), но это также позволяет получить возвращаемое значение, в то же время изменяя исходную переменную.
Например:
источник
Напишите и запустите код VBA в Немедленном окне
Непосредственное окно оценивает любой допустимый исполняемый оператор VBA. Просто введите оператор в Immediate Window, как в редакторе кода. Он быстро выполняет код VBA и может сохранить много дополнительных символов, потому что:
Вот пример кода VBA в Immediate Window, чтобы ответить на сообщение PPCG с тегом code-golf : Буква A без A
ответил Джоффан .
Кредитные изображения: Excel Campus
источник
a="value":?a
сначала устанавливает значениеa
, а затем печатает его.Условные проверки перед циклом
Некоторые условные проверки являются избыточными при использовании в сочетании с циклами. Например,
For
цикл не будет обрабатываться, если начальное условие находится за пределами рабочего состояния.Другими словами, это ( 49 символов):
Можно превратить в это ( 24 символа):
источник
Объявление переменной
В большинстве случаев в VBA вы можете пропустить
Option Explicit
(по крайней мере, часто по умолчанию опущены) и пропуститьDim
многие из ваших переменных.При этом, это ( 96 символов):
Становится так ( 46 символов):
Если вам нужно использовать определенные объекты (например, массивы), вам все равно может понадобиться
Dim
эта переменная.источник
Evaluate()
И[]
Как указывалось ранее, жестко закодированные диапазоны вызовов могут быть сокращены с помощью записи в квадратных скобках
[A1]
. Однако он имеет гораздо больше применений, чем просто это.Согласно документации MSDN ,
Application.Evaluate()
метод принимает один аргумент, который являетсяName
определенным соглашением об именах Microsoft Excel.NB
[string]
- сокращениеEvaluate("string")
(обратите внимание на""
речевые метки, обозначающие тип данных строки), хотя есть несколько важных различий, которые рассматриваются в конце.Так что же все это означает с точки зрения использования?
По сути,
[some cell formula here]
представляет собой ячейку на листе Excel, и вы можете поместить в нее практически все, что угодно, и извлечь из нее все, что могли бы с обычной ячейкой.Что входит в
В итоге, с примерами
[B7]
возвращает ссылку на эту ячейку?[B7].Address
возвращается"B$7$"
[A1:B5]
возвращает ссылку наA1:B5
диапазон (Range)[A1:B5 A3:D7]
возвращает ссылку на диапазонA3:B5
(Пересечь)[A1:B5,C1:D5]
возвращает ссылку на диапазонA1:D5
(техническиA1:B5,C1:D5
) (объединение)[myRange]
ссылаясь на A1: G5[Table1]
(возможно, менее полезен для codegolf)Evaluate()
или[]
[SUM(1,A1:B5,myRange)]
возвращает арифметическую сумму значений в диапазонах myRange здесь относится к имени книги, а не к переменной VBA[IF(A1=1,"true","false")]
(1 байт короче, чем эквивалент VBAIif([A1]=1,"true","false")
)[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
- объединяет все строки в диапазоне, длина которого больше 2 с пробелом!
оператор для ссылки на ячейку или на имя, определенное в другой книге.[[BOOK1]Sheet1!A1]
возвращает ссылку на диапазон A1 в BOOK1 или['[MY WORKBOOK.XLSM]Sheet1!'A1]
для того же самого вMY WORKBOOK
'
на книги с пробелами в их именах и отсутствие расширения для именованных книг по умолчанию (BOOK+n
)NB Я задал вопрос о SO для этой информации, так что посмотрите там для лучшего объяснения
Что выходит
Подобно тому, что входит, то, что выходит, включает в себя все, что может вернуть ячейка рабочего листа. Это стандартные типы данных Excel (и их эквиваленты VBA):
Boolean
)String
)Double
)Variant/Error
) (это неустранимые ошибки, т. Е. Они не останавливают выполнение кода,?[1/0]
выполняется нормально)Но есть несколько вещей, которые могут быть возвращены, которые ячейки не могут:
Range
) (см. Выше разделы)Variant()
)Массивы
Как было показано,
[]
может использоваться для оценки формул массива, которые возвращают один из стандартных типов данных Excel; например,[CONCAT(IF(LEN(A1:B7)>2,A1:B7&" ",""))]
который возвращаетсяText
. ОднакоEvaluate
может также возвращать массивыVariant
типа. Это может бытьHARDCODED:
[{1,2;3,4}]
- выводит двумерный массив:,
является разделителем столбцов,;
разделяет строки. Может вывести 1D массивФормулы массивов:
[ROW(A1:A5)]
- выводит двумерный массив{1,2,3,4,5}
, т.е. (2,1) является вторым элементом (но некоторые функции выводят одномерные массивы)[LEN(A1:A5)]
выводит только длину текста в 1-й ячейке диапазонаSplit([CONCAT(" "&LEN(A1:A5))])
дает 1D массив от 0 до 5, где первый элемент пуст[INDEX(LEN(A1:A5),)]
Это еще один обходной путь, по сути, вы должны использовать функцию обработки массива, чтобы получить желаемое поведение возврата массива, аналогично добавлению бессмысленного,RAND()
чтобы сделать формулы вашего листа нестабильными.Evaluate()
против[]
Есть несколько различий между
Evaluate()
и[]
быть в курсеEvaluate("SUM(B1,1,"&v &",2)")
будет подводить[B1]
,1
,2
и переменныйv
Массивы
При возврате массива можно использовать только Evaluate с индексом массива, поэтому
эквивалентно
источник
i=[ROW(A1:A5)]:v=i(2,1):?v
Объединить
Next
заявленияМожет быть сжат до
где итераторы для
For
петельi
,j
иk
- в таком порядке.Например, ниже (69 байт)
Может быть сжат до 65 байт
А что касается того, как это влияет на форматирование и отступ, я думаю, что лучший подход к обработке этого вопроса - это выравнивание следующего оператора с внешним большинством для оператора. Например.
источник
Снижение
If
ЗаявленияПри назначении переменной с помощью условного
If ... Then ... Else
проверки вы можете уменьшить объем используемого кода, исключивEnd If
, поместив всю проверку в одну строку.Например, это ( 37 символов):
Может быть уменьшено до этого ( 30 символов)
Если у вас есть несколько вложенных условных выражений, вы также можете минимизировать их следующим образом:
Обратите внимание
:
позволяет добавить более одной строки / команды в пределахIf
блоке.В таких простых случаях, как это, вы можете также удалить
Else
, установив переменную передIf
проверкой ( 25 символов):Более того, вышесказанное может быть дополнительно сведено к этому с помощью
IIf()
функции ( 20 символов):источник
Уменьшить
Range("A1")
и как звонкиRange("A1").Value
(17 байт) и более простойRange("A1")
(11 байт) могут быть уменьшены до[A1]
(4 байт)источник
[]
заменыEvaluate()
в VBA намного более универсально, чем просто вызовы диапазона. Например, вы можете использовать его, чтобы заменитьWorksheetFunction.FuncName(args)
просто[FuncName(args)]
, например,?[SUMPRODUCT({1,3,5},{2,7,-1})]
или очень полезно[MIN(1,2,3)]
/[MAX(1,2,3)]
Evaluate("str")
или стенография[str]
очень сильна в VBA, я только недавно узнал, и я думаю, что это будет полезно и для игры в гольф!Удалить пробелы
VBA будет автоматически форматировать, чтобы добавить большой интервал, который на самом деле не нужен. Есть ответ на мета, который имеет большой смысл для меня, почему мы можем дисконтировать байты, добавленные автоматическим форматированием. Важно всегда проверять, что вы не удалили слишком много. Например, вот мой ответ, который был уменьшен почти на 22% только за счет удаления пробелов:
Оригинальная версия: (188 байт)
Уменьшенная версия: (146 байт)
Если вы скопируете / вставите уменьшенную версию в VBA, она автоматически расширится до оригинала. Вы можете поиграть с тем, где это допустимо, чтобы удалить пробелы. Те, которые я нашел до сих пор, похоже, следуют шаблону, в котором от VBA ожидается появление определенной команды, потому что без нее это недопустимый код. Вот некоторые, которые я нашел до сих пор:
+-=/*^
и т. Д.To
иStep
вFor
заявлении:For x=-3To 3Step 0.05
To
,&
,Then
и т.д.) , если он предшествует буквальным , например, номер,)
,?
,%
и т.д.&
объединения строк:Cells(1,1)=Int(t)&Format(t,":hh:mm:ss")
If s=StrReverse(s)Then
Replace(Space(28)," ",0)
источник
?
vs, котороеPrint
я вижу, приемлемо, но&
добавление объявления типа, как сразу после переменной, например,Debug.?a&"z"
даетDebug.Print a&; "z"
. Добавленный;
символ необходим для запуска кода - это все еще разрешено?If i=1 Then
может стать ,If i=1Then
потому что, как правило , зарезервированное слово , которое следует буквальным, будь то число,)
,?
,%
, .. и т.д., не должны быть отделены друг от друга пространство)
(или любым другим нечисловым литералом) и&
Подготовьтесь к пиксельной графике
Пиксельная графика - одна из самых сильных сторон Excel, так как нет необходимости создавать холст, так как он уже есть у вас - все, что вам нужно сделать, это сделать небольшие корректировки
1) Сделайте клетки квадратными
или, как вариант, на 1 байт больше, но с ним гораздо проще работать
2) Раскрась нужный диапазон
Любой
Range
объект может быть окрашен с помощью вызоваПримечание: это можно и нужно сочетать с другими приемами, отмеченными в этой вики, такими как ссылки на диапазоны с помощью
[]
нотации (например[A1:R5,D6]
) над использованием aCells(r,c)
или aRange(cellAddress)
вызова. Кроме того, как отмечено в этой вики, это может быть объединено с отрицательным значением цвета для уменьшения размера эталонных цветов.Быстрые ссылки
Диапазон Ссылка
На ячейку
A1
можно ссылаться любым из следующих способови на диапазон
A1:D4
можно ссылаться любым из следующих способовЦветовой справочник
источник
Упростите встроенные функции
При частом использовании определенных функций переназначайте их пользовательской функции.
Следующий код ( 127 символов) может быть уменьшен с:
до ( 124 символа):
Комбинируя это с трюком ByRef , вы можете сохранить еще больше символов (до 114 ):
Делайте это разумно, так как VBA требует много символов для определения
Function
. Второй кодовый блок будет на самом деле больше первого при любом количествеFormat()
вызовов.источник
a = f(w)
его можно уменьшить доf w
STDIN и STDOUT
Ввод в
Sub
подпрограммы иFunction
s через входные переменныеМожет быть уменьшено до
Public
иByRef
звонки по умолчанию для VBA и , таким образом , неявно, и может (почти) всегда быть отброшен.Тип буквальный
$
заставляетb
быть типаString
.Другие литералы типа
!
не замужем@
валюта#
двойной%
целое число$
строка&
Длинная^
LongLong (только 64 бит)Кроме того, общепринято, что вы можете оставить входную переменную в качестве типа по умолчанию
Variant
и оставить любые ошибки на основе типов необработанными. Например.Sub E(F)
в котором,F
как ожидается, будет иметь типBoolean[]
(который будет передан в рутину, какE Array(True, False, False)
)Ввод в
Sub
подпрограммы и функции непосредственного окна черезCells
VBA не имеет полностью функциональной консоли и, следовательно, не имеет никакого официального STDIN, и, следовательно, позволяет некоторые игру с передачей ввода.
В Excel, как правило, принято принимать данные из ячейки или диапазона ячеек, что может быть сделано как
который неявно помещает
.value
из ячейки[A1]
(на которую также можно ссылаться какcells(1,1)
илиrange("A1")
Пример проблемы: отображение ввода в окне сообщения
Через подпрограмму
Sub A:msgbox[A1]:End Sub
Через функцию окна Immediates
msgbox[A1]
Ввод с помощью аргументов условной компиляции
Проекты VBA поддерживают получение аргументов из командной строки или через свойства VBAProject (просмотр через проводник проекта -> [Ваш проект VBA] - (Правый клик) -> Свойства VBAProject -> Аргументы условной компиляции)
Это в значительной степени полезно для вызовов кода ошибок
Учитывая аргумент
n=
условной компиляции [some_value], это позволяет выполнять код, который будет выдавать код ошибки, основанный на значенииn
. обратите внимание, это требует добавления 2-х байтов к вашему кодуn=
в разделе аргументов условной компиляции панели свойств VBAProject.Пример кода
Вывод через значение функции
Не очень, чтобы сказать здесь, общая форма, приведенная ниже, настолько компактна, насколько это возможно.
ПРИМЕЧАНИЕ: в подавляющем большинстве случаев метод преобразования байта в подпрограмму и его вывод в окно немедленного использования VBE выполняется более подробно (см. Ниже).
Вывод из
Sub
подпрограмм иFunction
s через окно VBE ImmediatesВывод в окно немедленного использования VBE (AKA - окно отладки VBE) является распространенным методом вывода для VBA для текстовых задач, однако важно помнить, что
Debug.Print "Text"
вызов может быть в значительной степени обработан.функционально идентичен
в качестве
?
автоформатовPrint
.Вывод из
Sub
подпрограмм и функций окна VBE Immediates с помощью других методовВ редких случаях, когда ситуация просто правильная, вы можете использовать входные данные из некоторых более тривиальных входов, доступных для VBA, таких как регулятор размера шрифта, селектор шрифта и масштабирование. (Например, эмуляция селектора размера шрифта Word )
источник
Краткое примечание по форматированию
Потому что StackExchange использует Markdown и Prettify.js к ответам на кодирование можно добавить языковой флаг, что обычно делает их более профессиональными. Хотя я не могу гарантировать, что это сделает вас лучше в гольфе в VBA, я могу гарантировать, что это сделает вас похожими на вас.
Добавление любого из флагов ниже изменит
в
Языковые теги VBA
<!-- language: lang-vb -->
<!-- language-all: lang-vb -->
Примечание: последний преобразует все сегменты кода в вашем ответе, в то время как предыдущий преобразует только непосредственно следующие сегменты кода
источник
lang-vb
а? - Странно, что это форматирует лучше, чемlang-vba
для ответов VBA.lang-vba
подсветка обеспечивает, она на самом деле просто подсветка по умолчанию. Очевидно, VBA на самом деле не был реализован в Prettify.js, поэтому нам придется придерживаться выделения VBмножественный
If .. Then
проверкиКак и в других языках, несколько
If
проверок обычно можно объединить в одну строку, что позволяет использоватьAnd
/Or
(то есть&&
/||
в C и других), который в VBA заменяет и a,Then
и anEnd If
.Например, с вложенным условным выражением ( 93 символа):
может стать ( 69 символов):
Это также работает с не вложенными условными выражениями.
Рассмотрим ( 84 символа):
Это может стать ( 51 символ):
источник
d=iif(a=b or c=b,0,d)
Конечные
For
петлиПри использовании
For
петельNext
строка не нуждается в имени переменной (хотя, вероятно, ее лучше использовать в обычном кодировании).Следовательно,
можно сократить до:
(Экономия зависит от имени вашей переменной, хотя, если вы играете в гольф, это, вероятно, всего 1 символ + 1 пробел.)
источник
Разбить строку на массив символов
Иногда бывает полезно разбить строку на отдельные символы, но может потребоваться немного кода, чтобы сделать это вручную в VBA.
Вместо этого вы можете использовать одну строку, относительно минимальную цепочку функций, чтобы выполнить работу:
Это назначит вашу строку
s
вVariant
массивa
. Однако будьте осторожны, так как последний элемент в массиве будет пустой строкой (""
), которая должна быть обработана соответствующим образом.Вот как это работает:
StrConv
функция конвертируетString
в другой указанный вами формат. В этом случае 64 =vbUnicode
, поэтому он преобразуется в формат Unicode. При работе с простыми строками ASCII результатом является нулевой символ (не пустая строка""
), вставленный после каждого символа.Следующее
Split
затем преобразует полученный результатString
в массив, используя нулевой символChr(0)
в качестве разделителя.Важно отметить, что
Chr(0)
это не то же самое, что пустая строка""
, и использованиеSplit
on""
не вернет ожидаемый массив. То же самое относится и кvbNullString
(но если вы играете в гольф, то зачем вам вообще использовать такую многословную константу?).источник
Использование
With
(Иногда! Смотрите сноску)Использование этого
With
оператора может значительно уменьшить размер кода, если вы несколько раз используете некоторые объекты.то есть это ( 80 символов):
может быть закодировано как ( 79 символов):
Выше даже не лучший сценарий. При использовании чего-либо с
Application
, например,Excel.Application
из Access, улучшение будет гораздо более значительным.* В зависимости от ситуации,
With
может быть или не быть более эффективным, чем это ( 64 символа):источник
Бесконечные циклы
Рассмотреть вопрос о замене
или
с устаревшим, но меньшим количеством байтов
Если вам нужно выйти
Sub
илиFunction
преждевременно, то вместоExit ...
рассмотреть возможность
End
Обратите внимание, что
End
останавливает выполнение всего кода и очищает любые глобальные переменные, поэтому используйте с умомисточник
For
иEnd
), чтобы отразить, что случай100
никогда не будет удовлетворен, и добавить ненужный байтИспользуйте
Spc(n)
болееSpace(n)
,[Rept(" ",n)]
илиString(n," ")
При попытке вставить несколько пробелов длины
n
используйтенад
Примечание: я не уверен, почему, но кажется, что вы не можете присвоить выходные данные
Spc(n)
переменной, и что она должна быть напечатана напрямую - так что в некоторых случаяхSpace(n)
это все же лучший путь.источник
Уменьшить
Debug.Print
иPrint
звонки(12 байт; обратите внимание на завершающий пробел) можно уменьшить до
(7 байт; обратите внимание на отсутствие пробела).
Так же,
(6 байт) может быть уменьшено до
(1 байт).
Кроме того, при работе в контексте анонимной функции непосредственного окна VBE
Debug
оператор может быть полностью отброшен, и вместо этого можно считать, что печать в непосредственное окно VBE через?
STDIN / STDOUTСпециальные символы
При печати строк вы также можете использовать специальные символы вместо
&
. Они позволяют использовать альтернативные форматы в том, что печатается, или в пробелахДля объединения переменных строк, а не
Вы можете использовать точку с запятой
;
Эта точка с запятой является поведением по умолчанию для последовательных строк, если нет двусмысленности. Так что они действительны:
Но нет
Обратите внимание, что а; в конце строки подавляет новую строку, так как новые строки по умолчанию добавляются после каждой печати. Подсчет байтов, возвращаемых кодом VBA, обсуждается
Для объединения с вкладкой используйте запятую
,
(фактически 14 пробелов, но в соответствии с)Наконец, вы можете использовать объявления типов для объединения строк вместо;, каждое из которых имеет свое небольшое влияние на форматирование. Для всего ниже
a = 3.14159
приведена первая строкаисточник
Используйте помощника,
Sub
чтобыPrint
Если код требует использования более шести
Debug.?
операторов, вы можете уменьшить байты, заменив все Debug. линии с вызовом Sub, как показано ниже. Чтобы напечатать пустую строку, вам нужно позвонить,p ""
так как параметр требуется.источник
p""
или , если это может быть несогласованным,p"
. Однако в подавляющем большинстве случаев, когда это применимо, имеет смысл использовать строковую переменную и печатать строковую переменную только в конце.Используйте
Array()
вместоChoose()
Select
илиIf...Then
При назначении переменной на основе значения другой переменной имеет смысл выписать шаги с
If...Then
проверками, например так:Тем не менее, это может занять много места в коде, если нужно проверить более одной или двух переменных (в любом случае, как правило, есть и лучшие способы сделать это).
Вместо этого
Select Case
оператор помогает уменьшить размер проверок, заключая все в один блок, например:Это может привести к гораздо меньшему коду, но для очень простых случаев, таких как этот, есть еще более эффективный метод:
Choose()
эта функция выберет значение из списка на основе значения, переданного ему.Опция select (
a
в данном случае) - это целочисленное значение, переданное в качестве первого аргумента. Все последующие аргументы являются значениями на выбор (с 1 индексом, как и большинство VBA). Значения могут быть любого типа данных, если они соответствуют устанавливаемой переменной (т.е. объекты не работают безSet
ключевого слова) и даже могут быть выражениями или функциями.Дополнительная опция - использовать
Array
функцию для получения того же эффекта при сохранении другого символа:источник
IIf()
или инымChoose()
: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))
Смещенные в бит значения RGB
Благодаря тому, что Excel обрабатывает цвета (шестнадцатеричное шестнадцатеричное целое число без знака), вы можете использовать целые числа с отрицательными знаками, из которых Excel будет использовать только правильные 6 байтов для назначения значения цвета.
Это немного сбивает с толку, поэтому некоторые примеры приведены ниже
Допустим, вы хотите использовать белый цвет, который хранится как
и эквивалентно
чтобы упростить эту задачу, все, что нам нужно сделать, - это найти отрицательное шестнадцатеричное значение, оканчивающееся на,
FFFFFF
и, поскольку отрицательные шестнадцатеричные значения в должны быть в форматеFFFFXXXXXX
(такой, которыйX
является действительным шестнадцатеричным), начиная сFFFFFFFFFF
(-1
) доFFFF000001
(-16777215
)Зная это, мы можем обобщить, что формула
Используя это, некоторые полезные преобразования
источник
rgbWhite
=2^24-1
хотя, возможно, еще больше уменьшится, если вы пропустите -1, чтобы приблизиться&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 не обязательно завершен, но я думаю, что проделал довольно основательную работуПропустить терминал
"
при печати в Immediate WindowУчитывая функцию ниже, которая должна использоваться в окне отладки
Терминал
"
может быть отброшен на -1 байт, оставив строку незамкнутой, и программа должна выполнить то же самое, без ошибокЕще более удивительным является то, что это может быть сделано в рамках полностью определенных подпрограмм.
Вышеуказанная подпрограмма работает так, как ожидалось, и автоматически форматирует
источник
Используйте переменные Truthy и Falsey в условных выражениях
Иногда называется неявное преобразование типа - непосредственно используя тип номера в
If
,[IF(...)]
илиIIf(...)
заявление, с помощью truthy и falsey характер этого номера может абсолютно спасти вас несколько байтов.В VBA любая переменная числового типа, отличная от нуля, считается истинной (и, следовательно, ноль
0
, является единственным значением Falsey) и, таким образом,может быть сжат до
и дальше
источник
Адресные листы по имени
Вместо адресации
WorkSheet
объекта путем вызоваМожно использовать
Или, более предпочтительно, можно получить доступ к объекту напрямую и использовать
источник
Возведение в степень и
LongLong
s в 64-битном VBAОбщая форма возведения в степень,
Может быть представлен как в VBA как
Но только в 32-разрядных установках Office , в 64 -разрядных установках Office, самый короткий путь, который вы можете представить без ошибок, это
Это связано с тем, что в 64-битных версиях VBA
^
служит литералом возведения в степень иLongLong
символом объявления типа . Это означает, что может возникнуть некоторый довольно странный, но правильный синтаксис, такой каккоторый назначает переменную
a
для хранения максимального значенияLonglong
источник
Сжать байтовые массивы как строку
Для вызовов, которые требуют, чтобы решение содержало постоянные данные, может быть полезно сжать эти данные в одну строку, а затем выполнить итерацию по строке для извлечения данных.
В VBA любое значение байта может быть напрямую преобразовано в символ с
И значение
long
илиinteger
может быть преобразовано в два символа сТак что для
byte
массива алгоритм сжатия будет выглядеть примерно так:Отметим, что
Select Case
раздел реализован из-за символов, которые не могут быть сохранены как литералы в строке.Из полученной строки, которая будет выглядеть примерно так
Данные затем могут быть извлечены с помощью
Asc
иMid
функции, например ,источник
Используйте неправильные константы
В некоторых случаях VBA позволяет использовать не выраженные в списке или неправильные константы в выражениях, которые требуют постоянных значений. Они часто являются устаревшими значениями и короче по длине, чем правильные значения.
Например, приведенные ниже значения могут быть использованы, когда
rng.HorizantalAlignment
свойство удерживает значение .Это означает, например, что установка ячейки в центре текста с
может быть сокращено до
заменив неподходящее постоянное значение
3
на правильное значение-4108
. Обратите внимание, что если вы получитеrng.HorizantalAlignment
значение свойства, оно вернет правильное значение. В этом случае это будет-4108
.источник
В Excel создайте числовые массивы с помощью принудительного выбора диапазонов
Когда постоянный одномерный набор чисел смешанной длины,S необходимо, будет более эффективно использовать
[{...}]
нотацию для объявления диапазона и затем приводить его к числовому массиву, а не использоватьSplit(String)
нотацию или подобное.Используя этот метод, изменениеΔколичество байтов= - 5 байт начисляется за все S ,
пример
Например,
может быть написано как
Кроме того, стоит отметить, что, хотя этот метод не допускает прямого индексирования, он допускает итерацию по циклу for напрямую, т.е.
источник