2013-01-31 114 views
2

我想一個函數來返回給定的rowIndex的列和單元格值的索引:的Excel/VBA - 函數返回整數

'Get index of column given a heading name 
Function FindColumnIndex(name As String, rowNumber As Integer) As Integer 
    Dim index As Integer 
    index = 1 
    Dim found As Boolean 
    found = False 

    Do While found = False 
     If Cells(rowNumber, index).Value = name Then 
      FindColumnIndex = index 
      Exit Do 
     End If 

     index = index + 1 
    Loop 

    FindColumnIndex = index 


End Function 

我會然後分配這一個值:

Dim colIndex As Integer 
colIndex = FindColumnIndex("Physical or Virtual", 2) 

問題是這是行不通的 - 我相信我的功能是不正確的 - 任何人都知道我做錯了什麼?

+0

您的參數被稱爲'rowNumber',但在循環中使用'row' – hsan

+4

您可以通過在模塊頂部使用'Option Explicit'來避免這種類型的錯誤。您也可以在工具>選項>編輯器>需要變量聲明下的VBE中將其設置爲默認值。 –

+0

請參見:MATCH:http://office.microsoft.com/en-us/excel-help/match-function-HP010062414.aspx?CTT=3 – qPCR4vir

回答

3

一兩件事,我發現了蝙蝠:

If Cells(row, index).Value = name Then 

傳遞給函數的變量命名爲rowNumber,不row。更改該行:

If Cells(rowNumber, index).Value = name Then 

編輯:其他

有一點要注意的是,你的函數實際上從未停止自身。它終止的唯一原因是因爲它在嘗試讀取列16385時遇到了應用程序定義的錯誤(因爲Excel限於16384列*),這會立即殺死該函數,並返回#VALUE錯誤。

以下修訂防止和返回-1,如果請求的列名未找到:

Option Explicit 

Function FindColumnIndex(name As String, rowNumber As Integer) As Integer 
    Dim index As Integer 
    index = 1 
    Dim found As Boolean 
    found = False 

    FindColumnIndex = -1 

    Do While found = False 
     If Cells(rowNumber, index).Value = name Then 
      FindColumnIndex = index 
      found = True 
     End If 

     index = index + 1 
     If index > 16384 Then Exit Do 
    Loop 

End Function 

[* Excel 2007是因此而受到限制,反正。我不知道是否有更新的版本有較大的限制與否]

+0

Excel 2013仍具有相同的限制:1,048,576行和16,384列 – SeanC

+0

偉大謝謝你的澄清,肖恩。 – nullrevolution

0
If Cells(row, index).Value = name Then 

做你的意思是:

If Cells(rowNumber , index).Value = name Then 

反正有功能做到這一點,像MATCH,INDEX &有限公司