17

您可以在 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("really long string", A1:Z10, 1) 中尝试,然后将非常长的字符串放在该范围内的某个位置。vlookup 将失败(不是找不到它,但您实际上无法做到)

另外我知道子名称有一个最大长度,我就在它下面。对不起,它看起来如此丑陋。

更新 2:所以我刚刚将变量打印到一张纸上,并让 ontime 调用的函数从纸上读取它们。:(

4

6 回答 6

19

我可能在这里遗漏了一些东西,但你为什么不能用所需的大小声明你的字符串呢?例如,在我的 VBA 代码中,我经常使用如下内容:

Dim AString As String * 1024

它提供了一个 1k 的字符串。显然,您可以在 Excel 和可用内存等更大范围内使用您喜欢的任何声明。

在某些情况下,这可能有点低效,您可能希望使用类似 Trim(AString) 的构造来消除任何多余的尾随空格。尽管如此,它还是很容易超过 256 个字符。

于 2014-03-07T17:59:11.647 回答
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 个字符,但字符串本身可能非常大。

我还建议不要使用带有数字的固定变量名称(例如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 中的实际限制是每个字符串 2GB。

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

好的,我看到问题出在 Application.OnTime 方法本身。它的行为类似于 Excel 函数,因为它们只接受长度不超过 255 个字符的字符串。VBA 过程和函数虽然没有我所展示的这个限制。也许这个限制适用于任何内置的 Excel 对象方法。


更新
更改...longer than 256 characters......longer than 255 characters...

于 2010-04-04T17:07:24.363 回答
9

你确定吗?该论坛主题表明它可能是您的监视窗口。尝试将字符串输出到 MsgBox,最多可以显示 1024 个字符:

MsgBox RunMacros
于 2010-03-25T15:20:20.690 回答
3

这个测试表明,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 输出误导。

于 2017-11-03T12:27:46.037 回答
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
于 2018-07-05T17:03:57.170 回答
0

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

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

于 2018-12-14T17:56:01.003 回答