Подтвердить что ты не робот

Обход размера 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, чтобы прочитать их с листа.: (

4b9b3361

Ответ 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 символов, но сама строка может быть длиннее.