2010-03-25 12 views
15

maksymalna liczba znaków, które można wykorzystać w ciągu znaków w funkcji VBA 255. próbuję uruchomić tę funkcjęUzyskiwanie rozmiaru Max String w funkcji 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 

uruchamia procedurę w określonym czasie i przechodzi kilka zmiennych do niego . ale ciąg jest za długi.

Aktualizacja: Niestety jestem pewien, że to nie jest okno zegarka. Nie jest to tak naprawdę maksymalny rozmiar napisu, z którym mam do czynienia. Jest to maksymalny rozmiar ciąg w funkcji vba.

Na przykład ta funkcja działa.

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 

Ale jeśli zmienisz 12 do 123 łamie Przykład

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 

Ten kod nie działa, jestem prawie pewien, że to dlatego, że funkcja VBA nie może obsłużyć ciąg z ponad 255 znaki. Nawet jeśli używasz programu Excel i wywołujesz funkcję i dodajesz jej ciąg dłuższy niż 255 znaków, to nie działa.

Spróbuj w komórce A1 = widok ("naprawdę długi ciąg", A1: Z10, 1), a następnie umieść naprawdę długi ciąg gdzieś w tym zakresie. Wada zakończy się niepowodzeniem (nie uda się go znaleźć, ale faktycznie nie będziesz w stanie tego zrobić)

Mam również świadomość, że maksymalna długość subskrypcji jest podana. Przepraszam, że wygląda tak brzydko.

Aktualizacja 2: skończyłem drukowanie zmiennej na arkuszu i otrzymanie funkcji wywoływanej przez ontime, aby odczytać je z arkusza. :(

+3

[Od Joel Spolsky] (http://www.joelonsoftware.com/articles/fog0000000319.html) (który prowadził wiele wczesnych opracowań Excela): "Excel używa wewnętrznie ciągów Pascal, dlatego ciągi znaków w wielu miejscach w Excel jest ograniczony do 255 bajtów i jest to również jeden z powodów, dla których Excel jest niesamowicie szybki. " Prawdopodobnie odnosi się to do kwestii VLookup, o której wspomniałeś, chociaż, jak stwierdzili inni, VBA nie ma takiego limitu. – mwolfe02

+3

Możesz użyć 'String (number_of_repeats, char_to_repeat)' aby stworzyć ciąg w locie zamiast 'aaaaaaaaaaaaaaaaaaaaaaaa ...' –

Odpowiedz

10

To działa i pokazuje więcej niż 255 znaków w oknie komunikatu.

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 

okno komunikatu obcina ciąg do 1023 znaków, ale sam ciąg może być bardzo duży.

Polecam również, aby zamiast używać stałych nazw zmiennych z liczbami (np. Var1, Var2, Var3, ... Var255), którego używasz. Jest to znacznie krótsza deklaracja i łatwiejsza w użyciu - pętle.

Oto przykład:

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 

Zaktualizowany to, aby pokazać, że ciąg może być dłuższy niż 255 znaków i używane w podprogramie/funkcji jako parametr ten sposób. Pokazuje to, że długość łańcucha wynosi 1443 znaki. Rzeczywisty limit w VBA to 2 GB na ciąg.

Być może istnieje problem z interfejsem API, którego używasz i który ma ograniczenie dla ciągu znaków (np. Ciąg o stałej długości). Problem nie dotyczy samego VBA.

OK, widzę, że problem dotyczy konkretnie samej metody Application.OnTime. Zachowuje się jak funkcje programu Excel, ponieważ akceptuje tylko ciągi o długości do 255 znaków. Procedury i funkcje VBA nie mają tego limitu, jak pokazałem. Być może wtedy ten limit zostanie nałożony na dowolną wbudowaną metodę obiektu Excel.


Aktualizacja:
zmienił ...longer than 256 characters... do ...longer than 255 characters...

+1

Dzięki za odpowiedź. Masz rację. Funkcje vba mogą obsługiwać ciągi o rozmiarze do 2 GB! dzięki. Ale jak zrozumiałeś, moim prawdziwym problemem jest to, że metoda Application.OnTime zachowuje się jak funkcja Exel, ponieważ obsługuje tylko ciąg o rozmiarze 255. Chyba powinienem zaakceptować, że będę musiał pracować z to ograniczenie? Miałem nadzieję, że jest jakiś sposób obejścia tego. – Ommit

9

Czy na pewno This forum thread sugeruje to może być Twoje okno watch Spróbuj wyprowadzania ciąg do MsgBox, który może wyświetlać maksymalnie 1024 znaków:?.

MsgBox RunMacros 
+3

255 obiektów/znaków jest maksimum dla okna zegarka. Wpadłem na ten sam problem z/w Object Collection w przeszłości. – Fink

+0

Bez kości. to nie jest okno zegarka. Błąd jest związany z funkcją ontime. Zobacz aktualizację. Dzięki za komentarz, ale – Ommit

10

mogę coś przeoczyć tutaj, ale dlaczego nie można po prostu zadeklarować swój ciąg z pożądanym rozmiarze? Na przykład w moim kodzie VBA często używam czegoś takiego:

Dim AString As String * 1024 

, który zapewnia ciąg 1k. Oczywiście możesz użyć dowolnej deklaracji, którą lubisz w szerszym zakresie Excela i dostępnej pamięci itd.

Może to być trochę nieefektywne w niektórych przypadkach i prawdopodobnie będziesz chciał użyć konstrukcji Trim (AString), aby uniknąć zbyteczne spacje końcowe. Mimo to łatwo przekracza 256 znaków.

1

Ten test pokazuje, że ciąg w języku VBA może mieć co najmniej 10^8 znaków. Ale jeśli zmienisz go na 10^9, to ci się nie uda.

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 

Nie należy wprowadzać w błąd przez pośredni edytor okien lub wyjście MsgBox.

+0

Mogę potwierdzić, że okno Watches spowoduje obcięcie wyświetlania zmiennej łańcuchowej przy 252 znakach, podczas gdy użycie okna Natychmiastowego (z moją myśliwą Debug.Print) wyświetli> 252 znaków. Mimo że problem OP może nie mieć związku z oknem Zegarki, to przycięcie wysłało mi ścieżkę dużo zmarnowanego wysiłku (jak również lądowanie tutaj!), Więc pomyślałem, że zadzwonię. Obcięcie takiego var może być mylące dla kogoś nowego do VBA i może sugerować, że problem jest gdzie indziej, gdzie jest to naprawdę dziwactwo interfejsu użytkownika zegarków. –

Powiązane problemy