web-dev-qa-db-fra.com

Contourner la taille de chaîne maximale dans une fonction vba?

Le nombre maximal de caractères que vous pouvez utiliser dans la chaîne d'une fonction vba est de 255. J'essaie d'exécuter cette fonction

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

Il exécute une procédure à un moment donné et lui transmet un ensemble de variables. mais la ficelle est trop longue.

Mise à jour: Malheureusement, je suis sûr que ce n'est pas la fenêtre de surveillance . En outre, ce n'est pas vraiment la taille maximale d'une chaîne que je traite. C'est la taille maximale de Une chaîne dans une fonction vba.

Par exemple, cette fonction fonctionne.

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

Mais si vous changez le 12 en 123 cela casse Exemple

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

Ce code ne fonctionne pas, je suis presque sûr que c'est parce qu'une fonction vba ne peut pas gérer une chaîne de plus de 255 caractères. Même si vous êtes dans Excel et que vous appelez une fonction et que vous lui attribuez une chaîne plus longue que 255 caractères, cela ne fonctionne pas. 

Essayez dans la cellule A1 = vlookup ("chaîne très longue", A1: Z10, 1), puis placez la chaîne très longue quelque part dans cette plage. Le vlookup va échouer (ne pas manquer de le trouver, mais vous ne pourrez pas le faire)

Aussi, je suis conscient qu'il y a une longueur maximale pour un sous-nom, je suis juste en dessous. Désolé que ça ait l'air si moche.

Mise à jour 2: je viens donc d’imprimer la variable sur une feuille et d’obtenir la fonction appelée par ontime pour la lire sur la feuille. :(

16
Ommit

Cela fonctionne et affiche plus de 255 caractères dans la boîte de message.

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

La boîte de message tronque la chaîne à 1023 caractères, mais la chaîne elle-même peut être très grande.

Je recommanderais également que, au lieu d'utiliser des noms de variables fixes avec des nombres (par exemple Var1, Var2, Var3, ... Var255), vous utilisiez un tableau. C'est une déclaration beaucoup plus courte et plus facile à utiliser - boucles.

Voici un exemple:

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

Mise à jour pour indiquer qu'une chaîne peut comporter plus de 255 caractères et être utilisée dans un sous-programme/fonction en tant que paramètre. Cela montre que la longueur de la chaîne est de 1443 caractères. La limite réelle en VBA est de 2 Go par chaîne.

Il existe peut-être un problème avec l'API que vous utilisez et qui limite la chaîne (telle qu'une chaîne de longueur fixe). Le problème n'est pas avec VBA lui-même.

Ok, je vois que le problème concerne spécifiquement la méthode Application.OnTime elle-même. Il se comporte comme les fonctions Excel en ce sens qu’elles acceptent uniquement les chaînes d’une longueur maximale de 255 caractères. Les procédures et fonctions de VBA n’ont cependant pas cette limite, comme je l’ai montré. Peut-être alors cette limite est-elle imposée pour toute méthode d'objet Excel intégrée.


Mettre à jour :
a changé ...longer than 256 characters... en ...longer than 255 characters...

14
Kevin Brock

J'ai peut-être manqué quelque chose ici, mais pourquoi ne pouvez-vous pas simplement déclarer votre chaîne avec la taille souhaitée? Par exemple, dans mon code VBA, j'utilise souvent quelque chose comme:

Dim AString As String * 1024

qui prévoit une chaîne de 1k. Évidemment, vous pouvez utiliser la déclaration de votre choix dans les limites plus larges d'Excel et de la mémoire disponible, etc.

Cela peut être un peu inefficace dans certains cas, et vous voudrez probablement utiliser Trim (AString) comme des constructions pour éviter les espaces superflus. Néanmoins, il dépasse facilement 256 caractères.

12
DrOli

Êtes-vous sûr? Ce fil de discussion suggère que cela pourrait être votre fenêtre de surveillance. Essayez d’afficher la chaîne dans une MsgBox, qui peut afficher un maximum de 1024 caractères:

MsgBox RunMacros
9
Prutswonder

Ce test montre que la chaîne dans VBA peut contenir au moins 10 ^ 8 caractères. Mais si vous le changez en 10 ^ 9, vous échouerez.

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

Donc, ne vous laissez pas induire en erreur par l'éditeur de fenêtre intermédiaire ou la sortie MsgBox.

1
Przemyslaw Remin

Excel ne montre que 255 caractères, mais si plus de 255 caractères sont enregistrés, consultez la chaîne complète dans la fenêtre immédiate.

Presse Crl + G et tapez ?RunWhat dans la fenêtre immédiate et appuyez sur Enter

0
Eduardo Recoder

Ne pourriez-vous pas simplement avoir un autre sous-traitant qui agit en tant qu'appelant en utilisant une ou plusieurs variables de niveau module pour les arguments à transmettre. Par exemple...

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
ArranSpencer