2010-03-25 17 views
15

Le nombre maximum de caractères que vous pouvez utiliser dans la chaîne en fonction vba est 255. Je suis en train d'exécuter cette fonctionDébarrasser la taille maximale de la chaîne dans une fonction vba?

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 certain moment et passe un tas de variables à ce . mais la chaîne est trop longue.

Mise à jour: Malheureusement je suis sûr que ce n'est pas la fenêtre de la montre. En outre, ce n'est pas vraiment la taille maximale d'une chaîne que j'ai affaire. 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-123, il brise 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 sûr que c'est parce qu'une fonction vba ne peut pas gérer une chaîne avec plus de 255 caractères. Même si vous êtes dans Excel et appelez une fonction et lui donner une chaîne plus longue que 255 caractères cela ne fonctionne pas. Essayez dans la cellule A1 = vlookup ("string vraiment long", A1: Z10, 1) puis placez la très longue chaîne quelque part dans cette plage. Le vlookup échouera (ne manque pas de le trouver, mais vous ne serez pas en mesure de le faire)

Aussi je suis conscient qu'il y a une longueur maximale à un sous-nom, je suis juste en dessous. Désolé que cela semble si laid.

Mise à jour 2: alors j'ai fini d'imprimer la variable sur une feuille et d'appeler la fonction appelée par ontime pour la lire sur la feuille. :(

+3

[De Joel Spolsky] (http://www.joelonsoftware.com/articles/fog0000000319.html) (qui a dirigé une grande partie du développement d'Excel au début): «Excel utilise les chaînes Pascal en interne, ce qui explique pourquoi les cordes dans de nombreux endroits dans Excel est limité à 255 octets, et c'est aussi l'une des raisons pour lesquelles Excel est incroyablement rapide. " Cela s'applique probablement au problème VLookup que vous mentionnez, bien que, comme d'autres l'ont indiqué, VBA n'a pas cette limite. – mwolfe02

+3

Vous pouvez utiliser un 'String (number_of_repeats, char_to_repeat)' pour faire une chaîne à la volée au lieu de 'aaaaaaaaaaaaaaaaaaaaaaaaaaa ...' –

Répondre

10

Cela fonctionne et montre 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 recommande également d'utiliser des noms de variables fixes avec des nombres (par ex. Var1, Var2, Var3, ... Var255) que vous utilisez un tableau. C'est une déclaration beaucoup plus courte et plus facile à utiliser - des 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 cela pour montrer qu'une chaîne peut être plus de 255 caractères et utilisés dans un sous-programme/fonction comme paramètre de cette façon. Cela montre que la longueur de la chaîne est de 1443 caractères. La limite réelle dans VBA est de 2 Go par chaîne.

Il existe peut-être un problème avec l'API que vous utilisez et qui a une 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 est spécifiquement avec la méthode Application.OnTime elle-même. Il se comporte comme les fonctions Excel en ce sens qu'il n'accepte que les chaînes d'une longueur maximale de 255 caractères. Les procédures et les fonctions VBA n'ont cependant pas cette limite comme je l'ai montré. Peut-être que cette limite est imposée pour toute méthode d'objet Excel intégrée.


Mise à jour:
changé ...longer than 256 characters...-...longer than 255 characters...

+1

Merci pour la réponse. Vous avez raison. Les fonctions dans vba peuvent gérer des chaînes jusqu'à 2 Go! Merci. Mais comme vous avez réalisé mon vrai problème est avec la méthode Application.OnTime se comporter comme une fonction Exel, en ce sens qu'il ne peut gérer qu'une chaîne de taille 255. Je suppose que je devrais juste accepter que je vais devoir travailler avec cette limitation? J'espérais qu'il y avait un moyen de contourner cela. – Ommit

9

Etes-vous sûr This forum thread suggère qu'il pourrait être la fenêtre de votre montre Essayez la sortie de la chaîne à un MsgBox, qui peut afficher un maximum de 1024 caractères:.

MsgBox RunMacros 
+3

255 objets/caractères est le maximum pour la fenêtre de surveillance. J'ai rencontré le même problème avec un objet de collection dans le passé. – Fink

+0

Pas de dés. ce n'est pas la fenêtre de la montre. L'erreur est avec la fonction ontime. Voir mise à jour. Merci pour le commentaire si – Ommit

10

j'ai raté quelque chose, mais pourquoi ne peut vous déclarer que votre chaîne avec la taille désirée? Par exemple, dans mon code VBA, j'utilise souvent quelque chose comme:

Dim AString As String * 1024 

qui fournit une chaîne de 1k. De toute évidence, vous pouvez utiliser n'importe quelle déclaration dans les limites plus grandes d'Excel et de la mémoire disponible.

Ceci peut être un peu inefficace dans certains cas, et vous voudrez probablement utiliser des constructions semblables à Trim (AString) pour éviter tout ébauches de traînage superflues. Pourtant, il dépasse facilement 256 caractères.

1

Ce test montre que la chaîne dans VBA peut avoir une longueur d'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 

Ne vous laissez donc pas tromper par l'éditeur de fenêtre intermédiaire ou la sortie MsgBox.

+0

Je peux confirmer que la fenêtre Watches va tronquer l'affichage d'une variable chaîne à 252 caractères, tandis que l'utilisation de la fenêtre Exécution (avec Debug.Print myvariable) affichera> 252 caractères. Bien que le problème du PO puisse ne pas être lié à la fenêtre Montres, cette troncature m'a fait perdre beaucoup de temps (ainsi que d'atterrir ici!), Alors j'ai pensé que je me ferais remarquer. Tronquer un var comme ceci peut dérouter quelqu'un à VBA et cela peut impliquer le problème est ailleurs où c'est vraiment une bizarrerie de l'interface utilisateur Watches. –