Option Explicit
'1 使用循環(huán)查找 (在單元格中查找效率太低)
'2 調(diào)用工作表函數(shù)
Sub c1() '判斷是否存在,并查找所在行數(shù) Dim hao As Integer Dim icount As Integer icount = Application.WorksheetFunction.CountIf(Sheets('庫(kù)存明細(xì)表').[b:b], [g3]) '調(diào)用 Excel 程序的工作表函數(shù) CountIf 統(tǒng)計(jì) B 列中 與G3單元格值相同的單元格的數(shù)量 If icount > 0 Then '如果數(shù)量大于0 MsgBox '該入庫(kù)單號(hào)碼已經(jīng)存在,請(qǐng)不要重復(fù)錄入' '彈窗提示 MsgBox Application.WorksheetFunction.Match([g3], Sheets('庫(kù)存明細(xì)表').[b:b], 0) '調(diào)用 工作表函數(shù) Match 函數(shù),要匹配的值是 g3 單元格的值,查找的范圍是 B 列,匹配方式是 0,即找到第一個(gè)匹配的值 End If End Sub
***********************************************
'3 使用Find方法(上一節(jié)有 Find 語(yǔ)法的說(shuō)明資料)
Sub c2() Dim r As Integer, r1 As Integer Dim icount As Integer icount = Application.WorksheetFunction.CountIf(Sheets('庫(kù)存明細(xì)表').[b:b], [g3]) If icount > 0 Then r = Sheets('庫(kù)存明細(xì)表').[b:b].Find(Range('G3'), Lookat:=xlWhole).Row '查找號(hào)碼第一次出現(xiàn)的位置,Lookat 參數(shù)指的是匹配方式,xlWhole是完全匹配,xlPart 是部分匹配,這里顯示說(shuō)明了參數(shù) Lookat 及參數(shù)值,與下面的方式不同,下面的方式是通過(guò)位置去匹配的。 r1 = Sheets('庫(kù)存明細(xì)表').[b:b].Find([g3], , , , , xlPrevious).Row '可以參考前一節(jié) find 函數(shù)的語(yǔ)法,find 共有9個(gè)參數(shù),除了第1個(gè),后面的都是可選參數(shù),但如此例要使用第6個(gè)參數(shù)時(shí),前面不指定的參數(shù)要用逗號(hào)表示以匹配參數(shù)的位置,后面的則可以省略。 MsgBox r & ':' & r1 End If End Sub
**********************************************
Sub c3() '返回最下一行非空行的行數(shù)
MsgBox Sheets('庫(kù)存明細(xì)表').Cells.Find('*', , , , , xlPrevious).Row '彈窗信息,在 “庫(kù)存明細(xì)表”里的單元格集合中搜索最一個(gè)非空單元格,第1參數(shù)是 星號(hào),表示有任意內(nèi)容的單元格,xlPrevious 是搜索方向向前找,即向下,xlNext向后,即向上
End Sub
============================== 入庫(kù)單實(shí)例圖及代碼
圖1
圖2
Option Explicit Sub 輸入() '此過(guò)程實(shí)現(xiàn)入庫(kù)單的錄入操作 Dim c As Integer '號(hào)碼在庫(kù)存表中的個(gè)數(shù) Dim r As Integer '入庫(kù)單的數(shù)據(jù)行數(shù) Dim cr As Integer '庫(kù)存明細(xì)表中第一個(gè)空行的行數(shù) With Sheets('庫(kù)存明細(xì)表') '注意:當(dāng)前操作的表是 入庫(kù)單 這個(gè)表,即 上圖1 ,這里有個(gè) With 的使用,即使用 庫(kù)存表的屬性 c = Application.CountIf(.[b:b], Range('g3')) '在 圖2 這個(gè)庫(kù)存表中的 b 列查找 與 圖1 入庫(kù)單 的 G3 單元格 即單號(hào) 相匹配的 行數(shù)有多少,也就是查找當(dāng)前單號(hào)下有幾個(gè)商品 If c > 0 Then '如果商品數(shù)量大于0 MsgBox '該單據(jù)號(hào)碼已經(jīng)存在!,請(qǐng)不要重復(fù)錄入' Exit Sub Else '否則,即如果不存在這個(gè)單號(hào)的話(huà) r = Application.CountIf(Range('b6:b10'), '<>') '獲取 B6:B10區(qū)域中,非真空即單元格內(nèi)容不為空的單元格個(gè)數(shù),或著當(dāng)前單據(jù)里有商品多少個(gè) cr = .[b65536].End(xlUp).Row 1 '只要用到庫(kù)存表,因?yàn)榍耙呀?jīng)使用了 with,這里可以省略為 點(diǎn),表示庫(kù)存表中 B 列最后一個(gè)有效單元格的行號(hào)再加 1,即定位到 這個(gè)單元格的下方單元格 '如上圖2示,即定位到 B8 單元格的行號(hào)
圖3 圖4 參考上圖看下面代碼 .Cells(cr, 1).Resize(r, 1) = Range('e3') '將入庫(kù)單(圖3)里的日期 寫(xiě)入 到庫(kù)存表(圖4)里 .Cells(cr, 2).Resize(r, 1) = Range('g3') '將入庫(kù)單的單號(hào)寫(xiě)入到庫(kù)存表 .Cells(cr, 3).Resize(r, 1) = Range('c3') '將入庫(kù)單的供貨公司名寫(xiě)入到庫(kù)存表 .Cells(cr, 4).Resize(r, 6) = Cells(6, 2).Resize(r, 6).Value '最后將入庫(kù)單里的 3 個(gè)商品 寫(xiě)入到庫(kù)存表里去 MsgBox '輸入已完成' End If End With End Sub
******************************************************* Sub 查找() '實(shí)現(xiàn)入庫(kù)單查尋功能 Dim c As Integer '號(hào)碼在庫(kù)存表中的個(gè)數(shù) Dim r As Integer '入庫(kù)單的數(shù)據(jù)行數(shù)
With Sheets('庫(kù)存明細(xì)表') c = Application.CountIf(.[b:b], Range('g3')) '同樣是先到庫(kù)存表里 根據(jù)單號(hào)去查尋此入庫(kù)單里有幾個(gè)商品 If c = 0 Then '如果結(jié)果是0,表示不存在這個(gè)入庫(kù)單 MsgBox '該單據(jù)號(hào)碼不存在!' Exit Sub Else '否則就把獲取到的單據(jù)商品信息給調(diào)到入庫(kù)單里去 r = .[b:b].Find(Range('g3'), , , , , xlNext).Row '使用 Find 函數(shù),在庫(kù)存表里向上查找最頂端的與當(dāng)前單號(hào)匹配的行的行號(hào) Range('c3') = .Cells(r, 3) '從庫(kù)存表中提取公司名到入庫(kù)對(duì)應(yīng) 單頭的 單位位置,即入庫(kù)單的 C3 單元格 Range('e3') = .Cells(r, 1) '提取日期 Cells(6, 2).Resize(c, 5) = .Cells(r, 4).Resize(c, 5).Value '然后就是此單號(hào)下的所有商品 MsgBox '查詢(xún)已完成' End If End With End Sub
************************************************
Sub 刪除() '刪除 指定 入庫(kù)單的操作 Dim c As Integer '號(hào)碼在庫(kù)存表中的個(gè)數(shù) Dim r As Integer '入庫(kù)單的數(shù)據(jù)行數(shù)
With Sheets('庫(kù)存明細(xì)表') c = Application.CountIf(.[b:b], Range('g3')) '在庫(kù)存表里的 B 列查尋當(dāng)前單號(hào)下商品的數(shù)量 If c = 0 Then MsgBox '該單據(jù)號(hào)碼不存在!' Exit Sub Else r = .[b:b].Find(Range('g3'), , , , , xlNext).Row '庫(kù)存表中 找到第 1 個(gè)商品,并定位它的行號(hào) .Range(r & ':' & c r - 1).Delete '根據(jù)定位的行號(hào)和商品數(shù)量,將它從庫(kù)存表中刪除。 MsgBox '刪除已完成' End If End With ********************************************* '由于這不同于 真正的 ERP 系統(tǒng),在 EXCEL 表中,要修改一個(gè)單據(jù)信息,只需要先查尋,再刪除,然后修改后重新錄入一下就好, '因?yàn)檫@里的刪除,只在庫(kù)存表清除了數(shù)據(jù),但入庫(kù)單里的信息還在,作個(gè)修改再錄入即可實(shí)現(xiàn)修改。 End Sub Sub 修改() Call 刪除 Call 輸入 End Sub
========================= Excel中MATCH函數(shù)是一個(gè)很強(qiáng)大的輔助函數(shù),
MATCH函數(shù)語(yǔ)法為:MATCH(lookup_value,lookuparray,match-type)
lookup_value:表示查詢(xún)的指定內(nèi)容;
lookuparray:表示查詢(xún)的指定區(qū)域;
match-type:表示查詢(xún)的指定方式,用數(shù)字-1、0或者1表示,具體如圖:
============================= 關(guān)于CountIF 的使用
許多EXCEL問(wèn)題都涉及數(shù)據(jù)計(jì)數(shù),對(duì)于一些簡(jiǎn)單的計(jì)數(shù),通常使用COUNT函數(shù)或COUNTA函數(shù)就可以解決。然而,在實(shí)際的業(yè)務(wù)處理當(dāng)中,往往存在諸多條件的限制,僅僅使用簡(jiǎn)單的統(tǒng)計(jì)函數(shù)是無(wú)法滿(mǎn)足人們的實(shí)際需求的,例如多條件計(jì)數(shù)、統(tǒng)計(jì)不重復(fù)個(gè)數(shù)等。
例如,在一個(gè)EXCEL表格中,D列是考生的數(shù)學(xué)考試成績(jī),我們想統(tǒng)計(jì)數(shù)學(xué)成績(jī)及格的人數(shù)??梢允褂谩?COUNTIF(D,'>=60')”來(lái)實(shí)現(xiàn)。
本例中,COUNTIF函數(shù)可以對(duì)區(qū)域中滿(mǎn)足單個(gè)條件的單元格區(qū)域進(jìn)行計(jì)數(shù)。語(yǔ)法如下:
COUNTIF(參數(shù)一,參數(shù)二),其中 參數(shù)一為需要計(jì)算其中滿(mǎn)足條件的單元格數(shù)目的單元格區(qū)域, 參數(shù)二是用于定義將對(duì)哪些單元格進(jìn)行計(jì)數(shù)的數(shù)字、表達(dá)式、單元格引用或文本字符串。
COUNTIF函數(shù)的常見(jiàn)用法如下:(假如數(shù)據(jù)所在單元格區(qū)域命名為“ Data ”) 公 式 說(shuō) 明 =COUNTIF(Data,'=') 返回真空單元格個(gè)數(shù)(真空單元格是指什么都沒(méi)有的單元格,空的單元格)
=COUNTIF(Data,'') 返回真空 假真空單元格個(gè)數(shù)(假真空是指0字符的空文本)
=COUNTIF(Data,'<>') 返回非真空單元格個(gè)數(shù)
=COUNTIF(Data,'*') 返回文本型單元格個(gè)數(shù)
=COUNTIF(Data,'<9.99E 307') 返回?cái)?shù)值型單元格個(gè)數(shù)
=COUNTIF(Data,'<>''') 返回區(qū)域內(nèi)所有單元格個(gè)數(shù)
=COUNTIF(Data,'<0') 返回偶包含負(fù)值的單元格個(gè)數(shù)
=COUNTIF(Data,'<>0') 返回真不等于零的單元格個(gè)個(gè)數(shù)
=COUNTIF(Data,60) 返回值等于60的單元格個(gè)數(shù)
=COUNTIF(Data,'>60') 返回值大于60的單元格個(gè)數(shù)
=COUNTIF(Data,'<60') 返回值小于60的單元格個(gè)數(shù)
=COUNTIF(Data,'>=60') 返回值大于等于60的單元格個(gè)數(shù)
=COUNTIF(Data,'<=60') 返回值小于等于60的單元格個(gè)數(shù)
=COUNTIF(Data,A1) 返回值與A1單元格內(nèi)容相同的單元格個(gè)數(shù)
=COUNTIF(Data,'>'&A1) 返回值大于A1單元格內(nèi)容的單元格個(gè)數(shù)
=COUNTIF(Data,'<'&A1) 返回值小于A1單元格內(nèi)容的單元格個(gè)數(shù)
=COUNTIF(Data,'???') 返回字符等于3的單元格個(gè)數(shù)
=COUNTIF(Data,'YDL') 返回值等于YDL的單元格個(gè)數(shù)
=COUNTIF(Data,'YDL?') 返回以字母YDL開(kāi)頭且字符數(shù)等于4的單元格個(gè)數(shù)
=COUNTIF(Data,'YDL*') 返回以字母YDL開(kāi)頭的文本單元格的個(gè)數(shù)
=COUNTIF(Data,'?YDL*') 返回第2,3,4字符為YDL的單元格個(gè)數(shù)
=COUNTIF(Data,'*YDL*') 返回含的YDL字符的單元格個(gè)數(shù)
=COUNTIF(Data,'*'&A1&'*') 返回包含A1單元格內(nèi)容的文本單元格個(gè)數(shù)
=COUNTIF(Data,TODAY()) 返回值等于當(dāng)前日期的單元格個(gè)數(shù)
=COUNTIF(Data,'>'&AVERAGE(Data)) 返回大于均值的單元格個(gè)數(shù)
=SUM(COUNTIF(Data,'>'&{10,15})*{1,-1}) 返回大于10小于等于15的單元格個(gè)數(shù)
=SUM(COUNTIF(Data,{TRUE,FALSE})) 返回包含邏輯值的單元格個(gè)數(shù)
特別指出的是,在EXCEL2010中,新增了一個(gè)多條件計(jì)數(shù)函數(shù),那就是“COUNTIFS” ,假如在一個(gè)EXCEL表格中,D350單元格的內(nèi)容是職工的年齡,E3:E50單元格的內(nèi)容是是否有房,F(xiàn)3:F50單元格的內(nèi)容是是否有車(chē),那么統(tǒng)計(jì)職工中35歲以上有房有車(chē)的人數(shù)應(yīng)該用如下公式:
COUNTIFS(D350,'>35',E3:E50,'是',F3:F50,'是')
|