頁: [1] 2
|
 |
|
作者
|
主題: 請問:match()在下列程式段出現error,不知... (閱讀 3443 次)
|
keno
高中生
離線
文章: 101
|
MATCH()目的是找出94-04-20在工作表中的列位(B4中的4),但執行到match()時就出現"編輯錯誤 沒有定義這個Sun或Function"的訊息,不知如何排除 ------------------------------------------------------------------------------------------------ Sub 按鈕1_Click()
search_start = Workbooks("BookVBA_new.xls").Sheets(3).Range("B1").Value search_END = Workbooks("BookVBA_new.xls").Sheets(3).Range("B2").Value Sheets(1).Range("B1:B65536").Name = "DATA" DATA_START = Match(search_start, DATA, 0) Range("a"&DATA_START ,D10).select Selection.Copy ActiveSheet.Paste Destination:=Range("A20") end sub ------------------------------------------------- PS:B1=94-04-20(日期) B2=94-06-30(日期) DATA指的是到"期日欄" -------------------------------------------------資料如下
借款日 到期日 銀行 金額 94-01-02 94-03-03 一銀 100 94-02-02 94-03-30 遠銀 20 94-03-03 94-04-20 大眾 50 94-05-05 94-05-25 台新 100
|
|
|
|
|
已記錄
|
|
|
|
oobird
凸槌的木工
論壇維護群
離線
文章: 4679
|
DATA_START = WorksheetFunction.Match(search_start, Range(" DATA"), 0) Range("a" & DATA_START & ":D10").Select 試試! 對了,你的search_END 用在那裡? 還有通常copy後會有一行Application.CutCopyMode = False做結束。
|
|
|
|
« 最後編輯時間: 2005-06-05, 20:02:07 由 oobird »
|
已記錄
|
結廬待慧君
|
|
|
keno
高中生
離線
文章: 101
|
板主建議的句子DATA_START = WorksheetFunction.Match(search_start, Range(" DATA"), 0)加上去,然後step by step後在該列出現『無法取得類別WorksheetFunction的Match屬性』的訊息,不之該如何再排除???
另外問的search_END 用在那裡? Sub 按鈕1_Click()
search_start = Workbooks("BookVBA_new.xls").Sheets(3).Range("B1").Value search_END = Workbooks("BookVBA_new.xls").Sheets(3).Range("B2").Value Sheets(1).Range("B1:B65536").Name = "DATA" end_column=[A65536].End(xlUp).Row DATA_START = Match(search_start, DATA, 0) Range("a"&DATA_START-1 ,"D"&end_column).select Selection.Copy ActiveSheet.Paste Destination:=Range("A20") end sub
主要就是要依B欄的資料找起點,並用=[A65536].End(xlUp).Row找終點,再選取由A欄的資料到終點(end_column)區間的資料覆製到A20貼上
|
|
|
|
|
已記錄
|
|
|
|
leonchou
論壇維護群
離線
文章: 1204
|
說了半天 search_END 還是沒用到嘛,為什麼知道? 很簡單,search_END 從頭到尾只有一個。
至於你的問題, 寫成這樣應該就不會錯了 -- Application.WorksheetFunction.Match 或 Application.Match
補充如下 -- 1. 注意 Match 是工作表函數的成員而不是VBA內建函數,所以需指明上層物件。 WorksheetFunction 的標準寫法是 Application.WorksheetFunction。
2. 注意你的程式位於一般模組還是物件模組。 一般模組: 在一般模組 (就是 Module1、Module2.. 那些) 裡是可以省略 Application 的。 (省略 Application 就不能省略 WorksheetFunction,意思就是不能只寫函數名稱) 物件模組: 但在物件模組裡就不能省略 Application 了, 因為物件模組預設的物件是該物件本身, 例如 Worksheet 模組的預設物件是 Worksheet; UserForm 模組的預設物件就是 UserForm。由此可知, 若在 UserForm1 模組寫 WorksheetFunction (省略了 Application), VBA 會視為 UserForm1.WorksheetFunction,結果就會出錯了。
|
|
|
|
|
已記錄
|
|
|
|
keno
高中生
離線
文章: 101
|
我程式碼是放在Module1中, 『Application.WorksheetFunction.Match』不可,『Application.Match』可用,謝啦 另外,Sheets(1).Range("B:B").Name = "DATA"是失敗的狀況, 因為在下一列DATA_START =Application.Match(search_start, DATA, 0)沒有反應,表示上一列要比較的區間("DATA")沒有設成功,【leonchou】可否再幫幫忙解答一下,感恩啦。 --------------------------------------------------------------------------------------------------------- Application.WorksheetFunction.Match 或 Application.Match
|
|
|
|
|
已記錄
|
|
|
|
leonchou
論壇維護群
離線
文章: 1204
|
我程式碼是放在Module1中, 『Application.WorksheetFunction.Match』不可,『Application.Match』可用, WorksheetFunction不能用? 你是用2003版? 用2003版的朋友,真有此事嗎? 好吧,反正少了WorksheetFunction也比較省事。 另外,Sheets(1).Range("B:B").Name = "DATA"是失敗的狀況, 因為在下一列DATA_START =Application.Match(search_start, DATA, 0)沒有反應,表示上一列要比較的區間("DATA")沒有設成功, 在程式裡引用活頁簿/工作表定義的名稱,要像這樣 Range("DATA") 或 [DATA] 所以你的代碼應寫成 DATA_START =Application.Match(search_start, [DATA], 0) 或 DATA_START =Application.Match(search_start, Range("DATA"), 0)尤其是引用工作表函數時最容易疏忽。 DATA 在工作表被視為自定義的名稱, 但在程式裡 DATA 會被視為變數, 所以要寫成 Range("DATA") 或 [DATA] 才行。 另外,如果你不是真的要定義 DATA 名稱, 只是要在 Match 中使用,其實可省略 Sheets(1).Range("B:B").Name = "DATA" 這一句, 而直接寫 DATA_START =Application.Match(search_start, Sheets(1).Range("B:B"), 0) 或是 Set Data = Sheets(1).Range("B:B") DATA_START =Application.Match(search_start, Data, 0) 這時就可以直接寫 Data,因為 Data 是代表Sheets(1).Range("B:B") 的物件變數。
|
|
|
|
|
已記錄
|
|
|
|
keno
高中生
離線
文章: 101
|
下面是幾乎完整的程式,放在module1中。 狀況1: 請問下列式第七列的 DATA_START = Application.Match(search_start, Range("DATA"), 0) 以step by step的方式,執行過DATA_START列後,將滑鼠放在DATA_START上,其DATA_START出現『錯誤2042』的訊息….
狀況2: 先選上面工作列之【插入】→【名稱】→【定義】,然後定義DATA為B整欄(即B1:B65536) 隨後在sheet1之空白儲存格(如D13)寫入『=MATCH(B4,DATA,0)』就會得到4這個數字 (即94-04-20在第4列) PS:B4指的是”94-04-20”
結論:為何狀況1就出現『錯誤2042』的訊息, 但狀況2就是正常要的值,請問狀況1要改成何種表達方式才能得出狀況2的值勒 ----------------------------------------------------------- 工作表1的資料內容 借款日 到期日 銀行 金額 94-01-02 94-03-03 一銀 100 94-02-02 94-03-30 遠銀 20 94-03-03 94-04-20 大眾 50 94-05-05 94-05-25 台新 100 94-06-06 94-06-20 台新 30 94-04-05 94-06-30 遠銀 20 94-06-06 94-06-30 台新 80 94-06-15 94-07-15 台新 20 94-05-27 94-08-24 新光 30 -------------------------------------------------------------- Sub 按鈕1_Click() Dim DATA As Range
Sheets(1).Select search_start = Workbooks("BookVBA_new.xls").Sheets(3).Range("B1").Value search_END = Workbooks("BookVBA_new.xls").Sheets(3).Range("B2").Value
Sheets(1).Range("B:B").Name = "DATA" DATA_START = Application.Match(search_start, Range("DATA"), 0) Sheets(1).Select Workbooks("BookVBA_new.xls").Sheets(3).Range("B5").Value = [A65536].End(xlUp).Row Workbooks("BookVBA_new.xls").Sheets(3).Range("B6").Value = [A1].End(xlToRight).Column Range("A1 : d1").Select ‘標題列~~~工作表一 Range("A1 : d1").Copy Sheets(2).Select ‘將標題列~~~覆製到工作表二 Cells(10, 1).Select ActiveSheet.Paste Sheets(1).Select lastcol = [A1].End(xlToRight).Column lastRow = Range("A65536").End(xlUp).Row Range([A2], Cells(lastRow, lastcol)).Select Selection.Copy Sheets(2).Select Cells(11, 1).Select ActiveSheet.Paste End Sub -------------------------------------------------------------
|
|
|
|
|
已記錄
|
|
|
|
leonchou
論壇維護群
離線
文章: 1204
|
注意 DATA_START =Application.Match(search_start, Range("B:B"), 0) 不一定等於 DATA_START =Application.Match(search_start, Sheets(1).Range("B:B"), 0)
Range("B:B") 不一定等於 Sheets(1).Range("B:B") , 因為執行時所在的工作表 (目前工作表) 不一定是 Sheets(1) 。 (何況 Sheets(1) 都不一定等於 Sheet1)
Range("B:B") 要引用正確的工作表,最好不要省略,以免出錯。 如果原來 Sheets(1).Range("B:B") 行的通, 就不要隨意省略 Sheets(1) 。
|
|
|
|
|
已記錄
|
|
|
|
keno
高中生
離線
文章: 101
|
leonchou 大大 : 您說的我瞭解,所以在程式的最前面就寫了Sheets(1).Select的句子,以免游標停在別的工作表中。
我的資料是放在sheets(1),設一個button,並在module1放入完整的程式碼,以setp by step執行過 DATA_START = Application.Match(search_start, Range("DATA"), 0)列後 將游標放在DATA_START及search_start上,只有search_start出現94-04-20(有正確資料),但DATA_START卻出現『錯誤2042』的訊息而非4這個數字(94-04-20在第四列)。 您將程式run一次就知我的痛苦了,若最後仍找不到寫vba的方法,只好用儲存格寫Match(尋找的資料, 資料範圍,0)的方式解決了,雖粉快但還是希望用vba寫完成,不要在工作表的儲存格出現公式。
|
|
|
|
|
已記錄
|
|
|
|
leonchou
論壇維護群
離線
文章: 1204
|
最好附上sample檔, 否則這樣猜來猜去還是挺累的。
|
|
|
|
|
已記錄
|
|
|
|
|
頁: [1] 2
|
|
|
|