在vba函数中绕过Max String大小?

时间:2010-03-25 15:12:18

标签: ontime excel-vba vba excel

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调用的函数以从工作表中读取它们。 :(

6 个答案:

答案 0 :(得分:15)

这样可以在消息框中显示超过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个字符,但字符串本身可能非常大。

我还建议您使用数组而不是使用带数字的固定变量名称(例如Var1Var2Var3,... 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的实际限制是每串2GB。

也许您正在使用的API存在问题,并且字符串有限制(例如固定长度字符串)。问题不在于VBA本身。

好的,我发现问题特别在于Application.OnTime方法本身。它的行为类似于Excel函数,因为它们只接受长度最多为255个字符的字符串。 VBA程序和功能虽然没有我所示的这个限制。也许这个限制是针对任何内置的Excel对象方法施加的。


<强>更新
...longer than 256 characters...更改为...longer than 255 characters...

答案 1 :(得分:13)

我可能在这里错过了一些东西,但为什么你不能只用你想要的大小声明你的字符串?例如,在我的VBA代码中,我经常使用类似的东西:

Dim AString As String * 1024

提供1k字符串。显然,您可以在更大的Excel限制和可用内存等中使用您喜欢的任何声明。

在某些情况下,这可能会有点低效,您可能希望使用Trim(AString)之类的构造来避免任何多余的尾随空白。不过,它很容易超过256个字符。

答案 2 :(得分:9)

你确定吗? This forum thread表明它可能是您的观察窗口。尝试将字符串输出到MsgBox,最多可显示1024个字符:

MsgBox RunMacros

答案 3 :(得分:2)

此测试显示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输出误导。

答案 4 :(得分:0)

您是否不能仅拥有另一个使用模块级变量作为要传递参数的调用方的子。例如...

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

答案 5 :(得分:0)

Excel仅显示255个字符,但实际上,如果保存的字符数超过255个,要查看完整的字符串,请在即时窗口中查询它

Crl + G 并在立即窗口中键入?RunWhat,然后按 Enter