2013-01-23 30 views
6

Đã qua một vài tình huống mà một người muốn vượt qua operators dưới dạng parameter trong một hàm hoặc phương pháp. According to this post Java doesn't have that ability, hence need to create an Enum as the primary workaround.Có cách nào để chuyển toán tử số học và logic như một tham số phương thức trong VBA không?

Ví dụ:

Function doCalcs(ByRef AND as LogicalOperator, ByRef greater ArithmeticOperator) 

Mặc dù VBA có thư viện ít hơn nhiều so với .Net, Java, tạo Enum cũng được hỗ trợ. Có lẽ tôi không biết, vì vậy nếu có khả năng VBA có operator types hoặc bất kỳ giải pháp nào khác, chúng tôi có thể vượt qua an operator, bắn điều đó. (Ngoài if else/case để kiểm tra chuỗi chứa tham số điều hành .. =)) Tôi yêu cầu là different from what's mentioned here.

  • Câu hỏi được hỏi về giảm mã, tối ưu hóa.

Ví dụ: Nếu bạn nhìn vào CountIFS, nó có khả năng thực hiện trong operators. Thậm chí nếu ai đó có thể giải thích công việc back-end có thể trong chức năng này,

  1. Làm thế nào để nó chuyển đổi các chuỗi thành một hợp operator?
  2. Đó có phải là cấu trúc Enum hoặc bất kỳ thứ gì hiệu quả hơn số đó hoặc nhỏ hơn không?

Câu trả lời cho những câu hỏi này vẫn được chấp nhận.

+0

Điều này thực sự phụ thuộc vào những gì bạn đang làm với thông số bên trong hàm. Điều hữu ích nhất mà tôi có thể nghĩ đến để làm với một toán tử khái niệm được truyền vào như một tham số là sử dụng nó như một cuộc gọi lại. Ví dụ, có lẽ tôi có hàm 'get3op2()' chấp nhận toán tử nhị phân, như '+' hoặc '*', và trả về kết quả của toán tử đó trên các toán hạng được xác định trước, chẳng hạn như '3' và' 2' . Sau đó, về mặt giả thuyết, 'get3op2 (+)' sẽ trả về 5 (tức là 3 + 2) trong khi 'get3op2 (*)' sẽ trả về 6 (tức là 3 * 2). Đó có phải là những gì bạn đang cố gắng làm không? – psmay

+0

Lưu ý: một cấu trúc gõ enum đơn thuần chỉ chứa một danh sách các tên hằng số mô tả làm giá trị cho các hằng số được gõ Long. Đối với những gì liên quan đến câu hỏi của bạn, tôi không thực sự thấy giá trị gia tăng của việc sử dụng một enum. Đối với câu hỏi nếu nó có thể vượt qua một nhà điều hành trực tiếp: nó không phải là trong VBA. Đối với các workaround, có có, nơi eval sẽ là lựa chọn tốt nhất như đã đề cập. Nếu không, tôi có thể không hiểu câu hỏi thực ... – Trace

+0

@Kim có hai câu hỏi: '1.' các toán tử là tham số' 2.' cơ chế đằng sau việc đánh giá toán tử của hàm 'CountIFS'. – bonCodigo

Trả lời

2

Một cách tiếp cận sử dụng các lớp:

Định nghĩa một lớp giao diện

Op

Public Function eval(operand1, operand2) 
End Function 

Đối với mỗi nhà khai thác mong muốn, xác định một thực hiện.Ví dụ

OpMinus

Implements Op 

Private Function Op_eval(operand1 As Variant, operand2 As Variant) As Variant 
    Op_eval = operand1 - operand2 
End Function 

OpPlus

Implements Op 

Private Function Op_eval(operand1 As Variant, operand2 As Variant) As Variant 
    Op_eval = operand1 + operand2 
End Function 

Bây giờ một số thói quen kiểm tra trong một mô-đun:

Sub test() 
    Dim Minus As New OpMinus 
    Dim Plus As New OpPlus 
    Dim o, v1, v2 

    For Each o In Array(Minus, Plus) 
     For Each v1 In Array(1, 2, 3) 
      For Each v2 In Array(1, 2, 3) 
       operate o, v1, v2 
      Next 
      Debug.Print "" 
     Next 
     Debug.Print "" 
    Next 
End Sub 

Sub operate(ByVal operator As Op, operand1, operand2) 
    Debug.Print operator.eval(operand1, operand2), 
End Sub 

outpu t:

0   -1   -2    
1    0   -1    
2    1    0    

2    3    4    
3    4    5    
4    5    6    

Lưu ý bạn có thể muốn sử dụng ví dụ: Double thay vì Variant trong giao diện nếu bạn biết loại bạn sẽ hoạt động.

+0

+1 cho cách tiếp cận lớp, bạn không phải xóa câu trả lời trước đó. Đối với giai đoạn ban đầu 'Double' là đủ, nhưng cảm ơn vì đã đưa ra' Biến thể'. Nếu người ta có thể giải thích cơ chế diễn ra đằng sau một chức năng như 'CountIfs', đó là tuyệt vời như tôi quan tâm về khía cạnh hiệu suất. Tôi sẽ kiểm tra bạn cùng và đưa ra một bình luận thêm =) – bonCodigo

2

Không có loại LogicalOperator, ArithmeticOperator type hoặc bất kỳ thứ gì tương tự. Về gần nhất bạn có thể đến là sử dụng chức năng Eval trong MS Access VBA hoặc chức năng Evaluate (tương tự nhưng khác) trong Excel VBA.

Thực tế, bạn có thể đã sử dụng chức năng Evaluate trong Excel mà không hề nhận ra nó. Từ Excel tập tin trợ giúp:

Note Sử dụng dấu ngoặc vuông (ví dụ, "[A1: C5]") là giống với cách gọi phương thức Đánh giá với một đối số chuỗi. Ví dụ, các cặp biểu thức sau đây là tương đương.

[a1].Value = 25 
Evaluate("A1").Value = 25 
+0

+1 cho 'eval' và' evaluation' và giải thích mặc dù nó không hoàn toàn là những gì tôi theo sau. – bonCodigo

2

Làm thế nào tôi sẽ giải quyết vấn đề

1) Tham khảo Microsof Script Controler 1.0 thư viện

Option Explicit 

Sub Base_Sub() 

Dim iNumber1  As Integer 
Dim iNumber2  As Integer 
Dim iSum   As Integer 
Dim iMultiply  As Integer 
Dim dDivision  As Double 
Dim iDifference  As Integer 
Dim lPower   As Long 

iNumber1 = 2 
iNumber2 = 6 

iSum = CalculateThis("+", iNumber1, iNumber2) 
iMultiply = CalculateThis("*", iNumber1, iNumber2) 
iDifference = CalculateThis("-", iNumber1, iNumber2) 
dDivision = CalculateThis("/", iNumber1, iNumber2) 
lPower = CalculateThis("^", iNumber1, iNumber2) 

End Sub 



Public Function CalculateThis(operator As String, iNumber1 As Integer, iNumber2 As Integer) 

Dim script As ScriptControl 

Set script = New ScriptControl 
script.Language = "VBScript" 

CalculateThis = script.Eval(iNumber1 & operator & iNumber2) 

End Function 
+0

Đây là một cách khác để gói cùng một chức năng 'Đánh giá 'được đề cập bởi cả hai câu trả lời khác. Ngoài ra Excel 'Đánh giá'. Tuy nhiên, sẽ tốt hơn nếu người ta cũng đã chỉ ra các toán tử 'logical' và' relational' đánh giá .... – bonCodigo

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