Обойти размер Max String в функции VBA? - PullRequest
17 голосов
/ 25 марта 2010

Максимальное количество символов, которое вы можете использовать в строке в функции 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: так что я только что напечатал переменную на листе и получил функцию, вызванную вовремя, чтобы прочитать их с листа. (

Ответы [ 6 ]

15 голосов
/ 04 апреля 2010

Это работает и показывает более 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). Это намного более короткое объявление и более простое в использовании - loop.

Вот пример:

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...

13 голосов
/ 07 марта 2014

Возможно, я что-то здесь упустил, но почему вы не можете просто объявить вашу строку с желаемым размером? Например, в моем коде VBA я часто использую что-то вроде:

Dim AString As String * 1024

, который предусматривает строку 1 КБ. Очевидно, что вы можете использовать любое объявление, которое вам нравится, в более широких пределах Excel и доступной памяти и т. Д.

В некоторых случаях это может быть немного неэффективно, и вы, вероятно, захотите использовать конструкции типа Trim (AString) для устранения любых лишних конечных пробелов. Тем не менее, он легко превышает 256 символов.

9 голосов
/ 25 марта 2010

Ты уверен? Эта ветка форума предполагает, что это может быть окно вашего просмотра. Попробуйте вывести строку в MsgBox, который может отображать не более 1024 символов:

MsgBox RunMacros
2 голосов
/ 03 ноября 2017

Этот тест показывает, что длина строки в 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.

0 голосов
/ 14 декабря 2018

Excel показывает только 255 символов, но на самом деле, если сохранено более 255 символов, чтобы просмотреть всю строку, обратитесь к ней в ближайшем окне

Нажмите Crl + G и введите ?RunWhat в ближайшем окне и нажмите Введите

0 голосов
/ 05 июля 2018

Не могли бы вы просто иметь другую подпрограмму, которая действует как вызывающая сторона, используя переменную (переменные) уровня модуля для аргументов, которые вы хотите передать. Например ...

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
...