2014-03-27 23 views
1

我正在嘗試做一個簡單的函數來計算代碼爲LINES的工作表中列出的管道數量。行中將列出的工作表LINES中的範圍是$ A $ 2:$ A $ 1048576,並且我已將範圍命名爲「LineList」。我創建了一個包含所有硬編碼全局常量的模塊,以便將來可以輕鬆修改它們。 LineList範圍的名稱是其中的一個,定義如下:VBA:使用字符串常量指定範圍

Public Const LINELIST_RNG As String = "LineList" 

我的功能如下。出於某種原因,這個命令失敗,由於LINELIST_RNG爲空:

Function numLines() As Integer 
    numLines = WorksheetFunction.CountA(LINES.Range(LINELIST_RNG)) 
End Function 

但是,如果我硬編碼區域名稱到這個功能,它工作正常:

numLines = WorksheetFunction.CountA(LINES.Range("LineList")) 

我不確定爲什麼.Range對象不能將LINELIST_RNG作爲參數,而會採用「LineList」。

+1

雙重拼寫?我看不出會發生什麼,你是否設置了一個斷點來驗證const的值? –

+0

我做你的建議所有的時間...關閉我的頭頂,我不認爲這就是爲什麼你會得到錯誤... –

+2

也因爲這是一個大範圍'只要'可能是當整數溢出超過+32767 –

回答

1

下面的代碼工作正常:

Option Explicit 

Public Const LINELIST_RNG As String = "LineList" 

Public Sub test() 

    Dim r1 As Range 
    Dim r2 As Range 

    Set r1 = Sheets(1).Range("LineList") 
    Set r2 = Sheets(1).Range(LINELIST_RNG) 

    MsgBox r1.Cells(1, 1).Value 
    MsgBox r2.Cells(1, 1).Value 

End Sub 

所以必須有別的東西在你的代碼怎麼回事。打開選項明確,它可能會指向你在正確的方向

+0

我發現它與聲明的順序有關,正如我在下面的答案中所解釋的,但我不明白爲什麼。爲什麼你不能在其他函數的聲明下面聲明一個常量,即使它沒有被上面的函數使用,而只是在它下面聲明的函數? – teepee

1

看來,問題出現在我的模塊中的聲明順序。爲了讓背景下,

Public Const LINELIST_RNG As String = "LineList" 
Function numLines() As Integer 

聲明公共常量和函數聲明的名單後進行,所以他們沒有工作。

我的模塊看起來像:

Public Const ... 
Public Const ... 
Function blabla1 ... 
Function blabla2 ... 
Public Const LINELIST_RNG ... 
Function numLines() As Integer ... 

現在,我已經感動了所有公共const聲明的模塊開始,一切功能正常。