2011-10-10 31 views
32

này kịch bản đơn giản của tôi:Gọi một Sub trong VBA

Sub SomeOtherSub(Stattyp As String) 
     'Daty and the other variables are defined here 

     CatSubProduktAreakum(Stattyp, Daty + UBound(SubCategories) + 2) 

    End Sub 

    Sub CatSubProduktAreakum(Stattyp As String, starty As Integer) 

    'some stuff 

    End Sub 

Cuộc gọi của CatSubProduktAreakum được đánh dấu màu đỏ như là một "lỗi cú pháp". Tôi không hiểu lỗi. Nó là một cuộc gọi phụ giản đơn với hai đối số. Tại sao VBA không chấp nhận cuộc gọi?

Trả lời

60

Thử -

Call CatSubProduktAreakum(Stattyp, Daty + UBound(SubCategories) + 2) 

Đối với các lý do, điều này từ MSDN qua câu hỏi này - What does the Call keyword do in VB6?

Bạn không cần phải sử dụng từ khóa Gọi khi gọi một thủ tục. Tuy nhiên, nếu bạn sử dụng từ khóa Cuộc gọi để gọi thủ tục yêu cầu đối số , danh sách đối số phải được đặt trong dấu ngoặc đơn. Nếu bạn bỏ qua từ khóa Cuộc gọi, bạn cũng phải bỏ qua các dấu ngoặc đơn xung quanh danh sách đối số . Nếu bạn sử dụng Cú pháp cuộc gọi để gọi bất kỳ nội tại hoặc chức năng do người dùng xác định, thì giá trị trả lại của hàm sẽ bị hủy.

+1

Cảm ơn, điều đó dường như hoạt động. Nếu tôi gọi Sub-routine với chỉ một đối số (và định nghĩa nó chỉ với một đối số), thì tôi có thể gọi nó chỉ bằng tên của nó (và đối số trong ngoặc đơn). Tại sao nó không thể chỉ gọi một phụ với hai đối số? – reggie

+3

@reggie Bạn có thể gọi một phụ mà không cần Gọi miễn là bạn bỏ qua các dấu ngoặc đơn 'Mysub arg1, arg2, arg3' Tuy nhiên, bạn cần phải đọc trên ByVal và ByRef. – Fionnuala

+0

Tôi đã cập nhật câu trả lời với lời giải thích đầy đủ hơn. – ipr101

5

Đối với bất cứ ai vẫn đến bài này, tùy chọn khác là chỉ đơn giản là bỏ qua các dấu ngoặc đơn:

Sub SomeOtherSub(Stattyp As String) 
    'Daty and the other variables are defined here 

    CatSubProduktAreakum Stattyp, Daty + UBound(SubCategories) + 2 

End Sub 

Các Call từ khóa là chỉ thực sự trong VBA cho ngược khả năng xử lí và không thực sự cần thiết.

Nếu tuy nhiên, bạn quyết định sử dụng từ khóa Call, sau đó bạn phải thay đổi cú pháp cho phù hợp.

'// With Call 
Call Foo(Bar) 

'// Without Call 
Foo Bar 

Cả hai sẽ thực hiện chính xác điều tương tự.


đó đang được nói, có thể có trường hợp để xem ra cho nơi sử dụng dấu ngoặc đơn không cần thiết sẽ gây ra điều cần được đánh giá mà bạn không có ý định họ được (như dấu ngoặc đơn làm điều này trong VBA) như vậy với rằng trong nhớ lựa chọn tốt hơn có lẽ là bỏ qua từ khóa Call và dấu ngoặc đơn

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