2016-11-21 73 views
3

我在電子表格中插入下面的簡單功能到一個模塊:Excel的VBA函數的工作在一些地方,而不是其他

Function CellName(cel As Range) As Variant 
Dim nm As Name 
    For Each nm In Names 
     If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Then 
      CellName = nm.Name 
      Exit Function 
     End If 
    Next 
CellName = CVErr(xlErrNA) 
End Function 

我只想與細胞在相鄰的命名變量來一補列柱。

奇怪的是,該功能可在一些細胞中,但在另拋出一個#N/A錯誤。在有名字的單元格中。

誰能幫我明白了嗎?我不是VBA專家;我確實對這個問題做了一些研究,但是發現只有比這個更復雜的問題的答案。

謝謝。

+1

如果有一個「定義名稱」整整(只)在你使用,那麼你將得到該名稱(如果有多於一個,則僅僅是第一遇到)細胞。如果沒有「名字」直接進入這個單元格,那麼你會得到「#N/A」。有什麼細節在這裏不起作用? –

+0

這個函數似乎對我很有用,它返回指針'cel'沒有'Name'的#N/A值。 –

+2

名稱的範圍可以是工作簿或工作表。你沒有限定你正在迭代的'Names'集合,所以它隱含地引用'ThisWorkbook.Names'(或'ActiveWorkbook.Names',...不知道..也可能是'ActiveSheet.Names'。是不是隱含的東西很好?) - 是否考慮到了?即在同一範圍內的所有名稱? –

回答

4

得到名稱無論他們在哪裏,你可以使用這樣的事情:

Public Function CellName(cel As Range) As Variant 
    Dim nm As Name, sht As Worksheet 

    For Each nm In ThisWorkbook.Names 
    If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Then 
     CellName = nm.Name 
     Exit Function 
    End If 
    Next 

    For Each sht In ThisWorkbook.Worksheets 
    For Each nm In sht.Names 
     If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Then 
     CellName = nm.Name 
     Exit Function 
     End If 
    Next 
    Next 

    '----- skip from here if you only want single-cells 

    For Each nm In ThisWorkbook.Names 
    If Not Intersect(Range(nm.RefersTo), cel) Is Nothing Then 
     CellName = "* " & nm.Name 
     Exit Function 
    End If 
    Next 

    For Each sht In ThisWorkbook.Worksheets 
    For Each nm In sht.Names 
     If Not Intersect(Range(nm.RefersTo), cel) Is Nothing Then 
     CellName = "* " & nm.Name 
     Exit Function 
     End If 
    Next 
    Next 

    '----- skip till here if you only want single-cells 

CellName = CVErr(xlErrNA) 

End Function 

第二部分也將展示範圍包括細胞如果沒有單參考被發現(輸出與"* "啓動(如果沒有必要)

+0

Danke Dirk!我認爲這解決了YowE3K發現的問題。謝謝你們的幫助。 (其中每一個,我都會學到一點。) – Steve

4

試着改變你的功能,這可以將其刪除:

Function CellName(cel As Range) As Variant 
    Dim nm As Name 
    For Each nm In Names 
     If nm.RefersTo = "=" & cel.Parent.Name & "!" & cel.Address Or _ 
      nm.RefersTo = "='" & Replace(cel.Parent.Name, "'", "''") & "'!" & cel.Address Then 
      CellName = nm.Name 
      Exit Function 
     End If 
    Next 
    CellName = CVErr(xlErrNA) 
End Function 

一些表名需要用引號括米爲了保留語法規則,方舟。

編輯:根據David Zemens的評論,我已更新公式以執行Replace(cel.Parent.Name, "'", "''")以確保表格名稱中的任何嵌入式引號被兩個引號替換。

+0

@DavidZemens - 不,這不起作用 - 例如一張名爲'Sh e'et1'的表。到單元格A1的'RefersTo'將會是'='Sh''t1'!$ A $ 1'。因此,替換(nm.RefersTo,「'」,vbNullString)將會給出'='等於$ A $ 1',這將不匹配'= $'!您必須在等式兩邊進行替換,如果您有名爲'Sh e'et1' **和**'Sh eet1'的工作表,則會出現問題。 (爲什麼任何人都會有這些名字的牀單完全是另一個問題!!) – YowE3K

+0

@DavidZemens - 但我的方法也無法工作:( – YowE3K

+0

啊你說得對我認爲'''在表名中是非法字符:) –

相關問題