摘 要:論述了利用EXCEL的VBA編程功能,把相當大的數據處理任務交給程序自動進行處理, 實現了表格的自動批量復制打印,實現了辦公自動化,提高了EXCEL在實際應用中的工作效率及節省人力資源。
關鍵詞:EXCEL VBA ;批量打印;登記卡;辦公自動化
1 問題的提出
在體育教學過程中,體育教師每年都要對學生進行體質健康測試,還要填《國家學生體質健康標準》登記卡上報數據。比如要實現如下一項任務,見圖1、圖2和圖3。
要求把圖1中的數據按照圖2、圖3 《國家學生體質健康標準》登記卡的格式填寫完整并打印輸出。按照常規的方法,把第一個人的信息依次復制到要打印的表格中,然后打印,再復制下一個人員,依此類推。如果人很多的話,這項工作很是繁瑣,也容易出錯。因此,我寫了一個VBA程序,讓工作自動進行。
1.1什么是VBA?
在Office軟件中,VBA應用程序能夠在Word、Excel等之間進行交互式應用,加強了應用程序間的互動。
1.2實現方法
為了描述方便,筆者將含有數據的表格(圖1)命名為數據表,其工作表標簽為“成績統計”,將要打印的《國家學生體質健康標準》登記卡(圖1、圖2)命名為“1-2年級打印”、“3-4年級打印”、“5-6年級打印”,其工作表標簽相應命名。
2 系統設計
2.1程序設計的主要思路
假設此工作是用手工操作的話,比如從第2行記錄打印到第10行記錄,那么操作過程應該是這樣的:把數據表中的D4單元格中的“諸葛亮”復制到登記表中的C4單元格中,把數據表中的E4復制到登記表中的I4,依此類推,直至把“諸葛亮” 的一分鐘跳繩的成績復制到登記表中對應的D16單元格中,數據復制完成后,打印輸出,這樣就完成了第2行記錄的操作,接下來復制“夏侯惇”的數據到登記中,然后再打印。如此一直到第10 行記錄“任盈盈”。根據這個工作流程,如果用程序來實現的話,可以通過循環的方式復制數據表中的數據到登記表中對應的位置,再用循環的方式處理多個不同人員的信息。
2.2程序的功能
根據工作中的需要,程序應該可以實現多種批量打印的形式,主要包括以下幾種:
(1) 連續的記錄,如從第5行到第50行。
(2) 不連續的記錄,如第5、10、15、20行這四條記錄。
(3) 根據學籍號打印某一條記錄。
(4) 分年級打印記錄。
(5) 分班級打印記錄。
上述幾種形式在某些時候可以達到相同的目的,如第(2) 種形式中,選擇連續的記錄就和第(1)種形式相同,選擇單個的記錄就與第(3)種形式相同;第(4) 種形式和第(5) 種形式結構相同。
2.3程序的關鍵技術
第一、由程序的設計思路可知,程序運行時用戶就要告訴程序處理的是哪些數據。由于各年級的表格不盡相同,就需要分別調用對應的表格模板。
第二、由于要處理不同人員的數據,以及提取相應信息,所以要用到兩個循環。處理不同人員的數據時,調用對應的學籍號就可以了;而提取相應的信息,要在各自的模板中進行,再由程序調用。
第三、程序要能與用戶交互。可以由用戶選擇打印或不打印哪些數據。
第四、由于程序要批量打印,也讓用戶心中有數,因此,已經打印過的數據要做出記號,避免重復。
3 用戶界面的設計和代碼的編寫
在新的excel工作簿里建6個工作表,標簽名稱分別為“成績統計”、“評分標準”、“測試成績”、“1-2年級打印”、“3-4年級打印”、“5-6年級打印”。前面3個工作表的內容網上有,這兒就不介紹了。后面3個工作表,分別把各自對應的模板復制過來就好,分別在右上角添加一個命令按鈕,其顯示為“打印登記卡”作為用戶召喚打印頁面的選擇。在Excel中按ALT+F11,可以打開VBE界面,點擊“插入”——“用戶窗體”,就插入了一個窗體,為了在程序中方便地引用它,可以把它的名稱改為U12print,用同樣的方法再添加兩個窗體,分別命名為U34print、U56print如圖4。
在窗體的上部放一個文本框,作為輸入口,一個命令按鈕其顯示為“查詢”。相關的代碼如下:
Private Sub cmd查詢_Click()
Dim SQL$, i&
If Trim(Text1.Text) = “” Then Exit Sub
Check1.Value = False: Check2.Value = False: Check3.Value = False
SQL = "Select * from [成績統計$A4:AM" & myR & "] where f3 like '%" & UCase(Trim(Text1.Text)) & "%'"
List1.Clear
If rs.State <> 0 Then rs.Close
rs.Open SQL, cnn, 1, 3
If rs.RecordCount > 0 Then
For i = 0 To rs.RecordCount - 1
If rs.Fields(2) <> "" Then List1.AddItem rs.Fields(2) '學籍號
rs.MoveNext
Next
End If
End Sub
在窗體的中部放一個列表框控件list1,以便顯示學生學籍號。右邊兩個多選按鈕其顯示為“已打印 登記卡”、“未打印 登記卡”,下邊一個多選按鈕“選中全部記錄”。右邊兩個顯示為“打印”和“關閉”的命令按鈕。相關的代碼如下:
以上代碼是打印1—2年級的,其他年級的與此相似。
值得說明的是,列表框控件的MultiSelect屬性應該設置為2-fmMultiSelectExtended,這樣,用戶可以利用Shift和Ctrl鍵對列表框中的記錄進行多項選擇。當用戶選擇“未打印 登記卡”時列表框中出現所有還未打印的列表選項,用戶可以自由選擇打印。
要打印的數據源要從圖1往圖2圖3的對應位置引用。如要打印圖2任盈盈的資料,這樣引用:在C4單元格里輸入“=IF($M$4="","",INDEX(成績統計!$A:$AL,MATCH($M$4,成績統計!$C:$C,0),4))”其他引用的數據與此相似就不多介紹了。最后,新建一個模塊1,把顯示為“打印登記卡”的命令按鈕與窗體聯系起來,代碼如下:
4 程序的測試和運行
用戶在各頁選擇“打印登記卡”時分別召喚對應的窗體,套用對應模板打印對應數據。如圖4、圖5、圖6。
用戶在窗體選擇“未打印 登記卡”時,列表框中列出當前未被打印的數據,選擇“選中全部記錄”時,再按“打印”就可以全部打印。
5 結語
經過試驗,程序可以正常運行并實現系統設計中的功能。由此看出,在Excel中,VBA提供了廣大的可自由擴展的空間,可以用VBA來編制適合自己專用的程序,大大減輕工作量,更好地利用計算機為我們服務。
參考文獻
[1]崔曉宏.用VBA實現批量復制和打印任務[J].電腦編程技巧與維護,2010(21).86-89.
[2]羅剛君.EXCELVBA程序開發自學寶典(第3版)[M].北京:電子工業出版社,2014.
[3]shywkb.2014學生體質健康測試計算模板(中、小學).Excelhome論壇[M].北京:人民郵電出版社,2012.
作者簡介
范拽拽(1980-),男,漢 山西省洪洞縣,大專,漢語言文學。