2010-03-25 26 views
15

Số tối đa của nhân vật bạn có thể sử dụng trong chuỗi trong một hàm VBA là 255. Tôi cố gắng để chạy chức năng nàyBắt xung quanh kích thước chuỗi tối đa trong một hàm 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 

Nó chạy một thủ tục tại một thời điểm nhất định và vượt qua một loạt các biến để nó . nhưng chuỗi quá dài.

Cập nhật: Đáng tiếc là tôi chắc chắn đó không phải là cửa sổ xem. Ngoài ra, nó không thực sự là kích thước tối đa của một chuỗi mà tôi đang xử lý. Đó là kích thước tối đa của một chuỗi trong hàm vba.

Ví dụ: chức năng này hoạt động.

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 

Nhưng nếu bạn thay đổi 12-123 nó phá vỡ Ví dụ

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 

Mã này không làm việc, tôi khá chắc chắn đó là vì một hàm VBA không thể xử lý một chuỗi với hơn 255 chars. Ngay cả khi bạn đang ở trong Excel và gọi một hàm và cho nó một chuỗi dài hơn 255 ký tự nó không hoạt động.

Hãy thử trong ô A1 = vlookup ("chuỗi dài thực sự", A1: Z10, 1) và sau đó đặt chuỗi dài thực sự ở đâu đó trong phạm vi đó. Các vlookup sẽ thất bại (không tìm thấy nó, nhưng bạn sẽ không thực sự có thể làm điều đó)

Ngoài ra tôi biết rằng có một chiều dài tối đa cho một tên phụ, tôi chỉ dưới nó. Xin lỗi vì nó trông rất xấu xí.

Cập nhật 2: vì vậy tôi vừa kết thúc in biến đó thành một trang tính và nhận hàm được gọi là ontime để đọc chúng khỏi trang tính. :(

+3

[Từ Joel Spolsky] (http://www.joelonsoftware.com/articles/fog0000000319.html) (người đã dẫn đầu nhiều phát triển Excel ban đầu): "Excel sử dụng chuỗi Pascal nội bộ, đó là lý do tại sao chuỗi ở nhiều vị trí trong Excel được giới hạn ở 255 byte, và nó cũng là một lý do Excel rất nhanh. " Điều đó có thể áp dụng cho vấn đề VLookup mà bạn đề cập, mặc dù những người khác đã nói, VBA không có giới hạn như vậy. – mwolfe02

+3

Bạn có thể sử dụng 'Chuỗi (number_of_repeats, char_to_repeat)' để tạo chuỗi thay vì 'aaaaaaaaaaaaaaaaaaaaaaaaaaa ...' –

Trả lời

10

này hoạt động và cho thấy hơn 255 ký tự trong hộp tin nhắn.

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 

hộp nhắn truncates chuỗi đến 1023 ký tự, nhưng chuỗi chính nó có thể rất lớn.

Tôi cũng khuyên bạn nên thay vì sử dụng tên biến cố định có số (ví dụ: Var1, Var2, Var3, ... Var255) mà bạn sử dụng một mảng. Đây là tuyên bố ngắn hơn nhiều và dễ sử dụng hơn - vòng lặp.

Dưới đây là một ví dụ:

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 

cập nhật này để chứng minh rằng một chuỗi thể dài hơn 255 ký tự và sử dụng trong một chương trình con/chức năng như một tham số như vậy. Điều này cho thấy độ dài chuỗi là 1443 ký tự. Giới hạn thực tế trong VBA là 2GB cho mỗi chuỗi.

Có thể có vấn đề với API mà bạn đang sử dụng và có giới hạn đối với chuỗi (chẳng hạn như chuỗi có độ dài cố định). Vấn đề không phải là với chính VBA.

Ok, tôi thấy vấn đề là cụ thể với chính phương pháp Application.OnTime. Nó hoạt động như các hàm Excel ở chỗ chúng chỉ chấp nhận các chuỗi có độ dài tối đa 255 ký tự. Các thủ tục và hàm VBA mặc dù không có giới hạn này như tôi đã chỉ ra. Có lẽ sau đó giới hạn này được áp dụng cho bất kỳ phương thức đối tượng Excel tích hợp nào.


Cập nhật:
thay đổi ...longer than 256 characters...-...longer than 255 characters...

+1

Cảm ơn bạn đã trả lời. Bạn nói đúng. Chức năng trong vba có thể xử lý chuỗi lên đến 2 GB! cảm ơn. Nhưng khi bạn nhận ra vấn đề thực sự của tôi là với phương pháp Application.OnTime hoạt động như một hàm Exel, ở chỗ nó chỉ có thể xử lý một chuỗi có kích thước 255. Tôi đoán tôi nên chấp nhận rằng tôi sẽ phải làm việc với giới hạn này? Tôi đã hy vọng có một số cách xung quanh nó. – Ommit

9

Bạn có chắc chắn This forum thread cho thấy nó có thể là cửa sổ đồng hồ của bạn Hãy thử outputting chuỗi để một MsgBox, có thể hiển thị tối đa 1024 ký tự:?.

MsgBox RunMacros 
+3

255 đối tượng/ký tự là số tối đa cho cửa sổ xem. Tôi chạy vào cùng một vấn đề với một Object Collection trong quá khứ. – Fink

+0

Không có súc sắc. nó không phải là cửa sổ xem. Lỗi là với hàm ontime. Xem cập nhật. Cảm ơn nhận xét mặc dù – Ommit

10

tôi có thể đã bỏ lỡ một cái gì đó ở đây, nhưng tại sao không thể bạn chỉ cần khai báo chuỗi của bạn với kích thước mong muốn? Ví dụ: trong mã VBA của tôi, tôi thường sử dụng một cái gì đó như:

Dim AString As String * 1024 

cung cấp chuỗi 1k. Rõ ràng, bạn có thể sử dụng bất kỳ khai báo nào bạn thích trong các giới hạn lớn hơn của Excel và bộ nhớ có sẵn, vv ..

Điều này có thể không hiệu quả trong một số trường hợp và bạn có thể muốn sử dụng Trim (AString) như cấu trúc để xóa bất kỳ những khoảng trống phía sau thừa. Tuy nhiên, nó dễ dàng vượt quá 256 ký tự.

1

Thử nghiệm này cho thấy chuỗi trong VBA có thể dài ít nhất 10^8 ký tự. Nhưng nếu bạn thay đổi nó thành 10^9 bạn sẽ thất bại.

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 

Vì vậy, không được gây hiểu lầm bởi trình chỉnh sửa cửa sổ trung gian hoặc đầu ra MsgBox.

+0

Tôi có thể xác nhận rằng cửa sổ Đồng hồ sẽ cắt bớt hiển thị biến chuỗi tại 252 ký tự, trong khi sử dụng cửa sổ Ngay lập tức (với Debug.Print myvariable) sẽ hiển thị> 252 ký tự. Mặc dù vấn đề của OP có thể không liên quan đến cửa sổ Đồng hồ, sự cắt xén này đã khiến tôi rơi xuống một con đường của nhiều nỗ lực lãng phí (cũng như hạ cánh ở đây!) Nên tôi nghĩ tôi sẽ kêu vang. Việc cắt xén như thế này có thể gây nhầm lẫn cho người mới để VBA và nó có thể ngụ ý vấn đề là ở nơi khác, nơi nó thực sự là một quirk của giao diện người dùng đồng hồ. –

Các vấn đề liên quan