[VBA] 回傳到 Sheet 的陣列索引值下限會自動從 0 變更為 1

這篇跟前篇有點關係:[VBA] LongLong 超長整數 我打算將監測數據依據是否超越門閥值來轉換成旗標變數。 由於 Excel 內沒有 Array 這個函數,所以我在 VBA 裡面加了一個 VbaArray 函數來呼叫 Array 給 Excel 呼叫。

Function VbaArray(ParamArray arrayData())
  ReDim rtnArray(0 To UBound(arrayData))
  For ibd = 0 To UBound(arrayData)
     rtnArray(ibd) = arrayData(ibd).Value
  Next
  VbaArray = rtnArray
End Function

也就是直接包裝 Array 而已,沒啥特別的。 透過這個函數,我在 Sheet 內呼叫我的旗標轉換函數,由於 VB6 以後,未明確宣告陣列索引下標者,均為 0 ,VBScript / VBNET 則強制為 0 ,沒有陣列索引下標可以不為 0 ,因此習慣這個體驗,直接用:

For i = 0 To UBound(arrData)
   ' 略
Next

然後 Excel 回傳 #VALUE … 用除錯模式追蹤,居然問題出現在 arrData(0) 陣列索引錯誤?立刻在立即除錯測試 LBound(arrData)、UBound(arrData) 與我的認知完全不同,所有索引值都增加了 1 ,也就是說從 Base 0 變成 Base 1 。 寫了小的測試 Excel 2013 (VBA 7.1) 的檔案如下圖:

Excel 2013 經過 Sheet 陣列索引值變更了

Excel 2013 經過 Sheet 陣列索引值變更了

GetSecond 變成取第一個。 我以為是 Excel 2013 的 bug ,找台 Excel 2003  (VBA 6.5) 測試,也是相同狀況:

Excel 2003 經過 Sheet 陣列索引值變更了

Excel 2003 經過 Sheet 陣列索引值變更了

所以此行為是設計行為,透過 Google 搜尋微軟站台相關說明。 Support 那邊有相關的,但並沒有很明確提醒這個狀況:https://support.microsoft.com/zh-tw/kb/213798

論壇則有人因為跟 VBNET 慣例不同,提出疑問:https://social.msdn.microsoft.com/Forums/en-US/8155cfa8-7b9f-4a55-ba46-45bddcb77779/array-dimensions-mismatch-between-excel-and-net-vb-2010?forum=vbinterop

我猜可能是為了相容 Excel 5.0 預設採用 Base 1 吧?不然也沒得猜了。 做個紀錄,以後不會再犯相同狀況。

廣告
Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

文章分頁導航

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在 WordPress.com 建立免費網站或網誌.

%d 位部落客按了讚: