Board logo

標題: 同一程式代碼在工作表與模組執行出現1004 [打印本頁]

作者: s7659109    時間: 2019-2-27 10:46     標題: 同一程式代碼在工作表與模組執行出現1004

For Each arr In Range([代號!y1], [代號!z65536].End(xlUp))
    If arr(1, 2) <> "" Then d(arr(1, 2) & "-") = arr(1, 1)
Next
上面代碼在模組可組正常執行
但放在工作表(data),引用代號工作表資料,則出現1004錯誤卡住了,故放在工作表(data),上面代碼如何改?
又在工作表中設計代碼,又該注意什麼?
作者: luhpro    時間: 2019-2-28 21:40

For Each arr In Range([代號!y1], [代號!z65536].End(xlUp))
    If arr(1, 2)  "" Then d(arr(1, 2) & " ...
s7659109 發表於 2019-2-27 10:46


[代號!y1] 形式的儲存格位址表示方式,
其實是用在儲存格的公式裡的,
僅適用於全域程式(即模組內)中.

若是在工作表內的VB程式則應使用 Sheets("工作表名稱").[儲存格位址] 的表示方式 :
  1. Sub nn()
  2.   Dim arr, d

  3.   Set d = CreateObject("Scripting.Dictionary")

  4.   With Sheets("代號")
  5.     For Each arr In .Range(.[y1], .[z65536].End(xlUp))   ' Range 前面必須有個點, 才能索引到 Sheets("代號") 裡的儲存格
  6.       If arr(1, 2) <> "" Then d(arr(1, 2) & "-") = arr(1, 1)
  7.     Next
  8.   End With
  9. End Sub
複製代碼

作者: s7659109    時間: 2019-3-4 08:48

另外 For Each arr In .Range(.[y1], .[z65536].End(xlUp))也有人這樣寫 For Each arr In .Range(.[y1], .[y65536].End(xlUp)),確有一樣的效果,為何?不解?
作者: luhpro    時間: 2019-3-5 22:45

本帖最後由 luhpro 於 2019-3-5 22:50 編輯
另外 For Each arr In .Range(.[y1], .[z65536].End(xlUp))也有人這樣寫 For Each arr In .Range(.[y1], .[ ...
s7659109 發表於 2019-3-4 08:48


那兩個式子結果是不一樣的喔,
要了解其原因首先要知道 Range.End(xlUp) 是甚麼意思.

所謂 Range.End(xlUp) 是指 :

從 Range 這個儲存格開始 "往上" 找到第一個有資料的儲存格,傳回該儲存格

所以你上面舉的例子兩個式子結果是不同的,
找到的儲存格一個在 Z 欄, 一個在 X 欄,
可能會列號相同, (同列的兩欄都有資料時)
但不會是同一個儲存格.

前面再加上 Range(.[y1],  後,
前者會遍歷 Y 與 Z 兩欄的標的列,
後者則只會跑 Y (也只有這一個)欄的標的列喔.




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