入庫單的輸入,查找,刪除與修改
一 查找功能
在VBA中查找主要有三種方法,第一是使用循環查找(在單元格中查找效率太低)第二種是調用工作表函數,第三是使用find函數。
1.1 調用工作表函數查找
Sub haa1()
Dim hao As Integer
Dim icount As Integer
icount = Application.WorksheetFunction.CountIf(Sheets("庫存明細表").[b:b], [g3])
If icount > 0 Then??? ‘1.涉及到查找單據號碼在庫存明細表中是否存在
MsgBox "該入庫單已存在,請不要重復錄入"
MsgBox Application.WorksheetFunction.Match([g3], Sheets("庫存明細表").[b:b], 0)??????? ’2.在庫存明細表中查找單據號碼第一次出現的位置
End If
End Sub
涉及到match函數
以下信息選自https://zhidao.baidu.com/question/514555586.html
MATCH函數語法:MATCH(lookup_value, lookup_array, match_type)
lookup_value:需要在數據表(lookup_array)中查找的值。可以為數值(數字、文本或邏輯值)或對數字、文本或邏輯值的單元格引用。可以包含通配符、星號 (*) 和問號 (?)。星號可以匹配任何字符序列;問號可以匹配單個字符。
lookup_array:可能包含有所要查找數值的連續的單元格區域,區域必須是某一行或某一列,即必須為一維數據,引用的查找區域是一維數組。
match_type:表示查詢的指定方式,用數字-1、0或者1表示。
為1時,查找小于或等于lookup_value的最大數值在lookup_array中的位置,lookup_array必須按升序排列:
為0時,查找等于lookup_value的第一個數值,lookup_array按任意順序排列:
為-1時,查找大于或等于lookup_value的最小數值在lookup_array中的位置,lookup_array必須按降序排列。利用MATCH函數查找功能時,當查找條件存在時,MATCH函數結果為具體位置(數值),否則顯示#N/A錯誤。
MATCH函數:匹配函數,指返回指定數值在指定數組區域中的位置。MATCH函數是EXCEL主要的查找函數之一,該函數通常有以下幾方面用途:
(1)確定列表中某個值的位置;
(2)對某個輸入值進行檢驗,確定這個值是否存在某個列表中;
(3)判斷某列表中是否存在重復數據;
(4)定位某一列表中最后一個非空單元格的位置。
1.2? 使用find函數查找
Sub haa2()
Dim r As Integer, r1 As Integer
Dim icount As Integer
icount = Application.WorksheetFunction.CountIf(Sheets("庫存明細表").[b:b], [g3])
If icount > 0 Then
r = Sheets("庫存明細表").[b:b].Find([g3], lookat:=xlWhole).Row
r1 = Sheets("庫存明細表").[b:b].Find([g3], searchdirection:=xlPrevious).Row
'在庫存明細表中查找單據號碼最后一個的位置。
MsgBox r & ":" & r1
End If
End Sub
如何返回最下一行非空行的行數
Sub haa3()
MsgBox Sheets("庫存明細表").Cells.Find("*", searchdirection:=xlPrevious).Row
End Sub
涉及到find函數。
以下信息摘選自http://www.excelpx.com/thread-156406-1-1.html
有關在 Visual Basic 中使用 Find 工作表函數的詳細信息,請參閱F1幫助中在 Visual Basic 中使用工作表函數。
expression.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SerchFormat)
expression? ?? ?必需。該表達式返回一個 Range 對象。
What? ?? ?Variant 類型,必需。要搜索的數據。可為字符串或任意 Microsoft Excel 數據類型。
After? ?? ?Variant 類型,可選。表示搜索過程將從其之后開始進行的單元格。此單元格對應于從用戶界面搜索時的活動單元格位置。值得注意的是,After 必須是區域中的單個單元格。請記住搜索是從該單元格之后? ?開始的;直到本方法繞回到指定的單元格時,才對其進行搜索。如果未指定本參數,搜索將從區域的左上角單元格之后開始。
LookIn? ?? ?Variant 類型,可選。信息類型。
LookAt? ?? ?Variant 類型,可選。可為以下 XlLookAt 常量之一:xlWhole 或 xlPart。
SearchOrder? ?? ?Variant 類型,可選。可為以下 XlSearchOrder 常量之一:xlByRows 或 xlByColumns。
SearchDirection? ?? ?XlSearchDirection 類型,可選。搜索的方向。
XlSearchDirection 可為以下 XlSearchDirection 常量之一。
xlNext 默認值
xlPrevious
MatchCase? ?? ?Variant 類型,可選。若為 True,則進行區分大小寫的查找。默認值為 False。
MatchByte? ?? ?Variant 類型,可選。僅在選擇或安裝了雙字節語言支持時使用。若為 True,則雙字節字符僅匹配雙字節字符。若為 False,則雙字節字符可匹配其等價的單字節字符。
SearchFormat? ?? ?Variant 類型,可選。搜索的格式。
說明每次使用本方法后,參數 LookIn、LookAt、SearchOrder 和 MatchByte 的設置將保存。如果下次調用本方法時不指定這些參數的值,就使用保存的值。設置這些參數將更改“查找和替換”對話框中的設置,如果您忽略參數,更改“查找和替換”對話框中的設置將更改使用的保存值。若要避免這種問題的出現,每次使用該方法時請明確設置這些參數。
可以使用 FindNext和 FindPrevious方法重復搜索。
當搜索到指定的搜索區域的末尾時,本方法將繞回到區域的開始繼續搜索。發生繞轉后,若要停止搜索,請保存第一個找到的單元格地址,然后依據該保存地址測試每個后續查找到的單元格地址。
若要進行更為復雜的模式匹配查找,請用 For Each...Next 語句和 Like 運算符。例如,下列代碼在單元格區域 A1:C5 中搜索字體名稱以“Cour”開始的單元格。當 Microsoft Excel 找到匹配單元格以后,就將其字體改為“Times New Roman”。
For Each c In [A1:C5]
If c.Font.Name Like "Cour*" Then
c.Font.Name = "Times New Roman"
End If
Next
--------------------------------------------------------
下面是幾個蘭色版主以前的教學示例代碼:
Sub Find1() '在某列查找
Dim k
k = Range("A:A").Find("A").Row
MsgBox k
End Sub
Sub Find11() '在多列查找
Dim k
k = Range("A:B").Find("BCD").Row
MsgBox k
End Sub
Sub Find2() '查找的起始位置
Dim k
k = Range("A:B").Find("A", AFTER:=Range("A5")).Row
MsgBox k
End Sub
Sub Find3() '在值中查找
Dim k
k = Range("B:B").Find("SE", LookIn:=xlValues).Row
MsgBox k
End Sub
Sub Find31() '在公式中查找
Dim k
k = Range("B:B").Find("C2", LookIn:=xlFormulas).Address
MsgBox k
End Sub
Sub Find32() '在備注中查找
Dim k
k = Range("B:C").Find("AB", LookIn:=xlComments).Address
MsgBox k
End Sub
Sub Find41() '按模糊查找
Dim k
k = Range("B:C").Find("A", LookIn:=xlValues, LOOKAT:=xlPart).Address
MsgBox k
End Sub
Sub Find42() '匹配查找
Dim k
k = Range("B:C").Find("A", LookIn:=xlValues, LOOKAT:=xlWhole).Address
MsgBox k
End Sub
Sub Find5() '按先行后列的方式查找
Dim k
k = Range("A:B").Find("AB", LookIn:=xlValues, LOOKAT:=xlWhole, SEARCHORDER:=xlByRows).Address
MsgBox k
End Sub
Sub Find51() '按先列后行的方式查找
Dim k
k = Range("A:B").Find("AB", LookIn:=xlValues, LOOKAT:=xlWhole, SEARCHORDER:=xlByColumns).Address
MsgBox k
End Sub
Sub Find6() '查找方向(從后向前)
Dim k
k = Range("A:A").Find("A", , xlValues, xlWhole, xlByColumns, xlPrevious).Address
MsgBox k
End Sub
Sub Find61() '查找方向(從前向后)
Dim k
k = Range("A:A").Find("A", , xlValues, xlWhole, xlByColumns, xlNext).Address
MsgBox k
End Sub
Sub Find7() '字母大小寫
Dim k
k = Range("a:b").Find("a", , xlValues, xlWhole, xlByColumns, xlNext, False).Address
MsgBox k
End Sub
Sub f7() '查找不到的情況
Dim MRG As Range
Set MRG = Range("A:A").Find("D")
If MRG Is Nothing Then
MsgBox "查找不到字母D"
Else
MsgBox "查找成功,單元格地址為:" & MRG.Address
End If
End Sub
Sub f8() '二次查找
Dim MRG As Range
Set MRG = Range("A:A").Find("A")
Set mrg1 = Range("A:A").FindNext(MRG)
MsgBox mrg1.Address
End Sub
Sub F9() '區域查找
Dim MRG As Range, AAA As String
Set MRG = Range("A1:F16").Find("A")
AAA = MRG.Address
Do
Set MRG = Range("A1:F16").FindNext(MRG)
MsgBox MRG.Address
Loop Until MRG.Address = AAAEnd Sub
二 入庫單的輸入功能
Sub haa4()
Dim c As Integer '號碼在庫存表中的個數
Dim r As Integer '入庫單的數據行數
Dim cr As Integer ' 庫存明細表中第一個空行的行數
With Sheets("庫存明細表")
c = Application.CountIf(.[b:b], [g3])
If c > 0 Then
MsgBox "已存在,不要重復錄入"
Exit Sub
Else
r = Application.CountIf([b6:b10], "<>")??? ‘計算b6到b10之間的非空單元格個數
cr = .[b65536].End(xlUp).Row + 1
.Cells(cr, 1).Resize(r, 1) = [e3]
.Cells(cr, 2).Resize(r, 1) = [g3]
.Cells(cr, 3).Resize(r, 1) = [c3]
.Cells(cr, 4).Resize(r, 6) = Cells(6, 2).Resize(r, 6).Value
.Range("a:a").NumberFormat = "yyyy-m-d"
.Range("a1:k10000").HorizontalAlignment = xlCenter
MsgBox "輸入完成"
End If
End With
End Sub
三 查找功能
Sub 查找()
Dim x As Integer '單據號碼在庫存表中的個數
Dim r As Integer '入庫單的數據行數
With Sheets("庫存明細表")
x = Application.CountIf(.[b:b], [g3])
If x = 0 Then
Exit Sub
Else
r = .[b:b].Find([g3], searchdirection:=xlNext).Row
Cells(3, 3) = .Cells(r, 3)
Cells(3, 5) = .Cells(r, 1)
Cells(6, 2).Resize(x, 5) = .Cells(r, 4).Resize(x, 5).Value
MsgBox "查找已經完成"
End If
End With
End Sub
四 刪除功能
Sub 刪除()
Dim c As Integer '號碼在庫存表中的個數
Dim r As Integer? ' 入庫單的數據行數
With Sheets("庫存明細表")
c = Application.CountIf(.[b:b], [g3])
If c = 0 Then
MsgBox "不存在 不用刪除"
Exit Sub
Else
r = .[b:b].Find([g3], searchdirection:=xlNext).Row
.Range(r & ":" & r + c - 1).Delete
End If
End With
End Sub
五 修改功能
Sub 修改()
Call 刪除
Call haa4
End Sub