Vba excel длинная строка

А другого пути нету? А то ведь неизвестно какой длины строка. Сгенерится на миллион символов… И притом, надо разбить её на неизвестное число кусков.  

  Проблема 1: Надо разбить эту сгенерированную строку на куски переменной длины (ведь сначала идут двузначные номера, потом пятизначные, потом десятизначные…).    
s1 = «103:103,108:108,315:315… и так далее …»  
s2 = «1386:1386,20000:20000,333333333:333333333 и так далее»  
Это значит, в коде надо писать формулу для вычисления.  

  Проблема 2: Потребуется дополнительный  массив переменной длины, куда помещать эти куски.  

  Проблема 3: Синтаксис Union подразумевает конечное число кусков. Переменное число кусков записать не получится.  
Union(Range(s1), Range(s2), Range(s3), … и ещё неизвестно сколько).Select  

  Union здесь не подходит, проще проводить заданные операции с каждым куском. Опять циклы.  

  В результате, чтобы решить простейшую задачку на 10 строк кода, надо дополнительно написать ещё 1000. Неужели нет более элегантного решения?

Содержание

  1. Len function
  2. Syntax
  3. Remarks
  4. Example
  5. See also
  6. Support and feedback
  7. Обойти максимальный размер строки в функции vba?
  8. 6 ответы
  9. VBA Строковые литералы — экранирование, непечатаемые символы и линейные продолжения
  10. замечания
  11. Выход из символа
  12. Присвоение длинных строковых литералов
  13. Использование строковых констант VBA
  14. VBA Типы данных и ограничения
  15. целое число
  16. логический
  17. Долго
  18. не замужем
  19. двойной
  20. валюта
  21. строка
  22. Переменная длина
  23. Фиксированная длина
  24. Долго долго
  25. Вариант
  26. LongPtr
  27. Десятичный

Len function

Returns a Long containing the number of characters in a string or the number of bytes required to store a variable.

Syntax

Len(string | varname)

The Len function syntax has these parts:

Part Description
string Any valid string expression. If string contains Null, Null is returned.
varname Any valid variable name. If varname contains Null, Null is returned. If varname is a Variant, Len treats it the same as a String and always returns the number of characters it contains.

One (and only one) of the two possible arguments must be specified. With user-defined types, Len returns the size as it will be written to the file.

Use the LenB function with byte data contained in a string, as in double-byte character set (DBCS) languages. Instead of returning the number of characters in a string, LenB returns the number of bytes used to represent that string. With user-defined types, LenB returns the in-memory size, including any padding between elements. For sample code that uses LenB, see the second example in the example topic.

Len may not be able to determine the actual number of storage bytes required when used with variable-length strings in user-defined data types.

Example

The first example uses Len to return the number of characters in a string or the number of bytes required to store a variable. The Type. End Type block defining CustomerRecord must be preceded by the keyword Private if it appears in a class module. In a standard module, a Type statement can be Public.

The second example uses LenB and a user-defined function (LenMbcs) to return the number of byte characters in a string if ANSI is used to represent the string.

See also

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

Обойти максимальный размер строки в функции vba?

Максимальное количество символов, которое вы можете использовать в строке в функции vba, равно 255. Я пытаюсь запустить эту функцию.

Он запускает процедуру в определенное время и передает ей набор переменных. но строка слишком длинная.

Обновление: к сожалению, я уверен, что это не окно просмотра. Кроме того, я имею дело не с максимальным размером строки. Это максимальный размер строки в функции vba.

Например эта функция работает.

Но если вы измените 12 на 123, он сломается. Пример

Этот код не работает, я почти уверен, что это потому, что функция vba не может обрабатывать строку с более чем 255 символами. Даже если вы находитесь в Excel и вызываете функцию и даете ей строку длиннее 255 символов, это не работает.

Попробуйте ввести ячейку A1 = vlookup («действительно длинная строка», A1: Z10, 1), а затем поместите действительно длинную строку где-нибудь в этом диапазоне. Vlookup не удастся (не упустите возможность найти, но на самом деле вы не сможете это сделать)

Также я знаю, что есть максимальная длина суб-имени, я прямо под ним. Извините, что это выглядит так некрасиво.

Обновление 2: поэтому я только что напечатал переменную на листе и получил функцию, вызываемую ontime, чтобы прочитать их с листа. 🙁

задан 25 марта ’10, 12:03

От Джоэла Спольски (который руководил ранней разработкой Excel): «Excel использует строки Pascal внутри себя, поэтому строки во многих местах в Excel ограничены 255 байтами, и это также одна из причин, по которой Excel работает невероятно быстро». Это, вероятно, относится к упомянутой вами проблеме VLookup, хотя, как утверждали другие, VBA не имеет такого ограничения. — mwolfe02

Вы можете использовать String(number_of_repeats, char_to_repeat) сделать веревку на лету вместо aaaaaaaaaaaaaaaaaaaaaaaaaaa. — user2140173

