陳浩強(qiáng) 吳紅燕 楊飛 謝俊松 張海航 梁振
摘要:該文介紹了以基于Excel的信息篩選導(dǎo)出的VBA程序設(shè)計(jì)項(xiàng)目為基礎(chǔ)展開(kāi)針對(duì)初學(xué)者的編程實(shí)踐教學(xué)的過(guò)程。通過(guò)對(duì)教學(xué)任務(wù)的科學(xué)分解和演示訓(xùn)練向程序設(shè)計(jì)初學(xué)者展示了一個(gè)項(xiàng)目開(kāi)發(fā)的思路和流程,對(duì)初學(xué)者進(jìn)一步學(xué)習(xí)和訓(xùn)練具有積極作用。本文采用的項(xiàng)目開(kāi)發(fā)者的探索式學(xué)習(xí)方式區(qū)別于傳統(tǒng)課堂學(xué)習(xí)場(chǎng)景下的系統(tǒng)性學(xué)習(xí)方式,對(duì)新工科教育的落地、對(duì)學(xué)生實(shí)踐應(yīng)用開(kāi)發(fā)能力和創(chuàng)新能力培養(yǎng)有一定的啟發(fā)意義。
關(guān)鍵詞:Excel;VBA編程;零基礎(chǔ)編程;探索式學(xué)習(xí);開(kāi)發(fā)者思維
中圖分類號(hào):G424 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)33-0261-05
The Training of Developer Thinking for Information Majors—Taking the Information Screening Project Based on Excel VBA Programming as an Example
CHEN Hao-qiang1, WU Hong-yan1,YANG Fei1, XIE Jun-song1, ?ZHANG Hai-hang2, LIANG ?Zhen1
(1.Anhui Medical University , Hefei 230032, China; 2.Hefei No.11 Middle School, Hefei 230011, China)
Abstract: This paper introduces the process of programming practice teaching for beginners on the basis of VBA program design project based on Excel.Through the scientific decomposition and demonstration training of teaching tasks, the idea and process of a project development are shown to the beginners of programming, which has a positive effect on the further learning and training of beginners.
It has a certain enlightening significance for the implementation of new engineering education and the cultivation of students' practical application development ability and innovation ability.
Key words: Excel; VBA programming; zero basic programming; exploratory learning; developer thinking
隨著計(jì)算機(jī)信息處理相關(guān)專業(yè)的發(fā)展,應(yīng)用軟件開(kāi)發(fā)所需的綜合技能逐漸增強(qiáng),所要準(zhǔn)備的技術(shù)儲(chǔ)備也愈加豐富。對(duì)于信息工程相關(guān)專業(yè)的高校學(xué)生而言,應(yīng)用軟件開(kāi)發(fā)是非常重要的技能,然而因?yàn)楦鞣N原因?qū)е聦W(xué)生對(duì)軟件開(kāi)發(fā)具有畏懼心理,不少學(xué)生遲遲不愿動(dòng)手去進(jìn)行相關(guān)的實(shí)踐訓(xùn)練。也有許多學(xué)生花費(fèi)了大量時(shí)間去學(xué)習(xí)、實(shí)踐,還是進(jìn)展緩慢,無(wú)法得到較滿意的作品,從而漸漸失去信心和興趣,轉(zhuǎn)向?qū)W⒂趥鹘y(tǒng)的課堂知識(shí)學(xué)習(xí),只求課程高分,回避主流的應(yīng)用技術(shù)實(shí)踐開(kāi)發(fā)活動(dòng)。沒(méi)有主流應(yīng)用技術(shù)的土壤滋潤(rùn),新工科教育要求的“能力”和“創(chuàng)新”方面必然有所欠缺,學(xué)校和教育工作者又要在其他方面盡可能提供支持,花費(fèi)更大的代價(jià)[1]。
作者在教學(xué)一線進(jìn)行了大量的座談和調(diào)研,發(fā)現(xiàn)學(xué)生經(jīng)常習(xí)慣性地帶入課課堂教學(xué)普遍采用的知識(shí)系統(tǒng)學(xué)習(xí)思維模式,而信息專業(yè)實(shí)踐應(yīng)用方面的開(kāi)發(fā)工作往往需要根據(jù)目標(biāo)功能就某方面的知識(shí)進(jìn)行針對(duì)性深入學(xué)習(xí)或者探索式學(xué)習(xí)。這兩種學(xué)習(xí)指導(dǎo)思想本身是根據(jù)目標(biāo)不同而產(chǎn)生,只是在大多數(shù)情況下并不能被清晰區(qū)分,從而導(dǎo)致學(xué)生們?cè)趹?yīng)用能力學(xué)習(xí)方面付出代價(jià)較高。這樣的情況下,學(xué)生對(duì)開(kāi)發(fā)實(shí)踐可能會(huì)產(chǎn)生畏懼心理,還有些學(xué)生有了課堂學(xué)習(xí)無(wú)用的想法。甚至有些學(xué)生為此不愿去工作而選擇進(jìn)一步考研,希望在研究生階段能夠更加系統(tǒng)地學(xué)習(xí)相關(guān)理論和實(shí)踐技能,然后再就業(yè)從事相關(guān)工作。
為了讓學(xué)生體會(huì)到程序設(shè)計(jì)的開(kāi)發(fā)者思維與系統(tǒng)學(xué)習(xí)思維的不同,盡可能讓他們打消對(duì)計(jì)算機(jī)軟件開(kāi)發(fā)的畏懼感,并體會(huì)軟件開(kāi)發(fā)工作的成就感和樂(lè)趣[2]。本文通過(guò)對(duì)項(xiàng)目式教學(xué)的研究,結(jié)合多所高校開(kāi)設(shè)的公共計(jì)算機(jī)應(yīng)用課程——VisualBasic6.0程序設(shè)計(jì),針對(duì)剛剛?cè)胄5母咝W(xué)生進(jìn)行了一次項(xiàng)目教學(xué)的嘗試[3]。
項(xiàng)目以對(duì)Office的Visual Basic for Applications(本文簡(jiǎn)稱“VBA”)開(kāi)發(fā)為技術(shù)基礎(chǔ),時(shí)間大約2學(xué)時(shí),功能目標(biāo)是要在Excel工作簿基礎(chǔ)上實(shí)現(xiàn)一個(gè)數(shù)據(jù)篩選處理功能,根據(jù)已有的數(shù)據(jù)篩選形成一個(gè)數(shù)據(jù)集。
1 項(xiàng)目的用戶需求分析
該項(xiàng)目教學(xué)的訓(xùn)練內(nèi)容設(shè)定是為某部門信息管理員提供一個(gè)基于Excel的信息篩選導(dǎo)出的應(yīng)用系統(tǒng),可以幫助我們解決需要頻繁重復(fù)填寫、提交各種格式個(gè)人信息的問(wèn)題。
教學(xué)訓(xùn)練過(guò)程中采用思維導(dǎo)圖逐層展開(kāi)的方式作為輔助,再結(jié)合實(shí)際環(huán)境下的演示操作,可以讓訓(xùn)練內(nèi)容更加有條理、便于學(xué)生理解。為了讓學(xué)生課后也能回顧和跟練,本教學(xué)團(tuán)隊(duì)還對(duì)整個(gè)教學(xué)過(guò)程進(jìn)行屏幕錄像,把視頻文件分享給了學(xué)生。
教學(xué)訓(xùn)練的開(kāi)始是先提出平時(shí)工作、學(xué)習(xí)中常見(jiàn)的重復(fù)填表問(wèn)題,請(qǐng)學(xué)生參與討論,分別列舉出可行的解決辦法。然后根據(jù)學(xué)生們的方案逐個(gè)分析其優(yōu)缺點(diǎn)、技術(shù)路線和所需要的技術(shù)儲(chǔ)備,最后提出較小代價(jià)開(kāi)發(fā)和便于用戶使用的理念并引出VBA編程的方案。
本項(xiàng)目所設(shè)定的問(wèn)題場(chǎng)景下,面對(duì)的用戶就是基層信息管理員。用戶擁有自己部門各成員的基本信息,這些數(shù)據(jù)集中、規(guī)范地保存在一個(gè)Excel文件里。因此,訓(xùn)練的開(kāi)始就要新建一個(gè)Excel文件,按照預(yù)設(shè)場(chǎng)景中的格式添加虛擬的數(shù)據(jù)信息以便進(jìn)一步處理。
2 規(guī)劃解決方案
從原始數(shù)據(jù)生成最終的結(jié)果,需要對(duì)數(shù)據(jù)進(jìn)行重新組織,那就必須建立一個(gè)原始數(shù)據(jù)和結(jié)果數(shù)據(jù)的對(duì)照聯(lián)系,用于表示兩種數(shù)據(jù)形式的關(guān)系。比較簡(jiǎn)單的一種處理方式,就是直接在當(dāng)前Excel工作簿里新建2個(gè)工作表,其中一個(gè)用于保存最終的結(jié)果,另一個(gè)用于存放臨時(shí)的對(duì)照表,用于設(shè)定要導(dǎo)出的數(shù)據(jù)項(xiàng)。根據(jù)其特點(diǎn),這兩個(gè)工作表可以分別命名為“結(jié)果表”“處理表”。
作為原始數(shù)據(jù)表和結(jié)果表的橋梁,處理表里面應(yīng)該同時(shí)能夠體現(xiàn)原始數(shù)據(jù)表和結(jié)果表的字段信息,并讓用戶能靈活地選擇、配置。同時(shí),原始數(shù)據(jù)表的字段數(shù)量應(yīng)該是多于結(jié)果表的,那么,處理表里也無(wú)須直接列出結(jié)果表的字段名。因此,處理表的結(jié)構(gòu)可以設(shè)置為圖3所示的結(jié)構(gòu)。
其中,第1行、第2行來(lái)自原始數(shù)據(jù)表,第1行主要用于標(biāo)記列的編號(hào),引用數(shù)據(jù)列的時(shí)候更加直觀。第3行用于表示是否選中原始數(shù)據(jù)表的當(dāng)前字段。
如果用戶最終所需要的結(jié)果字段名和原始數(shù)據(jù)表的字段名不完全一致,只要內(nèi)容一致,可以在結(jié)果表里面進(jìn)一步人工調(diào)整修改。這樣的設(shè)計(jì)可以減輕編程任務(wù)、簡(jiǎn)化處理表的結(jié)構(gòu),完成最終目標(biāo)的效率反而會(huì)增加,代碼的適應(yīng)性也會(huì)更好。
需要注意的是,現(xiàn)在常用的Excel版本下,普通文檔默認(rèn)保存的擴(kuò)展名為xlsx,但是針對(duì)編寫了VBA宏代碼的文檔應(yīng)保存為xlsm格式。這是Office出于對(duì)文檔信息安全的設(shè)計(jì),可以在一定程度上防止未知代碼的惡意操作。
2.1本項(xiàng)目的目標(biāo)
本項(xiàng)目的目標(biāo)大體上可以分為技術(shù)學(xué)習(xí)和功能實(shí)現(xiàn)兩個(gè)方面。
作為針對(duì)零基礎(chǔ)學(xué)生的教學(xué),技術(shù)學(xué)習(xí)應(yīng)該針對(duì)項(xiàng)目功能所需要的技術(shù)點(diǎn)展開(kāi),在介紹完一個(gè)技術(shù)知識(shí),應(yīng)該盡可能快地把它應(yīng)用于項(xiàng)目功能的實(shí)現(xiàn)。
由于技術(shù)知識(shí)的學(xué)習(xí)主要圍繞項(xiàng)目功能實(shí)現(xiàn)所需要的范圍進(jìn)行,整個(gè)學(xué)習(xí)過(guò)程就有非常強(qiáng)的以目標(biāo)驅(qū)動(dòng)進(jìn)行探索式學(xué)習(xí)的特點(diǎn)。
2.2從大目標(biāo)出發(fā)規(guī)劃小目標(biāo)
基于軟件開(kāi)發(fā)的自頂向下、逐步求精原則[4],要把做的工作按功能和相互關(guān)系劃分為一個(gè)個(gè)具體的小目標(biāo)。小目標(biāo)的劃定不僅有利于分步驟實(shí)現(xiàn)對(duì)應(yīng)的具體功能,還可以幫助學(xué)生在項(xiàng)目管理的視角下分析項(xiàng)目、開(kāi)闊思路。
為了減少開(kāi)發(fā)難度,可以先手工把原始數(shù)據(jù)表里的前兩行復(fù)制到處理表對(duì)應(yīng)的位置,做好一定的數(shù)據(jù)的準(zhǔn)備。那么第一個(gè)目標(biāo)就是根據(jù)處理表里第3行的值判斷用戶選中了哪些數(shù)據(jù)列(字段)。
目標(biāo)二:假設(shè)上述功能已經(jīng)實(shí)現(xiàn),就要根據(jù)所選中的字段,從原始數(shù)據(jù)表里復(fù)制數(shù)據(jù)。如果把數(shù)據(jù)直接放在結(jié)果表里,還涉及存放順序、空白列的問(wèn)題,就會(huì)有些復(fù)雜??梢韵劝堰@些數(shù)據(jù)放在處理表第4行及以下的部分,可以避免問(wèn)題的復(fù)雜度,還便于對(duì)照參考是否復(fù)制了正確的數(shù)據(jù)。
目標(biāo)三:在數(shù)據(jù)已經(jīng)正確存放到處理表對(duì)應(yīng)字段下方的情況下,可以接著把數(shù)據(jù)再?gòu)奶幚肀韽?fù)制到結(jié)果表。
最后就可以在已經(jīng)完成的工作基礎(chǔ)上,改進(jìn)、增添功能,讓用戶使用起來(lái)更加方便。
3 項(xiàng)目的實(shí)施
這部分的策略主要是圍繞目標(biāo)問(wèn)題進(jìn)行分析,通過(guò)網(wǎng)絡(luò)搜索對(duì)應(yīng)的關(guān)鍵詞逐步學(xué)習(xí)、逐層深入。
在演示和功能實(shí)施的過(guò)程中,出于訓(xùn)練的需要,盡可能特意“產(chǎn)生”一些常見(jiàn)錯(cuò)誤。通過(guò)這些小錯(cuò)誤的發(fā)現(xiàn)、定位、分析、解決,呈現(xiàn)開(kāi)發(fā)者“調(diào)試”代碼的過(guò)程,可以讓學(xué)生理解并掌握一定的程序調(diào)試能力。此外還要盡可能對(duì)代碼編寫注釋,這個(gè)習(xí)慣在言傳身教下對(duì)學(xué)生的影響也是非常直接的。
3.1目標(biāo)一的實(shí)現(xiàn)——判斷用戶選中了哪些數(shù)據(jù)列
考慮到零基礎(chǔ)的情況,這部分的功能實(shí)現(xiàn)還有必要再分為更細(xì)的步驟:先讀取處理表第3行第1列單元格的數(shù)據(jù)并輸出,然后判斷它是否被選中,再逐個(gè)讀取第3行所有的單元格數(shù)據(jù)并判斷其選中狀態(tài)。
通過(guò)搜索“ExcelVBA編程”“ExcelVBA讀寫單元格”、類似的關(guān)鍵詞,根據(jù)結(jié)果頁(yè)里的提示進(jìn)行操作,很快就可以了解到對(duì)Excel展開(kāi)VBA編程的方法、對(duì)某個(gè)工作表單元格數(shù)據(jù)的讀取和寫入的方法。讀取到數(shù)據(jù)后,為了便于查看,還要知道如何查看得到的數(shù)據(jù),繼續(xù)搜索“ExcelVBA輸出數(shù)據(jù)”即可了解到常用的Msgbox對(duì)話框輸出功能。
獲取單元格數(shù)據(jù)有多個(gè)方法,這里可以根據(jù)搜索結(jié)果集的情況,演示即可。
方法一:
Msgbox Range("A2").value '通過(guò)對(duì)話框輸出讀取到的單元格“A2”的內(nèi)容
方法二:
MsgboxWorksheets(1).Cells(2, 3)'讀取到從左到右,序號(hào)為1的工作表,第2行、第3列的單元格
VBA編程的基本語(yǔ)法遵從VisualBasic程序設(shè)計(jì)語(yǔ)言(以下簡(jiǎn)稱VB語(yǔ)言)的規(guī)則,通過(guò)解釋代碼含義根據(jù)項(xiàng)目功能所需對(duì)VB語(yǔ)言進(jìn)行簡(jiǎn)單梳理并列舉相對(duì)簡(jiǎn)單的例子演示其基本功能和特點(diǎn)??梢院?jiǎn)單介紹:變量、數(shù)據(jù)類型、賦值語(yǔ)句、注釋、數(shù)據(jù)輸出、if語(yǔ)句、for語(yǔ)句、函數(shù)及其基本應(yīng)用。
從程序設(shè)計(jì)循環(huán)結(jié)構(gòu)的特點(diǎn)結(jié)合讀寫單元格數(shù)據(jù)的兩種方法,可以讓學(xué)生體會(huì)到上述方法二比較適合接下來(lái)的編程應(yīng)用。
3.1.1讀取“處理表”的選中標(biāo)記數(shù)據(jù)
可以先實(shí)現(xiàn)讀取一個(gè)單元格的數(shù)據(jù),同時(shí)輸出進(jìn)行觀察,確保讀取的數(shù)據(jù)和預(yù)期一致。
Sub test()
Msgbox Worksheets(2).Cells(3, 1)
End Sub
再連續(xù)讀取多個(gè)單元格,為了讓初學(xué)者更容易看明白,可以只考慮前5列的數(shù)據(jù)。這樣簡(jiǎn)化問(wèn)題的策略也是開(kāi)發(fā)者常采用的方法,可以避免復(fù)雜問(wèn)題帶來(lái)的錯(cuò)誤和思維混亂。
For i = 1 To 5
Msgbox Worksheets(2).Cells(3, i)
Next i
說(shuō)明:根據(jù)VBA編程的特點(diǎn),這部分代碼應(yīng)該放在“Subtest()”和“EndSub”之間,本文后續(xù)描述將不再特別說(shuō)明。
3.1.2判斷讀到的數(shù)據(jù)是否符合“選中”的條件
根據(jù)實(shí)際情況,可以先設(shè)定假如讀到的數(shù)值是1,就認(rèn)為用戶選定了這一列。先手工把第3行的第1列單元格的內(nèi)容設(shè)置為1,然后編寫代碼:
MsgboxWorkSheets(3).Cells(3,1)=1
觀察運(yùn)行結(jié)果,如果顯示結(jié)果為“true”即可判定這部分功能邏輯上成立,可以進(jìn)一步完善代碼功能。
再引入if語(yǔ)句講解和演示條件判斷的應(yīng)用邏輯關(guān)系:
For i = 1 To 5 '先考慮前5列數(shù)據(jù)的判斷
If Worksheets(2).Cells(3, i) = 1 Then
Msgbox"第" &3 & "行" i & "列被選中"
Endif
Next i
3.2 目標(biāo)二的實(shí)現(xiàn)——從原始數(shù)據(jù)表里復(fù)制數(shù)據(jù)
這部分的目標(biāo)是把用戶選中的數(shù)據(jù)列(字段)復(fù)制到第4行開(kāi)始的區(qū)域,可以先把原始數(shù)據(jù)表對(duì)應(yīng)的字段名稱也復(fù)制一遍,這樣便于對(duì)照排錯(cuò)。
3.2.1復(fù)制部分?jǐn)?shù)據(jù)
先假定對(duì)第3行、第2列的值進(jìn)行判斷,假如用戶選中了此列,就應(yīng)該把原始數(shù)據(jù)表里第2行、第2列的字段名(列名)復(fù)制到處理表的第4行、第2列。
If Worksheets(2).Cells(3,2) = 1 Then
Worksheets(2).Cells(4, 2) = Worksheets(1).Cells(2, 2) '把字段名稱放到數(shù)據(jù)區(qū)開(kāi)頭的一行
Endif
那么對(duì)于前5列的數(shù)據(jù)連續(xù)判斷和復(fù)制多個(gè)字段名就應(yīng)該寫成:
'這里要實(shí)現(xiàn)的是把第3行前5列的內(nèi)容進(jìn)行判斷,根據(jù)是否為1決定是否復(fù)制數(shù)據(jù)表對(duì)應(yīng)列的字段名。
For i = 1 To 5 ? 'i代表列號(hào),簡(jiǎn)單的名稱方便描述和理解
If Worksheets(2).Cells(3,i) = 1 Then
Worksheets(2).Cells(4, 2) = Worksheets(1).Cells(2, 2) '把字段名稱放到處理表
Endif
Next i
接下來(lái)就可以把對(duì)應(yīng)字段的數(shù)據(jù)也復(fù)制到“處理表”。同樣,為了簡(jiǎn)化問(wèn)題,可以假定只復(fù)制5行數(shù)據(jù)。
'僅復(fù)制前5行(包括字段名)、5列
For j= 1 To 5 'j代表行號(hào)
For i = 1 To 5 ? 'i代表列號(hào)
If Worksheets(2).Cells(3,i) = 1 Then
Worksheets(2).Cells(j+3, 2) = Worksheets(1).Cells(j+1,i)
Endif
Next i
Nextj
3.2.2復(fù)制所有的數(shù)據(jù)到處理表
為了更加便于自動(dòng)、準(zhǔn)確處理數(shù)據(jù),原始數(shù)據(jù)表里的數(shù)據(jù)區(qū)域行數(shù)、列數(shù)通過(guò)代碼進(jìn)行判斷和處理更好。
處理的思路是設(shè)定一個(gè)規(guī)范的“數(shù)據(jù)表”:要求“數(shù)據(jù)表”必須滿足所有行、列的內(nèi)容都應(yīng)該是連續(xù)的(無(wú)空白的行或者空白列分隔)。尤其是對(duì)第一行、第一列,可以規(guī)定其在有效的數(shù)據(jù)區(qū)域內(nèi),不允許設(shè)置為空白值,用于確保數(shù)據(jù)區(qū)域的連續(xù)和代碼判斷數(shù)據(jù)區(qū)域的方便性。那么,即使后期數(shù)據(jù)表的數(shù)據(jù)區(qū)域發(fā)生了變化,在執(zhí)行宏代碼的時(shí)候也可以快速判斷行數(shù)和列數(shù),不需要再次手動(dòng)修改代碼。
作為一個(gè)特定用途的項(xiàng)目,這樣的設(shè)定完全可以作為一個(gè)數(shù)據(jù)表必須滿足的規(guī)范。
那么我們對(duì)數(shù)據(jù)處理的邏輯就是:從左到右順序掃描第一行各個(gè)單元格的值,一旦發(fā)現(xiàn)某個(gè)單元格內(nèi)容為空,表明數(shù)據(jù)區(qū)域的列已經(jīng)結(jié)束。這時(shí)可以記錄到當(dāng)前列為止的列數(shù),作為后續(xù)評(píng)判數(shù)據(jù)區(qū)的依據(jù)。從上到下順序掃描第一列一旦發(fā)現(xiàn)某個(gè)單元格內(nèi)容為空,表明數(shù)據(jù)行已經(jīng)結(jié)束,可以記錄到當(dāng)前列為止的列數(shù),作為后續(xù)評(píng)判數(shù)據(jù)區(qū)的依據(jù)。
到目前為止,由于只學(xué)習(xí)了一個(gè)循環(huán)語(yǔ)句for…next語(yǔ)句,這部分代碼就可以寫為:
For i = 1 To 16384 ?'16384這是一個(gè)Excel工作表默認(rèn)的列數(shù)最大值,i代表列數(shù)
If Worksheets(1).Cells(2, i) = "" Then '假定數(shù)據(jù)列是連續(xù)的,字段行空白,數(shù)據(jù)列結(jié)束
lie = i - 1 '工作表1“信息表”總共有l(wèi)ie個(gè)列,便于后續(xù)處理
Exit For
End If
Next i
當(dāng)然,這部分功能更加適合的是do…loop語(yǔ)句,但是作為初學(xué)者,for語(yǔ)句更加友好、便于理解。后續(xù)可以安排學(xué)生自己學(xué)習(xí)do…loop結(jié)構(gòu)的循環(huán)語(yǔ)句并把這里的代碼改進(jìn)、完善。
把這部分功能進(jìn)行綜合,將得到以下程序代碼:
Sub 信息提取到結(jié)果表()
'假定處理表里面的數(shù)據(jù)都為空白
'獲取原始數(shù)據(jù)表(工作表1)里面的列數(shù)
For i = 1 To 16384
If Worksheets(1).Cells(2, i) = "" Then '假定數(shù)據(jù)列連續(xù),第一行某字段為空,數(shù)據(jù)列結(jié)束
lie = i - 1 '工作表1“信息表”總共有l(wèi)ie個(gè)列,便于后續(xù)處理;lie的值其他代碼公用
Exit For
End If
Next i
'把“信息表”的前兩行的數(shù)據(jù)移到“處理表”序號(hào)用于定位標(biāo)記
For i = 1 To lie
Worksheets(2).Cells(1, i) = Worksheets(1).Cells(1, i)'復(fù)制數(shù)據(jù)表第1行
Worksheets(2).Cells(2, i) = Worksheets(1).Cells(2, i)'復(fù)制數(shù)據(jù)表第2行
If Worksheets(2).Cells(3, i) = 1 Then
For j = 2 To 1048576 ? ?'Excel工作表默認(rèn)最多可以有1048576行
If Worksheets(1).Cells(j, 1) = "" Then
'假定各行數(shù)據(jù)連續(xù)的,空白序號(hào)列,數(shù)據(jù)結(jié)束
hang = j - 1 ? ?'存放數(shù)據(jù)區(qū)域的總行數(shù),后續(xù)代碼可以使用此值
Exit For ? ?'不再繼續(xù)掃描更多的行
Else
Worksheets(2).Cells(j + 2, i) = Worksheets(1).Cells(j, i)
'復(fù)制數(shù)據(jù)到處理表
End If
Next j
End If
Next i
End Sub
程序在第一次執(zhí)行的時(shí)候,因?yàn)檫€沒(méi)有在處理表的第3行選中任何列,代碼不會(huì)復(fù)制數(shù)據(jù)區(qū)域的內(nèi)容,只是把原始數(shù)據(jù)表里面的前兩行復(fù)制到了處理表里。接下來(lái),在用戶選中特定列后,再次執(zhí)行這段代碼,即可復(fù)制相關(guān)的數(shù)據(jù)。
3.3目標(biāo)三的實(shí)現(xiàn)——把數(shù)據(jù)放入結(jié)果表
實(shí)現(xiàn)的方法也有很多,比較簡(jiǎn)單的是在上述代碼里添加復(fù)制數(shù)據(jù)到結(jié)果表的代碼即可。代碼如下:
Worksheets(3).Cells(j - 1, i) = Worksheets(1).Cells(j, i) ?'復(fù)制原始數(shù)據(jù)表的數(shù)據(jù)到結(jié)果表
所要注意的是,未選中的列是空值,而結(jié)果表里的數(shù)據(jù)應(yīng)該是連續(xù)的列,可以通過(guò)代碼刪除空的列。
For i = lie To 1 Step -1 ? '從數(shù)據(jù)區(qū)域最右側(cè)的一列開(kāi)始判斷
If Worksheets(3).Cells(1, i).Value = "" Then '第1行為空,表示當(dāng)前列為空
Worksheets(3).Columns(i).Delete ?'刪除列
End If
Next i
對(duì)于初學(xué)者而言,這里是一個(gè)難點(diǎn),需要解釋為什么循環(huán)變量從右到左逐列判斷、處理。因?yàn)樯婕皠h除一列的時(shí)候,循環(huán)變量從右向左追溯對(duì)代碼執(zhí)行沒(méi)有影響,而從左往右逐列檢查,空列刪除后循環(huán)變量的變化情況稍微有些復(fù)雜,可以以擴(kuò)展任務(wù)的方式布置給學(xué)生去思考、觀察和實(shí)現(xiàn)。
4 功能實(shí)用性擴(kuò)展
經(jīng)過(guò)上述的演示和講解,學(xué)生已經(jīng)可以理解Excel的VBA編程思路和特點(diǎn),結(jié)合網(wǎng)絡(luò)信息檢索完全可以獨(dú)立獲取對(duì)應(yīng)功能的核心代碼并應(yīng)用到項(xiàng)目開(kāi)發(fā)中。
完成了項(xiàng)目預(yù)先設(shè)定的基本功能之后,還應(yīng)該從用戶的實(shí)際使用環(huán)境和需求出發(fā)進(jìn)行功能改進(jìn)和升級(jí)。這一階段主要是多考慮用戶的實(shí)際使用環(huán)境,以用戶使用更加便捷、高效為準(zhǔn)。
4.1考慮多個(gè)數(shù)據(jù)表的場(chǎng)景
考慮到用戶的實(shí)際工作環(huán)境中的原始數(shù)據(jù)表可能是以多個(gè)工作表的形式存放,以上代碼和功能可以在這方面適當(dāng)升級(jí)改進(jìn)。解決方案的設(shè)計(jì)原則是便于用戶操作,并且盡可能小幅度調(diào)整先前的方案。
為此,可以在處理表的上方新增2行,用于存放當(dāng)前所有的工作表、讓用戶確定選擇哪一個(gè)工作表進(jìn)行篩選導(dǎo)出。其中,第1行通過(guò)VBA代碼自動(dòng)獲取并填入當(dāng)前工作簿的所有工作表名稱,用戶在第2行輸入選中標(biāo)記,通過(guò)代碼判斷當(dāng)前處理過(guò)程選中的是哪一個(gè)工作表。同時(shí),要規(guī)定一次只允許選擇一個(gè)工作表進(jìn)行字段數(shù)的提取。相應(yīng)地,先前處理表中的相關(guān)行功能也要做適當(dāng)調(diào)整,向下推動(dòng)2行。
獲取當(dāng)前工作簿里所有工作表的關(guān)鍵代碼如下:
for each gzb in Worksheets
k=k+1
cells(1,k)=gzb.name '獲取當(dāng)前工作簿中所有的工作表名稱放入第1行
next
因?yàn)楣ぷ鞅淼脑龆嘁矌?lái)順序序號(hào)的問(wèn)題,可以把結(jié)果表放在所有工作表的最前面,把處理表作為第2個(gè)工作表,相應(yīng)地需要把上述代碼中涉及工作表序號(hào)的部分修改調(diào)整。
4.2數(shù)據(jù)結(jié)果存入獨(dú)立的文檔
Excel的VBA編程功能強(qiáng)大、靈活,可以實(shí)現(xiàn)打開(kāi)指定的word文檔或Excel工作簿并存入數(shù)據(jù),也可以直接新建word文檔或Excel工作簿并存入指定的數(shù)據(jù)。完全可以根據(jù)需要在指定位置輸出一個(gè)或多個(gè)相關(guān)文檔并存入數(shù)據(jù),甚至可以設(shè)置特定數(shù)據(jù)的格式、樣式。
4.3結(jié)合Word郵件合并功能
既然已經(jīng)可以根據(jù)需要導(dǎo)出所需的數(shù)據(jù),那么, 以導(dǎo)出數(shù)據(jù)作為數(shù)據(jù)源,結(jié)合Word的“郵件合并”功能,也可以快速生成多個(gè)Word文檔或者直接打印多份指定格式的文稿[5]。
4.4添加快捷按鈕和快捷鍵
Excel的標(biāo)簽欄、工具按鈕可以根據(jù)需要定制,自己編寫的宏代碼也可以以“按鈕”的方式放在“工具選項(xiàng)卡”或者“快速訪問(wèn)工具欄”,可以實(shí)現(xiàn)“一鍵運(yùn)行”,用起來(lái)更加方便、快捷。
5 總結(jié)
從功能方面來(lái)看:
本項(xiàng)目代碼工作量不大、靈活性高,開(kāi)發(fā)周期短。項(xiàng)目實(shí)施過(guò)程中充分考慮了用戶的實(shí)際需求和使用便捷性,能夠解決信息聯(lián)絡(luò)員頻繁進(jìn)行數(shù)據(jù)收發(fā)的一般需求。對(duì)于更特殊的需求,也可以根據(jù)具體情況對(duì)相關(guān)功能進(jìn)行調(diào)整。
從教學(xué)模式上看:
這樣一個(gè)零基礎(chǔ)就可以聽(tīng)得懂、做得到的項(xiàng)目,作為項(xiàng)目教學(xué)的案例,既具有一定難度,又有較好的靈活性和可擴(kuò)充性。
項(xiàng)目實(shí)施過(guò)程中通過(guò)對(duì)總目標(biāo)的層層分解、逐步細(xì)化,以零基礎(chǔ)學(xué)生的知識(shí)背景逐漸展開(kāi)知識(shí)點(diǎn)介紹和功能實(shí)施,邏輯清晰、目標(biāo)明確。不僅可以消除學(xué)生對(duì)程序設(shè)計(jì)的畏懼感和神秘感、了解項(xiàng)目開(kāi)發(fā)的全過(guò)程、體驗(yàn)開(kāi)發(fā)者思考方式,也可以獨(dú)立、快速完成一個(gè)實(shí)用性較高的作品。此外,項(xiàng)目的改進(jìn)方案多樣,難度適中,比較有利于學(xué)生發(fā)揮想象力、進(jìn)行拓展訓(xùn)練。
綜上,本項(xiàng)目對(duì)信息學(xué)科相關(guān)老師、對(duì)應(yīng)用編程感興趣的學(xué)生而言都是一個(gè)不錯(cuò)的案例。
參考文獻(xiàn):
[1] 沈光,洪一明.新工科背景下高校實(shí)驗(yàn)室促進(jìn)創(chuàng)新人才培養(yǎng)的治理策略[J].實(shí)驗(yàn)室研究與探索,2020,39(8):263-266.
[2] 王迷迷,鄭英,張立珍.“互聯(lián)網(wǎng)+”背景下創(chuàng)客項(xiàng)目式教學(xué)研究[J].信息系統(tǒng)工程,2020(7):155-156.
[3] 王艷芬.基于項(xiàng)目式教學(xué)的安卓開(kāi)發(fā)公選課改革探索[J].教育教學(xué)論壇,2020(33):171-173.
[4] 倪飛舟.Visual Basic程序設(shè)計(jì)教程[M].北京:中國(guó)水利水電出版社,2010:276.
[5] 何振娟,王瑋,劉海,等.Excel中VBA及Word郵件合并功能在批量處理報(bào)表中的應(yīng)用[J].電腦知識(shí)與技術(shù),2021,17(6):212-214.
【通聯(lián)編輯:唐一東】
收稿日期:2021-07-15
基金項(xiàng)目:安徽醫(yī)科大學(xué)2017年校級(jí)質(zhì)量工程項(xiàng)目教學(xué)研究項(xiàng)目(2017076);EAST AST長(zhǎng)脈沖數(shù)據(jù)的實(shí)時(shí)發(fā)布系統(tǒng)研究(2012SQRL265);安徽省高校質(zhì)量工程項(xiàng)目(2017jyxm1322)
作者簡(jiǎn)介:陳浩強(qiáng)(1979—),男,安徽界首人,講師,碩士,主要研究方向?yàn)榍度胧较到y(tǒng)設(shè)計(jì)。