上一篇博客《教你快速入門Excel-宏與VBA(上)》,我們主要對Excel宏與VBA進行了簡單的介紹和使用說明,這次我們做一個宏與VBA的簡單實例,通過這個實例,瞭解宏與VBA的優勢所在,在此之前,讀者有必要了解一下Excel中單元格,行和列的命名和VB的一些基礎語法,這裏我們不做過多的解釋。
需求說明:
某學校要進行體育測試,需要根據輸入的成績,自動對應得分,同時自動計算總分,具體表如下:
表一
表二
解決方案:
在表一中輸入成績,自動在表二中查找,該成績所對應的分數,比如圖中張偉的《負重深蹲(次)》項目成績是40,那麼通過查詢表二,她的得分應該是97,同時張偉的《負重深蹲(次)》項目得分自動更新爲97,對應總分更新爲97;
該問題解決依賴簡單的錄製宏不好實現,這裏我們使用VBA編寫代碼:
模塊代碼:
點擊單元格獲取成績:
'點擊時,獲取成績
Public Sub CellsClick(ByVal Target As Range)
'選擇有效表格的區域,否則跳過
If Target.Column < 4 Or Target.Row < 5 Or Target.Column > ActiveSheet.UsedRange.Columns.Count - 1 Or Target.Row > ActiveSheet.UsedRange.Rows.Count Then
Exit Sub
End If
Dim selectedCol As Integer
Dim j As Integer
Dim isUpdate As Boolean
selectedCol = (Target.Column - 4) \ 2 + 2 '獲取 表二 中對應列號
'行循環
For j = 2 To Worksheets("表二").UsedRange.Columns.Count Step 1
If Cells(Target.Row, Target.Column).Value <> "" And Cells(Target.Row, Target.Column).Value = Worksheets("表二").Cells(j, selectedCol).Value Then
'MsgBox "你選中了:" & Worksheets("表二").Cells(j, selectedCol).Value & "得分" & Worksheets("表二").Cells(j, 1).Value
Cells(Target.Row, Target.Column + 1).Value = Worksheets("表二").Cells(j, 1).Value
isUpdate = True
End If
Next
If Not isUpdate Then
Cells(Target.Row, Target.Column + 1).Value = ""
End If
'列循環,自動求和
Dim sum As Double
sum = 0
For j = 5 To ActiveSheet.UsedRange.Columns.Count - 3 Step 2
sum = sum + Val(Cells(Target.Row, j).Value)
Next
Cells(Target.Row, ActiveSheet.UsedRange.Columns.Count - 1).Value = sum
End Sub
宏函數:激活時,自動獲取全部成績,也可用於填寫成績自動獲得得分,但是由於每次都要激活全部單元格進行刷新,所有如果用此方法解決,則會產生Excel反應慢或是半天沒有反應的情況,所以該方法只對應到得分按鈕即可,即得分按鈕指定宏爲Worksheet_Activate!
'激活時,自動獲取全部成績
Public Sub WorksheetActivate()
Dim selectedCol As Integer
Dim r As Integer
Dim c As Integer
Dim j As Integer
Dim isUpdate As Boolean
'行循環
For r = 5 To ActiveSheet.UsedRange.Rows.Count
'列循環
For c = 4 To ActiveSheet.UsedRange.Columns.Count - 1 Step 2
isUpdate = False
selectedCol = (c - 4) \ 2 + 2 '獲取 表二 中對應列號
For j = 2 To Worksheets("U15-16女附").UsedRange.Rows.Count
If Cells(r, c).Value <> "" And Cells(r, c).Value = Worksheets("表二").Cells(j, selectedCol).Value Then
Cells(r, c + 1).Value = Worksheets("表二").Cells(j, 1).Value
isUpdate = True
End If
Next
'如果沒有更新,值爲""
If Not isUpdate Then
Cells(r, c + 1).Value = ""
End If
Next
Next
End Sub
表一代碼:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row = Selection.Row - 1 And Target.Column = Selection.Column Or Target.Row = Selection.Row And Target.Column = Selection.Column - 1 Then
'修改立即獲取成績
CellsClick Target
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'點擊時獲取成績
CellsClick Target
End Sub
至此,簡單的宏和VBA實例已經講完了,複雜的問題簡單化了吧!所以當你遇到在Excel中需要不斷重複一些操作時,就應該考慮使用宏和VBA來解決了,非常方便,更重要的是節省時間呀!