Q1:

我有一段程序碼如下:
sub 測試()
dim key
key= InputBox("請輸入要找尋的資料!", "提示")
Columns("A:A").Select
Selection.Find(What:=key, After:=ActiveCell).Select
Application.Goto reference:=Selection.Offset(0, 5), Scroll:=True
end sub
Q1:上頭會在找不到時出現執行階段錯誤91,沒有設定物件變數或with區域變數
= =??這是什麼意思???~
'===============================================

Q2:

這程序的目的是想讓搜找A欄內的特定值後到對應位置
可是在找不到時,就會出現錯誤,
我上網查了下,有大大回覆必須宣告成物件
只是我不太懂它的語法限制..
因為我在宣告了變數
Dim myRange as object
set myRange = columns("A:A")Set myRange = Range("A:A")
myRange.Find(What:=key, After:=ActiveCell).Select
Application.Goto reference:=Selection.Offset(0, 5), Scroll:=True

執行它會出現執行階段錯誤13:型態不符合
Q2:是因為.Find的方法前面只能用cells的關係?還是說...是其他什麼原因呢?
-------------------------------------------------------
補充修Q2
不知道是不是.find的方法前方的物件有限制什麼條件?
我用錄製巨集,他是採
Cloumns("A:A").select
selection.find(........)

但同樣的我若改成設成物件型態變數,讓物件直接指定為A欄,再用物件名去.find
例如:
Set myRange = columns("A:A")
myRange.find(.....)
這樣就會出現原先講的錯誤


但我若改成

Set myrange = Range("A1:A" & Range("A" & Rows.count).End(xlUp).Row)
myrange.Select

然後再用
myrange.find(.....)
這樣又變成可行..(只是同樣會再找不到資料時三不五時中止)

Q3:

、這裡出現了第三個問題
為什麼整欄指派不行,但區域指派就可用.Find
這個 .find 怎麼這麼難搞
'===============================================



因為我搜尋的這段是採錄製後修改,但常常在找不到資料下,就中止程序了
求助達人解惑...感謝~


===============================================
附帶我查得的資料如下
Q:
Cells.Find(What:=InputBox("請輸入要找尋的資料!", "Search"), _
After:=ActiveCell,).Activate
A:高手的回覆是
Set xF = Cells.Find(What:=InputBox("請輸入要找尋的資料!", "Search"), _
After:=ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, _
SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= False)

If xF Is Nothing Then MsgBox "找不到資料" Else xF.Select
===========================================
文章關鍵字
https://www.mobile01.com/topicdetail.php?f=511&t=4737630&p=93
配合這篇
(925樓)Function Found_Range(Source As Range, Find_what As String) As String

Found_Range = Found_cell.Row 刪掉
改成 Found_Range = Found_cell.Address

Found_Range = Found_Range & "," & Found_cell.Row 刪掉
改成 Found_Range = Found_Range & "," & Found_cell.Address




Sub test_少量資料用()

Range("a:a").Interior.Pattern = xlNone
Range("a:a").Font.ColorIndex = xlAutomatic

Dim i As Integer, key As String, temp As String
Dim myRange As Range

key = "ggg"
Set myRange = Range("a:a")

temp = Found_Range(myRange, key)
Debug.Print temp

If temp <> "" Then
'要用的程式碼放這裡
Range(temp).Font.Color = vbRed
Range(temp).Interior.Color = 5287936
'Range(temp).Select
Else
MsgBox "nothing"
End If

End Sub






Sub test_大量_少量_資料通用()

Range("a:a").Interior.Pattern = xlNone
Range("a:a").Font.ColorIndex = xlAutomatic

Dim i As Integer, key As String, temp As String, found_address
Dim myRange As Range, f_range As Range

key = "c"
Set myRange = Range("a:a")

temp = Found_Range(myRange, key)
Debug.Print temp

If temp = "" Then
MsgBox "nothing"
Exit Sub
End If

found_address = Split(temp, ",")
For i = 0 To UBound(found_address)
If found_address(i) <> "" Then
If f_range Is Nothing Then
Set f_range = Range(found_address(i))
Else
Set f_range = Union(f_range, Range(found_address(i)))
End If
End If
Next i

'要用的程式碼放這裡
f_range.Font.Color = vbRed
f_range.Interior.Color = 5287936
'f_range.Select

End Sub
Q1其實是error handling的問題

範圍內沒找到what後面的數值的話,expression.find函數傳回的值是nothing, nothing.select會報錯

Q2的寫法和樓主找到的資料是在寫不同的東西
srwe wrote:
Q1其實是error(恕刪)

我看了1樓大大的回覆,雖然很感激,但功力實在不到家,
變成有看沒有懂,搞了2~3天還在為這個問題找解
剛一步步的用錄製,然後參照EXCEL的尋找框來看編碼,
同時到官網去看它的解釋,但我還是找不到到底要如何解決它找不到時就莫名中止的方法.

因為我的設定是當下一個工作表內的A欄找不到予找的值時,就往下下一個工作表再去找A欄.
直到所有工作表都找完為止..
奇怪的是,我有些列,明明也是在相同條件下,同樣找不到時,他會全部跑完
但就有些列就怎麼樣都會被迫中止..
..
= =""
老大救救我吧..
另外我在想會不會是.find的上頭物件的問題呢?
先謝謝您們了
srwe wrote:
error handling

