這篇技術文章我們講一下:怎麼用VBA模塊計算一些稍微複雜的表。
(今天發的的幾個短視頻段子,播放量團滅,很難過。還是講技術吧)
用AccessVBA模塊來對表進行計算,相當于用Excel的函數來計算,二者在本質上沒有區别。了解Excel函數的人能夠理解我在講什麼。
用Access數據庫計算的效果
和Excel函數相比,用VBA模塊對表進行計算有利有弊:
優點是:
1.計算能力強。用Excel計算兩三個字段就比較吃力了,在Excel單元格裡寫代碼,會導緻單元格比較臃腫。而Access的VBA模塊在這方面能力強一些。
2.調整容易。用VBA模塊計算,便于函數的維護和拓展,計算過程清楚不容易亂。接下來會用案例來解釋這個問題
Access數據庫VBA模塊
用VBA模塊計算也有缺點:
1.學習成本高。得了解什麼叫變量,Function怎麼用。編程就沒有輕松的,會有一些坑。
2.會被鄙視。搞編程的碼農會鄙視你,說你用VBA很low,搞得你很煩。(很奇怪,按這個原理,搞Excel函數不是更“low”嗎?)
下面講一下這個案例:
一、本案例的需求介紹
這個案例是一所高中的真實案例:以周為單位,計算每名老師的課時費。
這個工作用Excel完成有些麻煩(但不是不行),主要計算需求如下(為了循序漸進的教學,進行了适當的簡化):
1.該學校的教課老師有100多名,有6個學科:
語文
數學
英語
物理
化學
生物
2.每周20小時内,語文數學英語100元小時,物理化學生物80元1小時
3.每周超過20小時,所有科目都是200元每小時。
在實際的案例中,每個老師教的班級還有快慢之分,給快班講課的補助價格更高一些。但為了講解方便,我今天先省略這個需求。
二、表設計思路
1.必須設計成一維表形式
用Excel也可以這個計算,用函數就可以。
但是表的設計必須遵循一維表的形式,無論是Excel還是Access的表都必須遵循這個原則,不然設計容易亂。
尤其是Excel設計更容易亂。
2.表的字段要嚴格控制
這個表的字段一共就4個:
時間
老師
科目
課時
用Access來設計表的話,字段裡不需要設計價格、沒有星期。價格在VBA裡體現,星期用查詢(SQL)自動生成。
這就是Access框架的威力,Excel就很難做的這麼清爽簡約。據我所知,Excel做星期查詢很難。
3.表的更新
這個計算做成之後,隻要定期往表裡更新數據就行,老師上一天課就更新一條,更新完之後,計算結果就自動生成了,報表也能自動化生成。
三、查詢設計
簡單來說,這個課時費計算的Access查詢需要兩步:
1.生成周查詢表
2.在周查詢基礎上,加上計算字段,計算字段運用的是VBA的模塊(VBA模塊是本文的核心)
先要解釋一下為什麼要兩次查詢,因為這個需求的時間範圍是按周彙總,如果一次查詢完成計算的話,SQL會亂。
1.生成周查詢
這個技術我之前做過,代碼界面如下:
第一次查詢
2.計算字段
計算字段包括5個
一類課時量
二類課時量
一類課時費
二類課時費
總課時費
第二次查詢
一類課時就是每周20節以内的課時,二類課時就是每周超過20節的課時。
四、VBA模塊設計
下面是我們本文的核心,VBA模塊設計。本需求我采用的是一個模塊,下面四個函數,四個函數共用兩個變量就可以。
其實VBA模塊一點都不神秘,核心就是設計方程、解方程:
y=f(x1,x2)
再詳細一點,y=Function(x1,x2)
這個Function英語就是方程(也叫函數)的意思,也就是VBA模塊裡我們要設計的一種計算方法,原理沒什麼難的。
比如,我們設計一個函數
x1=2
x2=2
y=f(x1,x2)=(x1 x2)^2
x1和x2相加再平方這個過程,就是一個函數(Function)計算。
Excel裡要計算的話,就是直接新起個單元格,單元格裡輸入:
=(A1 B1)^2
用Excel來計算這個計算課時費需求也完全可以,但是如前所述,Excel很難計算複雜情況,比如我們本次需求就不這麼簡單,至少有兩個判斷:
1.判斷這個老師教的是什麼課,數學外語語文的課時費就高一些。
2.判斷這個老師這周上沒上夠20節,上夠是一個錢、沒上夠是一個錢。
用Excel來算就顯得不那麼簡單了。
更何況這個需求,比我實際交給客戶的需求還簡化的多:客戶要求的需求還有不同班級的不同費用,等于多了一個維度的計算。用Excel做就非常吃力了(這也是為什麼客戶找到我)。
我們這個需求的VBA代碼有5個函數(Function),分别對應上個章節的5個計算字段
模塊有兩個總的變量,一個是每周的總課時(通過第一次查詢計算得到的),第二個是科目。
兩個變量
每個函數用方程表示就是
一類課時費=f(每周總課時,科目)
二類課時費=f(每周總課時,科目)
以此類推
VBA模塊總界面
五、VBA代碼設計
每個函數的代碼設計,我承認對初學者有點難,但是學了一會就會覺得也不過如此,基本就是If Else語句判斷。
我們以一類課時量為例
分為以下兩種情況
1.當周上課沒到20節
一類課時量=f(每周總課時)=當周課時
2.當周上課超過20節
一類課時量就是20節。
第一檔課時數
二類課時量也分兩種情況
1.當周上課沒到20節,那麼:
二類課時量=0
2.當周上課超過20節
二類課時量就是:周課時量-20
第二檔課時數
(看懂了嗎?沒看懂公屏 1)
因為課時量不受科目的計算,所以方程裡沒有科目。如果計算課時費的話,就要加上科目,計算稍微複雜一些。
一類課時費:
1. 沒到20節
數學語文外語
一類課時費=當周課時量*100
其他科目
一類課時費=當周課時量*80
第一檔課時費
2.超過20節
數學語文外語
一類課時費=20*100
其他科目
一類課時費=20*80
邏輯就是這樣,二類課時費、總課時費的VBA,大家照貓畫虎做一下。
六、做報表
最好查詢之後,就是界面的設計和美化了。這方面技術我講的很多。不做贅述。
我建議用報表的形式,方便又快捷、簡約又大方。
總體效果
有問題就在評論區交流哈~想學習、想領取這個案例給我留言哈~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!