昱得資訊工作室
麻辣學園
歡迎光臨, 訪客. 請先 登入註冊一個帳號.
您忘了 啟用您的帳號嗎?
2009-01-07, 03:38:54
世界展望會助學計劃
首頁 說明 登入 註冊 贊助論壇 想當作者?
新聞: Wink有贊助本論壇經營的會員,請務必來信通知小誌,這樣才能為您更新會員群組喔!!


+  麻辣家族討論區
|-+  MS Office 系列
| |-+  EXCEL
| | |-+  Excel程式區 (版主: hsieh)
| | | |-+  請問:match()在下列程式段出現error,不知...
0 會員 以及 1 訪客 正在閱讀本篇主題. « 上一篇主題 下一篇主題 »
頁: [1] 2 向下 列印
作者 主題: 請問:match()在下列程式段出現error,不知...  (閱讀 3443 次)
keno
高中生
*
離線 離線

文章: 101



請問:match()在下列程式段出現error,不知...
« 於: 2005-06-05, 18:04:18 »

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


Re: 請問:match()在下列程式段出現error,不知...
« 回覆文章 #1 於: 2005-06-05, 19:11:51 »

 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



Re: match()在下列程式段出現error,不知...
« 回覆文章 #2 於: 2005-06-05, 22:21:07 »

板主建議的句子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


Re: 請問:match()在下列程式段出現error,不知...
« 回覆文章 #3 於: 2005-06-05, 22:52:07 »

說了半天 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



Re: 請問:match()在下列程式段出現error,不知...
« 回覆文章 #4 於: 2005-06-06, 00:11:26 »

我程式碼是放在Module1中,
『Application.WorksheetFunction.Match』不可,『Application.Match』可用,謝啦

 另外,Sheets(1).Range("B:B").Name = "DATA"是失敗的狀況,
 因為在下一列DATA_START =Application.Match(search_start, DATA, 0)沒有反應,表示上一列要比較的區間("DATA")沒有設成功,【leonchou】可否再幫幫忙解答一下,感恩啦。 Grin
 



---------------------------------------------------------------------------------------------------------

Application.WorksheetFunction.Match

Application.Match

已記錄
leonchou
論壇維護群
*
離線 離線

文章: 1204


Re: 請問:match()在下列程式段出現error,不知...
« 回覆文章 #5 於: 2005-06-06, 13:14:55 »

我程式碼是放在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



Re: 請問:match()在下列程式段出現error,不知...
« 回覆文章 #6 於: 2005-06-06, 15:57:34 »

下面是幾乎完整的程式,放在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


Re: 請問:match()在下列程式段出現error,不知...
« 回覆文章 #7 於: 2005-06-06, 18:15:13 »

注意
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



Re: 請問:match()在下列程式段出現error,不知...
« 回覆文章 #8 於: 2005-06-06, 22:39:06 »

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


Re: 請問:match()在下列程式段出現error,不知...
« 回覆文章 #9 於: 2005-06-06, 23:36:16 »

最好附上sample檔,
否則這樣猜來猜去還是挺累的。
已記錄

頁: [1] 2 向上 列印 
« 上一篇主題 下一篇主題 »
自訂搜尋
跳到:  

本頁花了 0.284 秒, 以及 21 次的資料庫查詢.