Board logo

標題: Office 2000 VBA 的bug? [打印本頁]

作者: Delphia    時間: 2015-9-24 17:32     標題: Office 2000 VBA 的bug?

各位大哥好:

原本我使用的是2000版本的Office,無論怎麼deBug總是出現「型態不符合」的Error,

後來發現2013版本的Office可以執行,完全不會產生此問題,
所以直接挪到有灌2013的電腦去用了,但還是十分困惑2000版本到底有什麼Bug。

問題是這樣的,
我把儲存格用VBA讀進一個 6668x4 的陣列要處理(如下圖),要將其中一行萃取出來,成為一個一維陣列(6888個元素)
我使用 Application.WorksheetFunction.Max 函數去找這個一維陣列的最大值的時候,找最大值這行完全無法執行。
但是其他程式碼都可以執行順利,
實在找不出原因之下,我將控制範圍的程式碼改成一個 100x4 大小的陣列,結果執行完全正常!
我只是修改了陣列的長度,並沒有修改其他的內容。

[attach]22086[/attach]

我要處理的那個一維陣列(6668x1)只是長度很大,看起來沒什麼不同,
使用其他函式(UBound/個數上限、最末元素值等等)去讀取其特性也都正常,所以我的input條件應該是電腦認得的
唯獨就是最大最小值的功能不能使用

後來不死心,將陣列改成 6000x1 大小,結果也出現同樣的錯誤型態,
將陣列改成 5000x1 大小,奇蹟發生了!所有程式碼又可以順利執行了!

很好奇到底是從多少開始會有Error的,後來被我試出,只要陣列是 5461x1 大小以下,此函式 Application.WorksheetFunction.Max  都可執行
5462x1 大小以上,此函式的功能就會出現Error,錯誤內容為「型態不符合」。
2013版本的Office沒有這狀況喔!

[attach]22085[/attach]

PS.我把程式碼貼在附件了,能否請各位大大解答此疑惑
作者: Delphia    時間: 2015-9-24 18:05

重貼程式碼
  1. Sub AllCol(theArray As Variant, ColNum As Integer, ByRef mArr() As Double) '傳入二維陣列,傳出一維陣列

  2.     Dim s, j

  3.     s = 0 '初始化s
  4.      For j = 1 To UBound(theArray, 1) '該二維陣列的列數(非行數)上限
  5.          
  6.          ReDim Preserve mArr(s) '重新定義一維陣列大小
  7.          
  8.          mArr(s) = theArray(j, ColNum)
  9.          s = s + 1
  10.      Next j
  11.      

  12. End Sub

  13. Sub Ellipse1_Click()

  14. Dim T() As Variant
  15. Dim A() As Double
  16. Dim B() As Double

  17. Dim i, j

  18. T = Range("A1:D5461")

  19. Call AllCol(T, 1, A) '指定二維陣列T的第1行為一維陣列A


  20. For i = 0 To UBound(A)
  21.      ReDim Preserve B(i)
  22.      B(i) = (-1) * A(i)
  23. Next i
  24. '此for迴圈作用:將一維陣列A轉成[-A]


  25. Range("H1") = UBound(B) '將一維陣列B的個數印在H1儲存格
  26. Range("H2") = B(UBound(B)) '將一維陣列B的最末元素印在H2儲存格
  27. Range("H3") = Application.WorksheetFunction.Max(B) '將一維陣列B的最大值印在H3儲存格

  28. End Sub
複製代碼

作者: GBKEE    時間: 2015-9-25 07:12

回復 2# Delphia
用2003測試也沒問題的.
須請2000測試看看.
或重灌OFFICE 2000試試.
作者: Joforn    時間: 2015-9-25 12:11

回復 2# Delphia
只是猜测一下:
office2000的VBA是以16位内核编译的(Windows 98系统列),所以它内部的变量是不是直接就是以双字节长度的变量来处理数组的上下标信息,所以大于65535的数据处理不了,而Office2003以上的是以双字(四字节)来处理,所以不会出错。
作者: 准提部林    時間: 2015-9-25 13:59

雖然使用VBA運算,但仍屬〔工作表函數〕,
不只 MAX,其它 WorksheetFunction 函數一樣受限于〔array 陣列〕的限制,
部份改以 Range 為參照則可以正常計算(但不是全部);
 
在工作表儲存格直接輸入的公式,某些函數一樣受單元格數量的限制,例如:MMULT, TRANSPOSE....等等
OFFICE 2000及以下版本是如此,
其它較高版本也應各有其限制,只是實際使用上,大約不太會超過其可容許度吧,所以〔沒感覺〕???
 
可參考以下:
https://support.microsoft.com/zh-tw/kb/177991#/zh-tw/kb/177991
https://support.microsoft.com/zh-tw/kb/166342#/zh-tw/kb/166342
作者: Scott090    時間: 2015-9-26 08:09

Excel 2010 32位元版本的 WorksheetFunction 函數
同樣受限於 65535的資料長度




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)