6 ответы

Это работает, и в окне сообщения отображается более 255 символов.

В окне сообщения строка обрезается до 1023 символов, но сама строка может быть очень большой.

Я бы также рекомендовал вместо использования фиксированных имен переменных с числами (например, Var1 , Var2 , Var3 . Var255 ), что вы используете массив. Это гораздо более короткое и простое в использовании объявление — циклы.

Обновлено, чтобы показать, что строка может быть длиннее 255 символов и таким образом использоваться в подпрограмме / функции в качестве параметра. Это показывает, что длина строки составляет 1443 символа. Фактический предел в VBA составляет 2 ГБ на строку.

Возможно, вместо этого есть проблема с API, который вы используете и который имеет ограничение на строку (например, строку фиксированной длины). Проблема не в самом VBA.

Хорошо, я вижу, что проблема именно в самом методе Application.OnTime. Он ведет себя как функции Excel в том смысле, что они принимают только строки длиной до 255 символов. Однако процедуры и функции VBA не имеют этого ограничения, как я показал. Возможно, тогда это ограничение накладывается на любой встроенный метод объекта Excel.

Обновить:
изменились . longer than 256 characters. в . longer than 255 characters.

Источник

VBA
Строковые литералы — экранирование, непечатаемые символы и линейные продолжения

замечания

Назначение строковых литералов в VBA ограничено ограничениями IDE и кодовой страницы настроек языка текущего пользователя. В приведенных выше примерах показаны особые случаи экранированных строк, специальных, непечатаемых строк и длинных строковых литералов.

При назначении строковых литералов, содержащих символы, специфичные для определенной кодовой страницы, вам может потребоваться рассмотреть проблемы интернационализации, назначив строку из отдельного файла ресурсов юникода.

Выход из символа

Синтаксис VBA требует, чтобы строковый литерал отображался внутри » меток», поэтому, когда ваша строка должна содержать кавычки, вам нужно будет избежать / добавить » символ с дополнительным » чтобы VBA понимал, что вы намерены «» интерпретируется как » строка».

Присвоение длинных строковых литералов

Редактор VBA разрешает только 1023 символа в строке, но обычно только первые 100-150 символов видны без прокрутки. Если вам нужно назначить длинные строковые литералы, но вы хотите, чтобы ваш код читался, вам нужно будет использовать продолжение строки и конкатенацию для назначения вашей строки.

VBA позволит вам использовать ограниченное количество строк (фактическое число зависит от длины каждой строки в непрерывном блоке), поэтому, если у вас очень длинные строки, вам необходимо назначить и повторно назначить с помощью конкатенации ,

Использование строковых констант VBA

VBA определяет ряд строковых констант для специальных символов, таких как:

  • vbCr: Carriage-Return ‘То же, что и « r» в языках стиля C.
  • vbLf: Line-Feed ‘То же, что и « n» в языках стиля C.
  • vbCrLf: Carriage-Return & Line-Feed (новая строка в Windows)
  • vbTab: символ табуляции
  • vbNullString: пустая строка, например «»

Вы можете использовать эти константы с конкатенацией и другими строковыми функциями для создания строковых литералов со специальными символами.

Использование vbNullString считается лучшей практикой, чем эквивалентное значение «» из-за различий в том, как компилируется код. Доступ к vbNullString осуществляется с помощью указателя на выделенную область памяти, а компилятор VBA достаточно умен, чтобы использовать нулевой указатель для представления vbNullString . Литерал «» выделяется память, как если бы это был вариант с типизированным строком, что делает использование константы намного более эффективным:

Источник

VBA
Типы данных и ограничения

Байт представляет собой неподписанный 8-битный тип данных. Он может представлять целые числа от 0 до 255, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: Overflow . Байт является единственным внутренним беззнаковым типом, доступным в VBA.

Функция кастинга для преобразования в байт — CByte() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

Байт-массивы и строки

Строки и байтовые массивы могут быть заменены друг на друга посредством простого присваивания (необязательные функции преобразования).

Чтобы иметь возможность кодировать символы Unicode , каждый символ в строке занимает два байта в массиве с первым младшим байтом. Например:

целое число

Целое число — это подписанный 16-битный тип данных. Он может хранить целые числа в диапазоне от -32,768 до 32,767, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

Целые числа хранятся в памяти как малозначные значения с отрицаниями, представленными как дополнение к двум .

Обратите внимание, что в целом лучше использовать Long, а не Integer, если меньший тип не является членом типа или не требуется (либо по API-вызову, либо по другой причине), чтобы быть 2 байтами. В большинстве случаев VBA обрабатывает целые числа как 32-битные внутри, поэтому обычно нет преимуществ при использовании меньшего типа. Кроме того, каждый раз, когда используется тип Integer, он выполняет штраф за производительность, поскольку он бесшумно применяется как Long.

Функция кастинга для преобразования в Integer — это CInt() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

логический

Логическое значение используется для хранения значений, которые могут быть представлены как True или False. Внутренне тип данных сохраняется как 16-битное значение с 0, представляющим False, и любое другое значение, представляющее True.

Следует отметить, что когда Boolean применяется к числовому типу, все биты имеют значение 1. Это приводит к внутреннему представлению -1 для подписанных типов и максимальному значению для неподписанного типа (байт).

Функция кастинга для преобразования в булевское значение — CBool() . Несмотря на то, что он представлен внутренне как 16-битное число, отбрасывание в Boolean из значений вне этого диапазона безопасно от переполнения, хотя оно устанавливает все 16 бит в 1:

Долго

A Long — это подписанный 32-битный тип данных. Он может хранить целые числа в диапазоне от -2,147,483,648 до 2,147,483,647, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

Длинны хранятся в памяти как малозначные значения с отрицаниями, представленными как дополнение к двум .

Обратите внимание, что поскольку Long соответствует ширине указателя в 32-разрядной операционной системе, Longs обычно используются для хранения и передачи указателей на и из функций API.

Функция кастинга для преобразования в Long — CLng() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

не замужем

A Single — это подписанный 32-битный тип данных с плавающей точкой. Он хранится внутренне с использованием малогабаритной схемы памяти IEEE 754 . Таким образом, не существует фиксированного диапазона значений, которые могут быть представлены типом данных. Ограничение — это точность сохраненного значения. Единица может хранить значения целочисленных значений в диапазоне от -16,777,216 до 16,777,216 без потери точности. Точность чисел с плавающей запятой зависит от экспоненты.

Единица будет переполняться при назначении значения, превышающего примерно 2 128 . Он не будет переполняться отрицательными показателями, хотя допустимая точность будет сомнительной до того, как будет достигнут верхний предел.

Как и во всех числах с плавающей запятой, следует соблюдать осторожность при проведении сравнений равенства. Лучшей практикой является включение значения дельта, соответствующего требуемой точности.

Функция кастинга для преобразования в Single — это CSng() .

двойной

A Double — это подписанный 64-битный тип данных с плавающей точкой. Подобно Single , он хранится внутренне с использованием малогабаритной схемы памяти IEEE 754, и должны быть приняты те же меры предосторожности в отношении точности. Двойной объект может хранить целые значения в диапазоне от -9,007,199,254,740,992 до 9,007,199,254,740,992 без потери точности. Точность чисел с плавающей запятой зависит от экспоненты.

Двойной переполняется при назначении значения, превышающего примерно 2 1024 . Он не будет переполняться отрицательными показателями, хотя допустимая точность будет сомнительной до того, как будет достигнут верхний предел.

Функция кастинга для преобразования в Double — это CDbl() .

валюта

Валюта — это подписанный 64-битный тип данных с плавающей точкой, аналогичный Double , но масштабированный на 10 000, чтобы обеспечить большую точность для 4 цифр справа от десятичной точки. Переменная Currency может хранить значения от -922,337,203,685,477.5808 до 922,337,203,685,477.5807, предоставляя ей наибольшую емкость любого встроенного типа в 32-битном приложении. Как следует из названия типа данных, считается, что наилучшим образом использовать этот тип данных при представлении денежных расчетов, поскольку масштабирование помогает избежать ошибок округления.

Функция кастинга для преобразования в валюту — CCur() .

Тип Даты представлен внутренне в качестве подписанного 64 бит с плавающей точкой типа данных со значением слева от десятичного представляющего количества дней с момента эпохи декабря 30 — го, 1899 (хотя см примечания ниже). Значение справа от десятичного знака представляет время как дробный день. Таким образом, целочисленная дата будет иметь временной компонент в 12:00:00 AM, а x.5 будет иметь временной компонент в 12:00:00 PM.

Допустимые значения Даты находятся между 1 января 100 года и 31 декабря 9999. й Поскольку двойной имеет больший диапазон, можно переполнять Дата путем присвоения значения вне этого диапазона.

Таким образом, его можно использовать взаимозаменяемо с расчетами Double for Date:

Функция кастинга для преобразования в дату — это CDate() , которая принимает любое числовое представление даты / времени с числовым типом. Важно отметить, что строковые представления дат будут преобразованы на основе текущей настройки локали, используемой, поэтому следует избегать прямых бросков, если код предназначен для переносимости.

строка

Строка представляет последовательность символов и поставляется в двух вариантах:

Переменная длина

Строка переменной длины позволяет добавлять и усекать и хранится в памяти как COM BSTR . Это состоит из 4-байтового беззнакового целого числа, которое хранит длину строки в байтах, за которой следуют строковые данные в виде широких символов (2 байта на символ) и заканчивается двумя нулевыми байтами. Таким образом, максимальная длина строки, которую может обрабатывать VBA, составляет 2 147 483 647 символов.

