Обход размера Max String в функции vba?
Максимальное количество символов, которые вы можете использовать в строке в функции vba, равно 255.
Я пытаюсь запустить эту функцию
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
Он выполняет процедуру в определенное время и передает ей кучу переменных. но строка слишком длинная.
Обновление:
К сожалению, я уверен, что это не окно часов.
Кроме того, это не максимальный размер строки, с которой я имею дело. Это максимальный размер
строка в функции vba.
Например, эта функция работает.
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
Но если вы меняете 12 на 123, это ломается
Пример
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
Этот код не работает, я уверен, потому что функция vba не может обрабатывать строку с более чем 255 символами.
Даже если вы находитесь в Excel и вызываете функцию и даете ей строку длиной до 255 символов, она не работает.
Попробуйте в ячейке A1 = vlookup ( "действительно длинная строка", A1: Z10, 1), а затем поместите действительно длинную строку где-нибудь в этом диапазоне. Vlookup не удастся (не получить его, но вы на самом деле не сможете это сделать)
Также я знаю, что есть максимальная длина для подзаголовка, я просто под ним. Извините, что это выглядит так уродливо.
Обновление 2: так что я просто печатал переменную на листе и получал функцию, вызванную ontime, чтобы прочитать их с листа.: (
Ответы
Ответ 1
Это работает и показывает более 255 символов в окне сообщения.
Sub TestStrLength()
Dim s As String
Dim i As Integer
s = ""
For i = 1 To 500
s = s & "1234567890"
Next i
MsgBox s
End Sub
Окно сообщения усекает строку до 1023 символов, но сама строка может быть очень большой.
Я также рекомендовал бы вместо массива имен фиксированных переменных с номерами (например, Var1
, Var2
, Var3
,... Var255
). Это намного более короткое объявление и проще в использовании - циклы.
Вот пример:
Sub StrArray()
Dim var(256) As Integer
Dim i As Integer
Dim s As String
For i = 1 To 256
var(i) = i
Next i
s = "Tims_pet_Robot"
For i = 1 To 256
s = s & " """ & var(i) & """"
Next i
SecondSub (s)
End Sub
Sub SecondSub(s As String)
MsgBox "String length = " & Len(s)
End Sub
Обновил это, чтобы показать, что строка может быть длиннее 255 символов и использоваться таким образом в подпрограмме/функции в качестве параметра. Это показывает, что длина строки составляет 1443 символа. Фактическое ограничение в VBA составляет 2 ГБ на строку.
Возможно, вместо этого есть проблема с API, который вы используете и который имеет ограничение на строку (например, строка фиксированной длины). Проблема не в самом VBA.
Хорошо, я вижу, что проблема именно с самим методом Application.OnTime. Он ведет себя как функции Excel в том смысле, что он принимает только строки длиной до 255 символов. Процедуры и функции VBA, хотя и не имеют этого ограничения, как я показал. Возможно, тогда это ограничение накладывается на любой встроенный объектный метод Excel.
Обновление:
изменено ...longer than 256 characters...
на ...longer than 255 characters...
Ответ 2
Возможно, я что-то пропустил, но почему вы не можете просто объявить свою строку нужного размера? Например, в моем коде VBA я часто использую что-то вроде:
Dim AString As String * 1024
который обеспечивает строку 1k. Очевидно, что вы можете использовать любое объявление, которое вам нравится, в больших пределах Excel и доступной памяти и т.д.
В некоторых случаях это может быть немного неэффективным, и вы, вероятно, захотите использовать конструкторы Trim (AString), чтобы устранить любые лишние завершающие пробелы. Тем не менее, он легко превышает 256 символов.
Ответ 3
Вы уверены? Эта тема форума предполагает, что это может быть ваше окно с часами. Попробуйте вывести строку в MsgBox, которая может отображать максимум 1024 символа:
MsgBox RunMacros
Ответ 4
Этот тест показывает, что строка в VBA может иметь длину не менее 10 ^ 8 символов. Но если вы измените его на 10 ^ 9, вы потерпите неудачу.
Sub TestForStringLengthVBA()
Dim text As String
text = Space(10 ^ 8) & "Hello world"
Debug.Print Len(text)
text = Right(text, 5)
Debug.Print text
End Sub
Поэтому не вводите в заблуждение редактор промежуточного окна или вывод MsgBox.
Ответ 5
Не могли бы вы просто иметь другую подпрограмму, которая действует как вызывающая сторона, используя переменные уровня модуля для аргументов, которые вы хотите передать. Например...
Option Explicit
Public strMsg As String
Sub Scheduler()
strMsg = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
Application.OnTime Now + TimeValue("00:00:01"), "'Caller'"
End Sub
Sub Caller()
Call aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa("It Works! " & strMsg)
End Sub
Sub aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(strMessage As String)
MsgBox strMessage
End Sub
Ответ 6
Excel показывает только 255 символов, но на самом деле, если сохранено более 255 символов, чтобы увидеть всю строку, обратитесь к ней в ближайшем окне
Нажмите Crl + G и введите ?RunWhat
в ближайшем окне и нажмите Enter
Ответ 7
Спасибо за обсуждение. Это помогло мне понять, что MsgBox усекает строку до 255 символов, но сама строка может быть длиннее.