2017-04-27 100 views
0

我想創建以下自定義公式:VBA Exel的編譯錯誤:預期:由語句的結束「(」

採取姓名,工作單位和電子郵件在不同的細胞,並在它們組合新小區的名稱(所屬)。

我可以用公式來做到這一點直接進入一個新的小區

=A2& " ("& B2&") " & "<"&C2&">" 

其中A2,B2和C2是包含姓名,工作單位和電子郵件的細胞

但是,我不是每次都複製並粘貼此公式,而是嘗試創建一個自定義公式作爲捷徑。然而,當我嘗試使用同樣的公式在VBA來創建一個新的模塊,像這樣:

Function Combined (name, affiliation, email) 
Combined = name&" ("&affiliation&") "&"<"&email&">" 

方案突出了「(」,它給了我下面的錯誤:

編譯錯誤: 預計:聲明

末我不是一個編碼器,我只是涉獵,但任何幫助將不勝感激

謝謝

P.S.如果我可以做一個範圍像A2:C2而不是A2,B2,C2,效果相同,那會更好!!!!!!

回答

4

短版

添加運算符和操作數之間的空間。問題解決了。


龍版

任何標識符後面緊跟着一個&,像name&affiliation&,被解釋爲Long變量,所以什麼之間的意思是連接操作是缺乏空白導致解析錯誤,因爲VBA不知道什麼文字表達式可能遵循Combined = name&賦值 - 指令完全按原樣;唯一的令牌應該是哪裏" ("是,是語句末,一個令牌:

Expected: end of statement

說這一點。 " ("之前的所有內容都是非常有效的指令,除非它沒有終止。

所以它不是" (",它是類型提示。插入空格將運算符與操作數分開,然後解決問題。更明晰不能傷害,或者:

Option Explicit 

Public Function Combined(ByVal name As String, ByVal affiliation As String, email As String) As String 
    Combined = name & " (" & affiliation & ") " & "<" & email & ">" 
End Function 

如果未指定類型,一個聲明是隱含Variant,這會帶來一些不必要的運行時開銷。

當沒有指定ByVal時,參數默認傳遞ByRef,這意味着該函數可以分配給參數。

你也可以實現像這樣的功能:

Combined = Join(Array(name, "(" & affiliation & ")", "<" & email & ">"), " ") 
+2

或使用'加入$'並獲得一個免費的類型提示,而股票持續。其實,不要那樣做。 – ThunderFrame

1

如果你想一個Range傳遞給你的函數,你可以這樣做:

Public Function Combined(rng As Range) As Variant 
    If rng.Cells.Count <> 3 Or rng.Areas.Count <> 1 Then 
     Combined = cvErr(xlErrValue) 
    Else 
     Combined = rng.Cells(1).Value & _ 
        " (" & rng.Cells(2).Value & ")" & _ 
        " <" & rng.Cells(3).Value & ">" 
    End If 
End Function 

如果放置在標準代碼模塊,即函數可以從Excel調用,例如,=Combined(A2:C2)