2010-07-14 37 views
32

Tôi đang cố gắng để có được một đánh giá lười biếng với 'Và' trong Excel macro của tôi bằng cách làm như sau:AndAlso/OrElse trong VBA

If Not myObject Is Nothing *And* myObject.test() Then 
    'do something' 
Else 
    'do something else' 
End If 

tôi biết đánh giá lười biếng tồn tại trong VB.NET như AndAlsoOrElse nhưng không thể tìm thấy bất cứ điều gì tương tự trong VBA. Nếu đánh giá lười biếng không tồn tại trong VBA, cách tốt nhất để cấu trúc mã để nó sẽ đánh giá cách tôi mong đợi là gì?

+6

VBA như VB6 đơn giản không có đánh giá ngắn mạch –

+0

Cảm ơn, tôi đã giải quyết được sự cố của mình mà không cần giải pháp nhưng tôi vẫn tò mò muốn làm gì cho tình huống này. Tôi sẽ không ngạc nhiên nếu tôi thiếu một cái gì đó thực sự rõ ràng nhưng tôi không thể tìm thấy một cách tốt để làm điều này mà không cần viết lại mã, tức là có cùng một mã trong hai trường hợp khác nhau khác nhau. – Luis

Trả lời

42

Chỉ ngắn mạch (của một sắp xếp) là trong vòng Case đánh giá biểu thức, do đó, tuyên bố vô lý sau đây làm những gì tôi nghĩ rằng bạn đang yêu cầu;

Select Case True 
    Case (myObject Is Nothing), Not myObject.test() 
     MsgBox "no instance or test == false" 
    Case Else 
     MsgBox "got instance & test == true" 
    End Select 
End Sub 
-1
If Not myObject Is Nothing Then 
    If myObject.test() Then 
     'do something' 
    End If 
Else 
    'do something else' 
End If 

Tôi nghĩ đó là cách bạn phải làm.

Sửa

Có lẽ như thế này

Dim bTestsFailed as Boolean 
bTestsFailed = False 

If Not myObject Is Nothing Then 
    If myObject.test() Then 
     'do something' 
    Else 
     bTestsFailed = True 
    End If 
Else 
    bTestsFailed = True 
End If 

If bTestsFailed Then 
    'do something else 
End If 

Không phải là VBA tuyệt vời?

+0

Tôi nghĩ rằng anh ta muốn có điều kiện khác cũng thực thi nếu myObject là Không có gì, có nghĩa là bạn phải nhân đôi 'Khác' làm điều gì đó khác''. – BenV

+0

@BenV, @Dick Tôi đã tự do chỉnh sửa câu trả lời cho (tôi tin) mã chính xác. Tôi đồng ý với BenV – MarkJ

+0

@MarkJ: Tôi nghĩ anh ấy cũng muốn 'cái gì khác' xảy ra nếu myObject không phải là Không có gì nhưng' myObject.test() 'trả về Sai. – BenV

2

Hoặc bạn có thể tạo hàm lấy đối tượng làm tham số và trả về giá trị logic cho cả hai trường hợp. Đó là những gì tôi thường làm.

ví dụ:

if Proceed(objMyAwesomeObject) then 
     'do some really neat stuff here 
else 
     'do something else, eh 
end if 
... 
end sub 

private function Proceed(objMyAwesomeObject as Object) 
    if not objMyAweseomeObject is nothing then 
      Proceed = true 
    elseif objMyAwesomeObject.SomeProperty = SomeValue then 
      Proceed = true 
    else 
      Proceed = false 
    endif 
end function 
+0

Tôi không nghĩ rằng điều này sẽ làm việc. Nếu 'Not objMyAwesomeObject Is Nothing' đánh giá thành' True', thì câu lệnh 'ElseIf' đầu tiên sẽ không bao giờ thực thi. Tuy nhiên, nếu 'Không objMyAwesomeObject là Nothing' = False (' objMyAwesomeObject Is Nothing' = True), thì câu lệnh 'ElseIf' đầu tiên sẽ thực hiện và sẽ gây ra lỗi vì bạn đang cố truy cập thuộc tính trên' objMyAwesomeObject' mà ' Không là gì cả. – neizan

9

Đây là một câu hỏi cũ, nhưng vấn đề này vẫn còn sống và khỏe mạnh. Một cách giải quyết khác mà tôi đã sử dụng:

Dim success As Boolean  ' False by default. 

If myObj Is Nothing Then  ' Object is nothing, success = False already, do nothing. 
ElseIf Not myObj.test() Then ' Test failed, success = False already, do nothing. 
Else: success = True   ' Object is not nothing and test passed. 
End If 

If success Then 
    ' Do stuff... 
Else 
    ' Do other stuff... 
End If 

Điều này về cơ bản sẽ đảo ngược logic trong câu hỏi ban đầu, nhưng bạn nhận được kết quả tương tự. Tôi nghĩ rằng đó là một giải pháp sạch hơn so với những người khác ở đây mà chỉ sử dụng các câu lệnh If. Các giải pháp sử dụng một tuyên bố Select là thông minh, nhưng nếu bạn muốn thay thế bằng cách sử dụng chỉ If báo cáo, tôi nghĩ rằng đây là một trong những sử dụng.

0

Kể từ cú pháp sau làm việc

If myObject.test() Then do something 

Bạn có thể thử

If Not myObject Is Nothing Then If myObject.test() Then 
    'do something' 
Else 
    'do something else' 
End If 

Tất nhiên, nếu bạn muốn 'làm một cái gì đó khác' nếu myObject Is Nothing, thì đây có thể không hoạt động.