EXCEL具備強(qiáng)大的數(shù)據(jù)處理能力,,但像數(shù)據(jù)庫(kù)那樣連接二個(gè)表,并且把一個(gè)表的數(shù)據(jù)寫(xiě)到另一個(gè)表中,,就顯得為難了,。或許有人會(huì)復(fù)制粘貼,,但二個(gè)表可能記錄數(shù)不同、記錄順序不同,,所以排序后復(fù)制粘貼無(wú)法做到一一對(duì)應(yīng),。EXCEL中的函數(shù)VLOOKUP提供了這種處理能力,但該函數(shù)使用復(fù)雜,、運(yùn)算量大,。ACCESS數(shù)據(jù)庫(kù)軟件能輕松處理不同表之間的連接與處理,但許多人并不掌握ACCESS,。本人根據(jù)平時(shí)應(yīng)用需要,,使用VB編寫(xiě)了一個(gè)小程序,實(shí)現(xiàn)連接二個(gè)EXCEL表實(shí)現(xiàn)互寫(xiě)的功能,,本文介紹該程序的使用方法及代碼概要,,并提供程序和測(cè)試數(shù)據(jù)下載。 下載:www. 一,、程序使用方法: 1,、程序界面: 3,、注意事項(xiàng): 4,、實(shí)際測(cè)試剪圖:(表中數(shù)據(jù)均為虛擬數(shù)據(jù)) 二,、程序核心設(shè)計(jì)(以下內(nèi)容適用于VB編程) 1、VB控制EXCEL: 然后定義應(yīng)用程序,、工作薄對(duì)象、工作表對(duì)象后,,就可以引用了,。如下語(yǔ)句: Dim XLapp As New Excel.Application Set XLapp = CreateObject("Excel.Application") Set XLbook1 = XLapp.Workbooks.Open(PathA) Set XLsheet1 = XLbook1.Sheets(1) XLsheet1.Activate 2,、常用引用或操作代碼: a)、獲取數(shù)據(jù)所在區(qū)域的行列:選中A1后獲取數(shù)據(jù)區(qū)域的最大行號(hào)和最大列號(hào) XLsheet1.Range("A1").Select b),、引用單元格,,如要把表1中的某單元格值,寫(xiě)到表2中的某單元格: XLsheet2.Cells(1, j) = XLsheet1.Cells(1, i) 表1中第1行第i列對(duì)應(yīng)的單元格的值寫(xiě)到表2的1行j列中,。cells(m,n)是比較靈活的引用方式,可以使用變量m,n來(lái)表示對(duì)應(yīng)行列值,,往往用在循環(huán)中,。另一種引用方式 Range("A1"),比較適用引用固定單元格,,如A列的不同行,,也可使用變量來(lái)引用,如:Range("A" & i),,但列如果使用變量就較難引用了,,所以還是使用Cells(m,n)方便些。第三種方式是R1C1引用方式,,往往用在公式中,,也可以靈活地使用變量,,詳見(jiàn)下面公式使用說(shuō)明。 引用行或列,,比較容易,,如:Columns(i).Select表示選中第i列,Rows(j)表示第j行,。 c),、保存或不保存工作表: 對(duì)工作表的操作完成后,需要保存或不保存退出,。保存使用工作薄XLbook的Save方法:XLbook1.Save,;如果不保存,則使用:XLbook.Saved = True,,告訴EXCEL工作薄已經(jīng)保存過(guò)了(實(shí)際上沒(méi)有保存),,EXCEL會(huì)信以為真,在退出時(shí)不再提醒也不作保存直接退出了,。 3,、本程序使用的核心公式介紹: 本程序的核心公式使用的是VLOOKUP函數(shù),描述如下: 功能:VLOOKUP 函數(shù)搜索某個(gè)單元格區(qū)域的第一列,,然后返回該區(qū)域相同行上任何單元格中的值,。 語(yǔ)法:VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup]) 示例:=VLOOKUP(A2,'工作表2'!$A$2:$F$7425,3,FALSE) 示例解釋?zhuān)罕热缭诠ぷ鞅?的C2單元格中鍵入以上公式,EXCEL執(zhí)行的操作就是在工作表2的A2:F7425區(qū)域(這個(gè)區(qū)域?yàn)橐訟2單元格為左上角,,以F7425單元格為右下角的數(shù)據(jù)塊,,共有A-F共6列、2-7425共7424行,,是一個(gè)比較大的區(qū)塊)的第一列中,,搜索與工作表2 的A2單元格值相同的單元格,假設(shè)搜索到在工作表2的A1000單元格中,,則返回工作表1的單元格C1000(注意第3個(gè)參數(shù)是3,,表示第3列)的值,寫(xiě)入到工作表2中公式所在單元格C2中。 注意:這個(gè)公式寫(xiě)在1個(gè)單元格中,,盡管搜索了一大塊區(qū)域,,但最終返回的僅是一個(gè)單元格數(shù)據(jù)。如果需要把工作表A的整1列寫(xiě)到B表中,,則需在B表的該列全部單元格中應(yīng)用此公式,。可使用整列填充公式的方法,,填充時(shí)A2自動(dòng)會(huì)變?yōu)锳3,、A4...,而工作表2的數(shù)據(jù)區(qū)域必須使用“$”符界定為固定區(qū)域,,不能隨填充而變化,。 4、三種不同的調(diào)用語(yǔ)法: EXCEL數(shù)據(jù)表公式,、EXCEL的VBA公式,、VB語(yǔ)言調(diào)用EXCEL公式時(shí),該公式的寫(xiě)法完全不同,,編程時(shí)要特別加以區(qū)分,,以下仍以上述公式為例進(jìn)行說(shuō)明。 a),、EXCEL數(shù)據(jù)表中使用公式:---------------------- =VLOOKUP(A2,'工作表2'!$A$2:$F$7425,3,FALSE) 直接在單元中鍵入此公式,,不需另加引號(hào)。注意第二個(gè)參數(shù)中區(qū)域的引用,,工作表需要用單引號(hào)包括,,之后跟一個(gè)間隔符(感嘆號(hào)),再寫(xiě)數(shù)據(jù)區(qū)域,,數(shù)據(jù)區(qū)域需用$界定,。全部字符特別是標(biāo)點(diǎn)均不能為中文全角。 b),、EXCEL中VBA的代碼使用公式格式:------------------ VBA是VB的子集,,集成在EXCEL里,可直接控制EXCEL,。通過(guò)以下方法獲得上述公式的VBA代碼:通過(guò)工具菜單下宏的功能中來(lái)錄制一個(gè)宏,,操作步驟為寫(xiě)入以上公式。錄制后,,進(jìn)入工具——宏——VB編輯器查看代碼,發(fā)現(xiàn)鍵入公式不再是以上格式,,而變?yōu)椋?/font> Range("M2").Select 活動(dòng)單元格中鍵入公式 對(duì)比直接錄入時(shí)的格式,,VBA代碼中此公式已面目全非: 直接錄入: =VLOOKUP(A2,'工作表2'!$A$2:$F$7425,3,FALSE) VBA生成: "=VLOOKUP(RC[-5],'工作表2'!R2C1:R7425C6,3,FALSE)" 說(shuō)明:VBA代碼表述公式時(shí),不能使用“A2”這種引用方式,,而是使用R1C1引用,,這可以從上述代碼“FormulaR1C1”看出,,而且只能使用此種方式。R1C1引用直接用R定義行,,用C定義列,,有二種指定行列的辦法,一是使用偏移量,,如R[3]表示當(dāng)前行往下3行,,RC[-5]表示當(dāng)前行(R后沒(méi)有跟數(shù)字)、往左5列(所以是負(fù)12),,在本實(shí)例中就是A2單元格,。而R2C1:R7425C6就代表數(shù)據(jù)區(qū)域,好理解,。公式中其他格式不變,。 c)、VB中該公式的語(yǔ)法:------------------------- StrB = "=VLOOKUP(RC[-" & Column_1 & Chr(39) & "[" & & & i & ",FALSE)" ?。ㄋ{(lán)色字表示固定不變的字符串,,紅色的表示需要在程序執(zhí)行時(shí)變化的變量,&是連接符,,Chr(39)特指一個(gè)ASC字符即單引號(hào)) "=VLOOKUP(RC[-12],'[工作薄1.xls]工作表2'!R2C1:R7425C6,3,FALSE)" 5,、字典對(duì)象及其使用: 1),、本程序關(guān)于VB字典對(duì)象的代碼實(shí)例: 01行:arr = XLsheet2.Range("A2:A500")) 02行:Set d = CreateObject("Scripting.Dictionary") 09行: 10行:Next 代碼詳釋?zhuān)?/font> 01行:arr是一個(gè)數(shù)組,可以把EXCEL的一個(gè)范圍區(qū)域直接賦給數(shù)組,,一般區(qū)域R行C列,,則這個(gè)數(shù)組也是R行C列的二維數(shù)據(jù),如果是1列區(qū)域,,那就是R行1列,,引用時(shí)也要按二維數(shù)組處理; 02行:在VB中設(shè)置創(chuàng)建一個(gè)字典對(duì)象,; 03行-05行:UBound(arr)函數(shù)獲得arr數(shù)組的最大下標(biāo),,從而知道該列有多少行。然后用(arr(s,1))循環(huán)獲得每一行的值,,注意這里引用數(shù)組時(shí)是二維形式,,d(arr(s,1))表示:字典對(duì)象d中某個(gè)關(guān)鍵字為arr(s,1)的項(xiàng)的項(xiàng)目,這里用于計(jì)數(shù)關(guān)鍵字重復(fù)出現(xiàn)的次數(shù),。04行就表示,,對(duì)一個(gè)關(guān)鍵字arr(s,1),如果未出現(xiàn)過(guò)就添加到字典對(duì)象中,,如果已出現(xiàn)過(guò)則該項(xiàng)目計(jì)數(shù)加1,; 06行-07行:當(dāng)原EXCEL數(shù)據(jù)區(qū)域的數(shù)據(jù)全部存入字典對(duì)象d后,注意原數(shù)據(jù)可以有重復(fù),,但存入字典對(duì)象d后,,所形成一個(gè)新的數(shù)組,該數(shù)組實(shí)際是有二列,,第一列是所有不重復(fù)關(guān)鍵字集合,,第二列是該關(guān)鍵字的出現(xiàn)次數(shù)。06行把存放所有關(guān)鍵字的數(shù)組賦給a,,07行把所在存放對(duì)應(yīng)項(xiàng)目(這里是計(jì)數(shù)值)的數(shù)組賦給b,。 08行-10行:把字典對(duì)象里所有關(guān)鍵字和項(xiàng)目對(duì)一一打印到立即窗口,。 2)、字典對(duì)象使用文檔 1,、字典對(duì)象是由 Microsoft 腳本庫(kù)提供,并不是現(xiàn)成的 Visual Basic 組件,,也不是VBA的組件,,包含在庫(kù)文件scrrun.dll中,使用字典對(duì)象有2種引用方法: 方法1:引用 c:\windows\system32\scrrun.dll 然后 dim d as new Dictionary 方法2: Set d = CreateObject("Scripting.Dictionary") 2,、字典對(duì)象的主要原理:字典對(duì)象實(shí)際上是維護(hù)一個(gè)數(shù)據(jù)表,,該表有2列、任意行,,行的多少僅受存儲(chǔ)空間限制,。第1列鍵(key),特點(diǎn)是不能重復(fù),,第2列項(xiàng)目(item),,與key相關(guān)聯(lián)。使用時(shí),,key可以是除數(shù)組外的任意數(shù)據(jù)類(lèi)型,,item則可存入各類(lèi)雜七雜八的數(shù)據(jù)類(lèi)型包括數(shù)組。 3,、引用方法: 引用項(xiàng)目:d.item(key) 鍵的總數(shù):d.count 獲取全部key: 獲取全部item: d.items 返回一個(gè)數(shù)組包含全部item 寫(xiě)入一個(gè)新鍵:d.add key,item 判斷某鍵是否存在: d.Exists(key) 刪除一個(gè)鍵:d.Remove(key) 刪除全部鍵:d.RemoveAll 如果引用一個(gè)不存在的鍵,字典對(duì)象就會(huì)添加這個(gè)鍵,。 |
|
來(lái)自: 南齊書(shū)館 > 《待分類(lèi)》