nothing.select會報錯,我查看官網也是這樣設定..
我指的是他找不到時的回傳值
而假設我用if 來過濾
感覺會有邏輯上的問題..如:
我先用
if 物件變數 is Nothing then
exit sub
else
Columns("A:A").Select
Selection.Find(What:=key, After:=ActiveCell).Select
Application.Goto reference:=Selection.Offset(0, 5), Scroll:=True
end sub
end if
這樣好像前後顛倒
但若反過來如下:

sub 測試()
dim key
key= InputBox("請輸入要找尋的資料!", "提示")
Columns("A:A").Select
Selection.Find(What:=key, After:=ActiveCell).Select
Application.Goto reference:=Selection.Offset(0, 5), Scroll:=True

if 物件變數 is Nothing then end

end sub

這樣它又好像在找不到時就先中止了..
快被這鬼打牆問題搞瘋了= =
其次就是用錄製的時候,出來的結果如上方程序
但我改用
set ABC=columns("A:A")
ABC.Find(What:=key, After:=ActiveCell).Select
Application.Goto reference:=Selection.Offset(0, 5), Scroll:=True

它好像又會說錯誤...= =
snare wrote:
https://www(恕刪)


老大謝謝你的回覆,可是我不材,實在看不懂,不知大大有機會可否稍微簡化些的提點一二,你那帖子我很久前就追蹤,但我自學實在很多地方在卡關,尤其在爬文這塊,現在卡最多的就是物件上,就我所看的書裡,VBA的物件好像有些方法就是必須配合某個物件才可
例如inputBox它就有分一般跟配合application
然後引數就會有所不同
只是我實在不知道要如何查閱哪些方法是要如何配何哪些特定物件才可用。
如果大大你可以點個一二,我都會很感謝您的..也謝謝您今日替我回覆..只是我看得好亂便是..
MaverickRay wrote:
nothing.select會報錯,我查看官網也是這樣設定..
我指的是他找不到時的回傳值
而假設我用if 來過濾
感覺會有邏輯上的問題..如:
我先用
if 物件變數 is Nothing then
exit sub
else
Columns("A:A").Select
Selection.Find(What:=key, After:=ActiveCell).Select
Application.Goto reference:=Selection.Offset(0, 5), Scroll:=True
end sub
end if
這樣好像前後顛倒
但若反過來如下:


都說了這是error handling的問題你在本來的程式中加入error handler就完事了

sub 測試()
dim key
key= InputBox("請輸入要找尋的資料!", "提示")
On Error Resume Next
Columns("A:A").Select
Selection.Find(What:=key, After:=ActiveCell).Select
Application.Goto reference:=Selection.Offset(0, 5), Scroll:=True
end sub

更好的做法

sub 測試()
dim key
key= InputBox("請輸入要找尋的資料!", "提示")
On Error Goto Message
Columns("A:A").Select
Selection.Find(What:=key, After:=ActiveCell).Select
Application.Goto reference:=Selection.Offset(0, 5), Scroll:=True
exit sub

Message:
msgbox("Data Not Found")

end sub

用if做error handling的做法你引用的回復己經做了,關鍵就是先指派myRange為selection.find的回傳值,再用if判斷式查myRange的值,非nothing的話才做myRange.select這個動作,nothing的話就直接跳過,你看不明白我也沒辦法

不過提到error handling居然不會想到去用Basic語言的error handler,估計樓主應該沒有正規地學過寫程式吧…
MaverickRay wrote:
如果大大你可以點個一二,我都會很感謝您的..也謝謝您今日替我回覆..只是我看得好亂便是..


您每個工作表只在a欄搜尋1筆不重複資料
改用srwe這位高手給的範例比較適合,srwe的說明很正確

我的方法程式碼比較複雜,雖然要找一筆也行
主要用途是搜尋"大量"、"重複"資料用的,
例如這種用法:




Sub test()

Dim i As Integer, key As String, temp As String, Found_address As String
Dim myRange As Range

key = "a" '搜尋關鍵字

For i = 1 To Sheets.Count '所有工作表跑一遍

Set myRange = Sheets(i).Range("a:a") '範圍:每個工作表的a欄
temp = Found_Range(myRange, key)
'Function Found_Range 取得、修改方式,同2樓

If temp = "" Then
Found_address = Found_address & Sheets(i).Name & " " & "沒找到" & vbNewLine
Else
Found_address = Found_address & Sheets(i).Name & " " & temp & vbNewLine
'======
'程式碼放這邊
'如果確定每個工作表,只會有一筆不重複資料,一般寫法就行
'如果有“複數”資料,需配合2樓範例修改
'======
End If

Next i

'debug
MsgBox Found_address

End Sub
snare wrote:
您每個工作表只在a欄(恕刪)

先感謝您們的幫忙與回覆,因上回在回覆沒過多久,電腦就燒了
最近只好先轉向看要怎麼組..
因為單螢幕之原因,致我在除錯時感覺不太順手,所以只好暫且擔擱..實在很抱歉
等到我弄好後再回來看那些程式語法..再次感謝諸位達人的熱心幫助
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!