Внутренний указатель на структуру (восстанавливаемый StrPtr() ) указывает на расположение памяти данных , а не на префикс длины. Это означает, что VBA String может быть передана непосредственно API-функциям, которым требуется указатель на массив символов.

Поскольку длина может изменяться, VBA перераспределяет память для String каждый раз, когда назначается переменная , которая может налагать штрафы за производительность для процедур, которые изменяют их повторно.

Фиксированная длина

Строки фиксированной длины выделяются по 2 байта для каждого символа и сохраняются в памяти как простой массив байтов. После выделения длина строки неизменна. Они не имеют нулевой конец в памяти, поэтому строка, заполняющая память, выделенную ненулевыми символами, непригодна для передачи функциям API, ожидающих нулевую завершаемую строку.

Строки фиксированной длины несут на себе устаревшее ограничение на 16 бит, поэтому длина может составлять до 65 535 символов. Попытка присвоить значение дольше, чем доступное пространство памяти, не приведет к ошибке выполнения — вместо этого результирующее значение будет просто усечено:

Функция каста для преобразования в строку любого типа — CStr() .

Долго долго

LongLong — это подписанный 64-битный тип данных и доступен только в 64-битных приложениях. Он не доступен в 32 — разрядных приложений , работающих на 64 — разрядных операционных системах. Он может хранить целые значения в диапазоне от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

LongLongs хранятся в памяти как малозначные значения с отрицаниями, представленными как дополнение к двум .

Тип данных LongLong был представлен как часть поддержки 64-битной операционной системы VBA. В 64-битных приложениях это значение может использоваться для хранения и передачи указателей на 64-битные API.

Функция литья для преобразования в LongLong — CLngLng() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

Вариант

A Variant — это тип данных COM, который используется для хранения и обмена значениями произвольных типов, а любой другой тип в VBA может быть назначен Variant. Переменные, объявленные без явного типа, указанные As [Type] умолчанию для варианта.

Варианты хранятся в памяти как структура VARIANT, которая состоит из дескриптора байтового типа ( VARTYPE ), за которым следуют 6 зарезервированных байтов, а затем 8-байтовая область данных. Для числовых типов (включая Date и Boolean) базовое значение сохраняется в самом Variant. Для всех других типов область данных содержит указатель на базовое значение.

Основной тип Variant может быть определен с помощью функции VarType() которая возвращает числовое значение, хранящееся в дескрипторе типа, или функцию TypeName() которая возвращает строковое представление:

Поскольку Variant может хранить значения любого типа, назначения из литералов без подсказок типа будут неявно отнесены к варианту соответствующего типа в соответствии с приведенной ниже таблицей. Литералы с типом намеков будут приведены к варианту намеченного типа.

Значение Результирующий тип
Строковые значения строка
Номера без плавающей запятой в диапазоне Integer целое число
Номера без плавающей запятой в дальнем расстоянии Долго
Номера без плавающей запятой вне дальнего расстояния двойной
Все числа с плавающей запятой двойной

Примечание. Если не существует конкретной причины использовать вариант (т.е. итератор в цикле For Each или требование API), тип обычно следует избегать для обычных задач по следующим причинам:

  • Они не безопасны для типов, что увеличивает вероятность ошибок во время выполнения. Например, вариант, содержащий значение Integer, беззвучно изменяет себя на Long, а не на переполнение.
  • Они вносят накладные расходы на обработку, требуя, по крайней мере, одного дополнительного разыменования указателя.
  • Требование к памяти для Variant всегда на 8 байт выше, чем требуется для хранения базового типа.

Функция кастинга для преобразования в вариант — это CVar() .

LongPtr

LongPtr был представлен в VBA для поддержки 64-битных платформ. В 32-битной системе он рассматривается как Long и на 64-битных системах, он рассматривается как LongLong .

