Getting around the Max String size in a vba function?

前端 未结 6 1288
北海茫月
北海茫月 2020-11-28 15:57

The max number of characters you can use in string in a vba function is 255. I am trying to run this function

Var1= 1
Var2= 2
.
.
.
Var256 =256

RunMacros=          


        
相关标签:
6条回答
  • 2020-11-28 16:06

    This works and shows more than 255 characters in the message box.

    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
    

    The message box truncates the string to 1023 characters, but the string itself can be very large.

    I would also recommend that instead of using fixed variables names with numbers (e.g. Var1, Var2, Var3, ... Var255) that you use an array. This is much shorter declaration and easier to use - loops.

    Here's an example:

    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
    

    Updated this to show that a string can be longer than 255 characters and used in a subroutine/function as a parameter that way. This shows that the string length is 1443 characters. The actual limit in VBA is 2GB per string.

    Perhaps there is instead a problem with the API that you are using and that has a limit to the string (such as a fixed length string). The issue is not with VBA itself.

    Ok, I see the problem is specifically with the Application.OnTime method itself. It is behaving like Excel functions in that they only accept strings that are up to 255 characters in length. VBA procedures and functions though do not have this limit as I have shown. Perhaps then this limit is imposed for any built-in Excel object method.


    Update:
    changed ...longer than 256 characters... to ...longer than 255 characters...

    0 讨论(0)
  • 2020-11-28 16:08

    I may have missed something here, but why can't you just declare your string with the desired size? For example, in my VBA code I often use something like:

    Dim AString As String * 1024
    

    which provides for a 1k string. Obviously, you can use whatever declaration you like within the larger limits of Excel and available memory etc.

    This may be a little inefficient in some cases, and you will probably wish to use Trim(AString) like constructs to obviate any superfluous trailing blanks. Still, it easily exceeds 256 chars.

    0 讨论(0)
  • 2020-11-28 16:12

    Are you sure? This forum thread suggests it might be your watch window. Try outputting the string to a MsgBox, which can display a maximum of 1024 characters:

    MsgBox RunMacros
    
    0 讨论(0)
  • 2020-11-28 16:12

    Couldn't you just have another sub that acts as a caller using module level variable(s) for the arguments you want to pass. For example...

    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
    
    0 讨论(0)
  • 2020-11-28 16:24

    This test shows that the string in VBA can be at least 10^8 characters long. But if you change it to 10^9 you will fail.

    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
    

    So do not be mislead by Intermediate window editor or MsgBox output.

    0 讨论(0)
  • 2020-11-28 16:31

    Excel only shows 255 characters but in fact if more than 255 characters are saved, to see the complete string, consult it in the immediate window

    Press Crl + G and type ?RunWhat in the immediate window and press Enter

    0 讨论(0)
提交回复
热议问题