這是我首次嘗試寫Excel教程,工作多年發覺很多同學始終被數據處理所困擾,故想把平時積累的一點點心得和經驗分享一下。
很多打工人們經常遇到一個問題,我左手有一堆數據,右手有格式一模一樣的表格,我要把數據填到這些表格,並且全部一份份列印出來,如何才能快速做到?一個數據一個數據地貼真是太悲慘了,比如員工的工資單、固定資產的盤點單、訂貨單、快遞單等
這個問題來自我原來的一位同事,前些天請我幫忙,也是知乎上不少人問過我的問題,我發現這個小小業務竟然困擾了很多人,所以準備把自己一個比較不成熟的解決方法分享出來,我們使用最簡單的VBA。
具體思路如下,設計兩張表格,一張是數據表,一張是單據模板:
數據列表:把我們要填入單子的數據以數據列表形式整理出來,形式如下:
注意點:我們需要將第一列的固定資產號,作為非重複唯一值欄位 ,注意必須第一列
然後我們設計好單據模板,這裡可以調整好我們需要列印的格式:
注意點:我們現在B2單元格粘貼複製其中一個數據列表中的固定資產編號,也就是我們設定的非重複唯一值列表中的其中一個,然後其他幾個欄位內容我們用vlookup函數帶出來,這樣一來,一張模板就做好了
然後我們把表格保存成*.xlsm格式,這是一個可以帶宏運行模式的表格,接著點開Excel選項-自定義功能區-主選項卡複選框內把我們的開發工具勾選上
這樣一來,我們回到Excel主頁面可以看到開發工具選顯卡,我們從這裡進入Visual Basic功能區,進入我們的編程頁面
之後,會來到一個編程界面,我們在工程頁面,點擊-右鍵-插入-模塊
然後將以下代碼複製到模塊當中:
Sub createCard()'行索引Dim i As Long'存放臨時表單名Dim sname As String'從第2行開始i = 2'進入循環,如果數據列表A列第i行為空,或者出現結束文本內容,就結束循環'sname先保存數據列表中Ai位置的內容,也就是固定資產編號'然後複製一張單據模板,將單據模板中B2位置的內容,也就是數據編號欄位替換為當前的sname'將賦值出來的表格名稱改為sname,也就是固定資產編號,如此一來生成的表格不會重名'這也是為何數據列表一定要有一列是非重複唯一值欄位的原因Do If Sheets("數據列表").Range("A" & i) = "" Or Sheets("數據列表").Range("A" & i) = "結束" Then Exit Do sname = Sheets("數據列表").Range("A" & i) Sheets("單據模板").Copy Before:=Sheets(1) Sheets("單據模板 (2)").Range("B2") = sname Sheets("單據模板 (2)").Name = sname i = i + 1LoopEnd Sub然後我們保存一下工程,回到Excel主頁面中,在數據列表這裡插入一個按鈕,連結一下我們剛寫的程序,這樣我們點一下按鈕程序就會跑起來了
Excel會讓我們選擇宏,我們只要指定剛才編寫的createCard()事件即可
然後我們按住ctrl鍵點擊按鈕,可以給它重命名:批量生成卡片
按一下,我們需要的表單都生成了!數據列表中的每條流水,都有了自己對應的表格
如果我們需要批量列印,那麼只需要,按住crlt選中數據列表和數據模板這兩張表,右鍵隱藏
然後在列印頁面選擇列印整個工作簿即可
如果下次要重用就先把隱藏的數據列表和表單模板放出來,把已經生成的表格都刪除就行了
是不是很簡單呢,是不是vba也不難呢?
然而這就結束了嗎,當然不是,通過這樣一個簡單的例子,我們要思考,背後隱藏了什麼原理?
這是一個非常典型的資料庫查詢模式,數據列表的呈現形式是很多管理系統中數據表的table,而單據模板,則是典型的view,我們可以在單據模板上加上更複雜的功能比如做一些欄位的運算、拼接、求值、判斷等,但這一切都來源於我們對數據列表的設計,正如我在《為什麼不用複雜的Excel函數一文》中中寫的那樣:數據處理和數據分析工作的前端是如何能夠快速高效地整理和存儲數據,如何切割數據之間的關係,滿足資料庫設計的範式需求又能滿足業務邏輯,可能還需要一點設計模式的概念,這會省去我們很多後期絞盡腦汁想一些奇技淫巧、寫完三個月自己都看不懂的代碼和函數,減少數據清理工作的工作量。
同時,這篇作為vba入門的基礎,同時涉及了幾個基本知識點:
如何創建vba工程、數據聲明、賦值、循環(進入和結束)、判斷、表格區域的定位模式(取值與賦值)
相信很多同學看到這裡,肯定覺得vba不難,不需要去學習很長的視頻,也不需要花錢去培訓班,甚至書都不需要買,哪裡不懂在Excel按F1,查詢內容,依樣畫葫蘆,不知道功能怎麼用直接錄製宏,根據系統生成的宏代碼拿來就用即可。
如果你有同樣的業務困擾,試著根據以上步驟練習一下,拿自己的數據修改一下,跑一下試試,相信會有收穫,同時也思考下如果數據列表第一列值不唯一的時候會發生什麼呢?
下集預告:《如和快速地通過數據列表生成表格並列印-1對多關係》
將用三種方法講解,由於篇幅很長,所以會拆成三章敬請期待!