Основное использование заключается в предоставлении переносного способа хранения и передачи указателей на обе архитектуры (см. Изменение поведения кода во время компиляции .

Хотя он обрабатывается операционной системой как адрес памяти при использовании в вызовах API, следует отметить, что VBA рассматривает его как подписанный тип (и, следовательно, подвержен неподписанному сигналу переполнения). По этой причине любая арифметика указателя, выполняемая с использованием LongPtrs, не должна использовать > или сравнения. Этот «quirk» также позволяет добавлять простые смещения, указывающие на действительные адреса в памяти, может привести к ошибкам переполнения, поэтому следует соблюдать осторожность при работе с указателями в VBA.

Функция кастинга для преобразования в LongPtr — CLngPtr() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5 (хотя, поскольку он обычно является адресом памяти, использование его в качестве целевой цели для расчета с плавающей точкой в ​​лучшем случае опасно).

Десятичный

Тип данных Decimal доступен только в качестве CDec Variant , поэтому вы должны объявить любую переменную, которая должна содержать Decimal как Variant а затем назначить Decimal значение с CDec функции CDec . Ключевое слово Decimal является зарезервированным словом (которое предполагает, что VBA в конечном итоге будет добавлять поддержку первого класса для этого типа), поэтому Decimal нельзя использовать как имя переменной или процедуры.

Для типа Decimal требуется 14 байт памяти (в дополнение к байтам, которые требуются родительскому варианту), и может хранить номера до 28 знаков после запятой. Для чисел без знаков после запятой диапазон допустимых значений составляет -79,228,162,514,264,337,593,543,950,335 до +79,228,162,514,264,337,593,543,950,335 включительно. Для чисел с максимальным числом знаков в 28 знаков после запятой диапазон допустимых значений составляет -7.9228162514264337593543950335 по +7.9228162514264337593543950335 включительно.

report this ad

Источник

The max number of characters you can use in string in a vba function is 255.
I am trying to run this function

Var1= 1
Var2= 2
.
.
.
Var256 =256

RunMacros= "'Tims_pet_Robot """ & Var1 & """ , """ & Var2 & """ , """   ... """ & Var256 """ '"
Runat=TimeValue("15:00:00")
Application.OnTime EarliestTime:=Runat, Procedure:=RunMacros & RunMacros2 ', schedule:=True

It runs a procedure at a certain time and passes a bunch of variables to it. but the string is too long.

Update:
Regrettably I am sure it is not the watch window.
Also, it isn’t really the max size of a string that I’m dealing with. It’s the max size of
a string in a vba function.

For example this function works.

Sub test()
Dim RunAt As Date
Dim RunWhat As String

RunAt = Now + 0.00001
RunWhat = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" & _
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" & _
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 'that makes 254 'a''s
Application.OnTime EarliestTime:=RunAt, Procedure:="'" & RunWhat & " 12'"

End Sub


Sub aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(m As Integer)
MsgBox ("it works!" & m)
End Sub

But if you change the 12 to 123 it breaks
Example

Sub test2()
Dim RunAt As Date
Dim RunWhat As String

RunAt = Now + 0.00001
RunWhat = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" & _
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" & _
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 'that makes 254 'a''s
Application.OnTime EarliestTime:=RunAt, Procedure:="'" & RunWhat & " 123'"

End Sub


Sub aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(m As Integer)
MsgBox ("it works!" & m)
End Sub

This code does not work, I’m pretty sure it’s because a vba function cannot handle a string with more than 255 chars.
Even if you’re in Excel and call a function and give it a string longer that 255 chars it doesn’t work.

Try in cell A1 =vlookup(«really long string», A1:Z10, 1) and then put the really long string somewhere in that range. The vlookup will fail (not fail to find it, but you won’t actually be able to do it)

Also I am aware that there is a max length to a sub name, I’m just under it. Sorry that it look so ugly.

Update 2: so I just ended up printing the variable to a sheet and getting the function called by ontime to read them off the sheet. :(

The max number of characters you can use in string in a vba function is 255.
I am trying to run this function

Var1= 1
Var2= 2
.
.
.
Var256 =256

RunMacros= "'Tims_pet_Robot """ & Var1 & """ , """ & Var2 & """ , """   ... """ & Var256 """ '"
Runat=TimeValue("15:00:00")
Application.OnTime EarliestTime:=Runat, Procedure:=RunMacros & RunMacros2 ', schedule:=True

It runs a procedure at a certain time and passes a bunch of variables to it. but the string is too long.

Update:
Regrettably I am sure it is not the watch window.
Also, it isn’t really the max size of a string that I’m dealing with. It’s the max size of
a string in a vba function.

For example this function works.

Sub test()
Dim RunAt As Date
Dim RunWhat As String

RunAt = Now + 0.00001
RunWhat = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" & _
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" & _
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 'that makes 254 'a''s
Application.OnTime EarliestTime:=RunAt, Procedure:="'" & RunWhat & " 12'"

End Sub


Sub aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(m As Integer)
MsgBox ("it works!" & m)
End Sub

But if you change the 12 to 123 it breaks
Example

Sub test2()
Dim RunAt As Date
Dim RunWhat As String

RunAt = Now + 0.00001
RunWhat = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" & _
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" & _
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 'that makes 254 'a''s
Application.OnTime EarliestTime:=RunAt, Procedure:="'" & RunWhat & " 123'"

End Sub


Sub aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(m As Integer)
MsgBox ("it works!" & m)
End Sub

This code does not work, I’m pretty sure it’s because a vba function cannot handle a string with more than 255 chars.
Even if you’re in Excel and call a function and give it a string longer that 255 chars it doesn’t work.

Try in cell A1 =vlookup(«really long string», A1:Z10, 1) and then put the really long string somewhere in that range. The vlookup will fail (not fail to find it, but you won’t actually be able to do it)

Also I am aware that there is a max length to a sub name, I’m just under it. Sorry that it look so ugly.

Update 2: so I just ended up printing the variable to a sheet and getting the function called by ontime to read them off the sheet. :(

Байт

Dim Value As Byte

Байт представляет собой неподписанный 8-битный тип данных. Он может представлять целые числа от 0 до 255, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: Overflow . Байт является единственным внутренним беззнаковым типом, доступным в VBA.

Функция кастинга для преобразования в байт — CByte() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

Байт-массивы и строки

Строки и байтовые массивы могут быть заменены друг на друга посредством простого присваивания (необязательные функции преобразования).

Например:

Sub ByteToStringAndBack()

Dim str As String
str = "Hello, World!"

Dim byt() As Byte
byt = str

Debug.Print byt(0)  ' 72

Dim str2 As String
str2 = byt

Debug.Print str2    ' Hello, World!

End Sub

Чтобы иметь возможность кодировать символы Unicode , каждый символ в строке занимает два байта в массиве с первым младшим байтом. Например:

Sub UnicodeExample()

Dim str As String
str = ChrW(&H2123) & "."  ' Versicle character and a dot

Dim byt() As Byte
byt = str

Debug.Print byt(0), byt(1), byt(2), byt(3)  ' Prints: 35,33,46,0

End Sub

целое число

Dim Value As Integer

Целое число — это подписанный 16-битный тип данных. Он может хранить целые числа в диапазоне от -32,768 до 32,767, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

Целые числа хранятся в памяти как малозначные значения с отрицаниями, представленными как дополнение к двум .

Обратите внимание, что в целом лучше использовать Long, а не Integer, если меньший тип не является членом типа или не требуется (либо по API-вызову, либо по другой причине), чтобы быть 2 байтами. В большинстве случаев VBA обрабатывает целые числа как 32-битные внутри, поэтому обычно нет преимуществ при использовании меньшего типа. Кроме того, каждый раз, когда используется тип Integer, он выполняет штраф за производительность, поскольку он бесшумно применяется как Long.

Функция кастинга для преобразования в Integer — это CInt() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

логический

Dim Value As Boolean

Логическое значение используется для хранения значений, которые могут быть представлены как True или False. Внутренне тип данных сохраняется как 16-битное значение с 0, представляющим False, и любое другое значение, представляющее True.

Следует отметить, что когда Boolean применяется к числовому типу, все биты имеют значение 1. Это приводит к внутреннему представлению -1 для подписанных типов и максимальному значению для неподписанного типа (байт).

Dim Example As Boolean
Example = True
Debug.Print CInt(Example)  'Prints -1
Debug.Print CBool(42)      'Prints True
Debug.Print CByte(True)    'Prints 255

Функция кастинга для преобразования в булевское значение — CBool() . Несмотря на то, что он представлен внутренне как 16-битное число, отбрасывание в Boolean из значений вне этого диапазона безопасно от переполнения, хотя оно устанавливает все 16 бит в 1:

Dim Example As Boolean
Example = CBool(2 ^ 17)
Debug.Print CInt(Example)   'Prints -1
Debug.Print CByte(Example)  'Prints 255

Долго

Dim Value As Long

A Long — это подписанный 32-битный тип данных. Он может хранить целые числа в диапазоне от -2,147,483,648 до 2,147,483,647, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

Длинны хранятся в памяти как малозначные значения с отрицаниями, представленными как дополнение к двум .

Обратите внимание, что поскольку Long соответствует ширине указателя в 32-разрядной операционной системе, Longs обычно используются для хранения и передачи указателей на и из функций API.

Функция кастинга для преобразования в Long — CLng() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

не замужем

Dim Value As Single

A Single — это подписанный 32-битный тип данных с плавающей точкой. Он хранится внутренне с использованием малогабаритной схемы памяти IEEE 754 . Таким образом, не существует фиксированного диапазона значений, которые могут быть представлены типом данных. Ограничение — это точность сохраненного значения. Единица может хранить значения целочисленных значений в диапазоне от -16,777,216 до 16,777,216 без потери точности. Точность чисел с плавающей запятой зависит от экспоненты.

Единица будет переполняться при назначении значения, превышающего примерно 2 128 . Он не будет переполняться отрицательными показателями, хотя допустимая точность будет сомнительной до того, как будет достигнут верхний предел.

Как и во всех числах с плавающей запятой, следует соблюдать осторожность при проведении сравнений равенства. Лучшей практикой является включение значения дельта, соответствующего требуемой точности.

Функция кастинга для преобразования в Single — это CSng() .

двойной

Dim Value As Double

A Double — это подписанный 64-битный тип данных с плавающей точкой. Подобно Single , он хранится внутренне с использованием малогабаритной схемы памяти IEEE 754, и должны быть приняты те же меры предосторожности в отношении точности. Двойной объект может хранить целые значения в диапазоне от -9,007,199,254,740,992 до 9,007,199,254,740,992 без потери точности. Точность чисел с плавающей запятой зависит от экспоненты.

Двойной переполняется при назначении значения, превышающего примерно 2 1024 . Он не будет переполняться отрицательными показателями, хотя допустимая точность будет сомнительной до того, как будет достигнут верхний предел.

Функция кастинга для преобразования в Double — это CDbl() .

валюта

Dim Value As Currency

Валюта — это подписанный 64-битный тип данных с плавающей точкой, аналогичный Double , но масштабированный на 10 000, чтобы обеспечить большую точность для 4 цифр справа от десятичной точки. Переменная Currency может хранить значения от -922,337,203,685,477.5808 до 922,337,203,685,477.5807, предоставляя ей наибольшую емкость любого встроенного типа в 32-битном приложении. Как следует из названия типа данных, считается, что наилучшим образом использовать этот тип данных при представлении денежных расчетов, поскольку масштабирование помогает избежать ошибок округления.

Функция кастинга для преобразования в валюту — CCur() .

Дата

Dim Value As Date

Тип Даты представлен внутренне в качестве подписанного 64 бит с плавающей точкой типа данных со значением слева от десятичного представляющего количества дней с момента эпохи декабря 30 — го, 1899 (хотя см примечания ниже). Значение справа от десятичного знака представляет время как дробный день. Таким образом, целочисленная дата будет иметь временной компонент в 12:00:00 AM, а x.5 будет иметь временной компонент в 12:00:00 PM.

Допустимые значения Даты находятся между 1 января 100 года и 31 декабря 9999. й Поскольку двойной имеет больший диапазон, можно переполнять Дата путем присвоения значения вне этого диапазона.

Таким образом, его можно использовать взаимозаменяемо с расчетами Double for Date:

Dim MyDate As Double
MyDate = 0                                  'Epoch date.
Debug.Print Format$(MyDate, "yyyy-mm-dd")   'Prints 1899-12-30.
MyDate = MyDate + 365
Debug.Print Format$(MyDate, "yyyy-mm-dd")   'Prints 1900-12-30.

Функция кастинга для преобразования в дату — это CDate() , которая принимает любое числовое представление даты / времени с числовым типом. Важно отметить, что строковые представления дат будут преобразованы на основе текущей настройки локали, используемой, поэтому следует избегать прямых бросков, если код предназначен для переносимости.

строка

Строка представляет последовательность символов и поставляется в двух вариантах:

Переменная длина

Dim Value As String

Строка переменной длины позволяет добавлять и усекать и хранится в памяти как COM BSTR . Это состоит из 4-байтового беззнакового целого числа, которое хранит длину строки в байтах, за которой следуют строковые данные в виде широких символов (2 байта на символ) и заканчивается двумя нулевыми байтами. Таким образом, максимальная длина строки, которую может обрабатывать VBA, составляет 2 147 483 647 символов.

Внутренний указатель на структуру (восстанавливаемый StrPtr() ) указывает на расположение памяти данных , а не на префикс длины. Это означает, что VBA String может быть передана непосредственно API-функциям, которым требуется указатель на массив символов.

Поскольку длина может изменяться, VBA перераспределяет память для String каждый раз, когда назначается переменная , которая может налагать штрафы за производительность для процедур, которые изменяют их повторно.

Фиксированная длина

Dim Value As String * 1024    'Declares a fixed length string of 1024 characters.

Строки фиксированной длины выделяются по 2 байта для каждого символа и сохраняются в памяти как простой массив байтов. После выделения длина строки неизменна. Они не имеют нулевой конец в памяти, поэтому строка, заполняющая память, выделенную ненулевыми символами, непригодна для передачи функциям API, ожидающих нулевую завершаемую строку.

Строки фиксированной длины несут на себе устаревшее ограничение на 16 бит, поэтому длина может составлять до 65 535 символов. Попытка присвоить значение дольше, чем доступное пространство памяти, не приведет к ошибке выполнения — вместо этого результирующее значение будет просто усечено:

Dim Foobar As String * 5
Foobar = "Foo" & "bar"
Debug.Print Foobar          'Prints "Fooba"

Функция каста для преобразования в строку любого типа — CStr() .

Долго долго

Dim Value As LongLong

LongLong — это подписанный 64-битный тип данных и доступен только в 64-битных приложениях. Он не доступен в 32 — разрядных приложений , работающих на 64 — разрядных операционных системах. Он может хранить целые значения в диапазоне от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807, и попытка сохранить значение за пределами этого диапазона приведет к ошибке времени выполнения 6: переполнение.

LongLongs хранятся в памяти как малозначные значения с отрицаниями, представленными как дополнение к двум .

Тип данных LongLong был представлен как часть поддержки 64-битной операционной системы VBA. В 64-битных приложениях это значение может использоваться для хранения и передачи указателей на 64-битные API.

Функция литья для преобразования в LongLong — CLngLng() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5.

Вариант

Dim Value As Variant    'Explicit
Dim Value               'Implicit

A Variant — это тип данных COM, который используется для хранения и обмена значениями произвольных типов, а любой другой тип в VBA может быть назначен Variant. Переменные, объявленные без явного типа, указанные As [Type] умолчанию для варианта.

Варианты хранятся в памяти как структура VARIANT, которая состоит из дескриптора байтового типа ( VARTYPE ), за которым следуют 6 зарезервированных байтов, а затем 8-байтовая область данных. Для числовых типов (включая Date и Boolean) базовое значение сохраняется в самом Variant. Для всех других типов область данных содержит указатель на базовое значение.

введите описание изображения здесь

Основной тип Variant может быть определен с помощью функции VarType() которая возвращает числовое значение, хранящееся в дескрипторе типа, или функцию TypeName() которая возвращает строковое представление:

Dim Example As Variant
Example = 42
Debug.Print VarType(Example)    'Prints 2 (VT_I2)
Debug.Print TypeName(Example)   'Prints "Integer"
Example = "Some text"
Debug.Print VarType(Example)    'Prints 8 (VT_BSTR)
Debug.Print TypeName(Example)   'Prints "String"

Поскольку Variant может хранить значения любого типа, назначения из литералов без подсказок типа будут неявно отнесены к варианту соответствующего типа в соответствии с приведенной ниже таблицей. Литералы с типом намеков будут приведены к варианту намеченного типа.

Значение Результирующий тип
Строковые значения строка
Номера без плавающей запятой в диапазоне Integer целое число
Номера без плавающей запятой в дальнем расстоянии Долго
Номера без плавающей запятой вне дальнего расстояния двойной
Все числа с плавающей запятой двойной

Примечание. Если не существует конкретной причины использовать вариант (т.е. итератор в цикле For Each или требование API), тип обычно следует избегать для обычных задач по следующим причинам:

  • Они не безопасны для типов, что увеличивает вероятность ошибок во время выполнения. Например, вариант, содержащий значение Integer, беззвучно изменяет себя на Long, а не на переполнение.
  • Они вносят накладные расходы на обработку, требуя, по крайней мере, одного дополнительного разыменования указателя.
  • Требование к памяти для Variant всегда на 8 байт выше, чем требуется для хранения базового типа.

Функция кастинга для преобразования в вариант — это CVar() .

LongPtr

Dim Value As LongPtr

LongPtr был представлен в VBA для поддержки 64-битных платформ. В 32-битной системе он рассматривается как Long и на 64-битных системах, он рассматривается как LongLong .

Основное использование заключается в предоставлении переносного способа хранения и передачи указателей на обе архитектуры (см. Изменение поведения кода во время компиляции .

Хотя он обрабатывается операционной системой как адрес памяти при использовании в вызовах API, следует отметить, что VBA рассматривает его как подписанный тип (и, следовательно, подвержен неподписанному сигналу переполнения). По этой причине любая арифметика указателя, выполняемая с использованием LongPtrs, не должна использовать > или < сравнения. Этот «quirk» также позволяет добавлять простые смещения, указывающие на действительные адреса в памяти, может привести к ошибкам переполнения, поэтому следует соблюдать осторожность при работе с указателями в VBA.

Функция кастинга для преобразования в LongPtr — CLngPtr() . Для бросков из типов с плавающей точкой результат округляется до ближайшего целочисленного значения с округлением .5 (хотя, поскольку он обычно является адресом памяти, использование его в качестве целевой цели для расчета с плавающей точкой в ​​лучшем случае опасно).

Десятичный

Dim Value As Variant
Value = CDec(1.234)

'Set Value to the smallest possible Decimal value
Value = CDec("0.0000000000000000000000000001")

Тип данных Decimal доступен только в качестве CDec Variant , поэтому вы должны объявить любую переменную, которая должна содержать Decimal как Variant а затем назначить Decimal значение с CDec функции CDec . Ключевое слово Decimal является зарезервированным словом (которое предполагает, что VBA в конечном итоге будет добавлять поддержку первого класса для этого типа), поэтому Decimal нельзя использовать как имя переменной или процедуры.

Для типа Decimal требуется 14 байт памяти (в дополнение к байтам, которые требуются родительскому варианту), и может хранить номера до 28 знаков после запятой. Для чисел без знаков после запятой диапазон допустимых значений составляет -79,228,162,514,264,337,593,543,950,335 до +79,228,162,514,264,337,593,543,950,335 включительно. Для чисел с максимальным числом знаков в 28 знаков после запятой диапазон допустимых значений составляет -7.9228162514264337593543950335 по +7.9228162514264337593543950335 включительно.

Понравилась статья? Поделить с друзьями:
  • Vba excel длина строки length
  • Vba excel директория файла
  • Vba excel динамические массивы
  • Vba excel диапазон ячеек в массиве
  • Vba excel диапазон не пустых ячеек