Bạn có thể sử dụng ngăn xếp lớp trong System.Collections, như bạn có thể sử dụng Queue và những người khác. Chỉ cần tìm kiếm vb.net stack cho tài liệu. Tôi đã không thử tất cả các phương pháp (ví dụ: Getenumerator - Tôi không biết làm thế nào để sử dụng một iterator, nếu có thể trong VBA). Sử dụng một chồng hoặc một hàng đợi cung cấp cho bạn một số lợi ích tốt đẹp, thường không dễ dàng như vậy trong VBA. Bạn có thể sử dụng
anArray = myStack.ToArray
NGAY CẢ nếu ngăn xếp trống (Trả về mảng có kích thước từ 0 đến -1).
Sử dụng Đối tượng bộ sưu tập tùy chỉnh, nó hoạt động rất nhanh do tính đơn giản của nó và có thể dễ dàng được viết lại (ví dụ: chỉ xử lý chênh lệch được nhập mạnh mẽ). Bạn có thể muốn thực hiện kiểm tra cho ngăn xếp trống. Nếu bạn cố gắng sử dụng Pop trên một ngăn xếp trống, VBA sẽ không xử lý nó một cách duyên dáng, như tất cả các đối tượng null.Tôi thấy hợp lý hơn khi sử dụng:
If myStack.Count > 0 Then
từ chức năng sử dụng ngăn xếp, thay vì nướng vào clsStack.Pop. Nếu bạn nướng nó vào lớp, một cuộc gọi đến Pop có thể trả lại một giá trị của loại đã chọn - tất nhiên bạn có thể sử dụng điều này để xử lý các giá trị rỗng, nhưng bạn nhận được nhiều đau buồn hơn theo cách đó.
Một ví dụ về sử dụng:
Private Sub TestStack()
Dim i as long
Dim myStack as clsStack
Set myStack = New clsStack
For i = 1 to 2
myStack.Push i
Next
For i = 1 to 3
If myStack.Count > 0 Then
Debug.Print myStack.Pop
Else
Debug.Print "Stack is empty"
End If
Next
Set myStack = Nothing
End Sub
Sử dụng một LIFO-stack có thể cực kỳ hữu ích!
Lớp clsStack
Dim pStack as Object
Private Sub Class_Initialize()
set pStack = CreateObject("System.Collections.Stack")
End Sub
Public Function Push(Value as Variant)
pStack.Push Value
End Function
Public Function Pop() As Variant
Pop = pStack.Pop
End Function
Public Function Count() as long
Count = pstack.Count
End Function
Public Function ToArray() As Variant()
ToArray = pStack.ToArray()
End Function
Public Function GetHashCode() As Integer
GetHashCode = pStack.GetHashCode
End Function
Public Function Clear()
pStack.Clear
End Function
Private Sub Class_terminate()
If (Not pStack Is Nothing) Then
pStack.Clear
End If
Set pStack = Nothing
End Sub
Nguồn
2016-06-08 13:45:17
Chào mừng bạn đến stackoverflow! 1 để cung cấp một số mã và hiển thị cách đơn giản này có thể được. Một vài cảnh báo: 1) Sử dụng '=' để trả về một giá trị trong các thói quen 'Push' và 'Pop' của bạn sẽ thất bại khi các đối tượng liên quan vì cú pháp VBA 'Set' gây phiền nhiễu. Xem phần cuối của câu trả lời này: http://stackoverflow.com/questions/4716382/excel-select-case/4719706#4719706 2) Lưu ý rằng việc lập chỉ mục vào Bộ sưu tập là O (n) trong thời gian. Xem http://stackoverflow.com/questions/4827963/what-is-the-difference-between-the-time-complexity-of-these-two-ways-of-using-loo/4830157#4830157 – jtolle