教你高速入門Excel-巨集與VBA(續)
阿新 • • 發佈:2018-11-21
引言
通過上次的解說(教你高速入門(上))(教你高速入門(下))。相信一些簡單的問題大家已經能夠使用巨集和VBA來攻克了。那假設遇到大資料時怎麼辦?在日常生活中我們須要處理的可不止簡單的一兩張表,非常可能是20。30張表甚至很多其它!假設你遇到這種問題不要著急,這裡我就來給大家解說一下Excel中的大資料處理問題。
例項
接著上次簡單演示樣例來說,假設如今須要處理的表單不再是一個,而是多個,比如,須要統計多個年齡段的籃球運動員其身體素養成績,那麼原先的程式碼就不能實現了。由於之前的sheet名已經寫“死”,僅僅能是特定附表的資料。當然解決問題也非常easy,僅僅要簡單的改動一下程式碼,使其自己主動獲得當前表(所需表)的sheet名,然後把sheet名作為引數傳遞就可以。
OK,改動程式碼例如以下:
模組程式碼:
Option Explicit '啟用時,<span style="font-family: KaiTi_GB2312; ">求和,</span><span style="font-family: KaiTi_GB2312; ">自己主動獲取所有成績</span> Public Sub WorksheetActivate() Dim selectedCol As Integer Dim r As Integer Dim c As Integer Dim j As Integer Dim isUpdate As Boolean Dim FileName As String FileName = GetName() + "附" '行迴圈 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(FileName).UsedRange.Rows.Count If ActiveSheet.Cells(r, c).Value <> "" And ActiveSheet.Cells(r, c).Value = Worksheets(FileName).UsedRange.Cells(j, selectedCol).Value Then ActiveSheet.Cells(r, c + 1).Value = Worksheets(FileName).UsedRange.Cells(j, 1).Value isUpdate = True End If Next '假設沒有更新。值為"" If Not isUpdate Then ActiveSheet.Cells(r, c + 1).Value = "" End If Cells(r, c + 1).Select Next Next End Sub '點選時,獲取成績 Public Sub CellsClick(ByVal Target As Range) Dim FileName As String FileName = GetName() + "附" '僅僅能選擇(5,4)到有效表格的區域。否則跳過 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 '獲取 <span style="font-family: KaiTi_GB2312; ">當前表附表</span><span style="font-family: KaiTi_GB2312; "> 中相應列號</span> If Target.Column Mod 2 = 0 Then '行迴圈 For j = 2 To Worksheets(FileName).UsedRange.Rows.Count Step 1 If ActiveSheet.Cells(Target.Row, Target.Column).Value <> "" And ActiveSheet.Cells(Target.Row, Target.Column).Value = Worksheets(FileName).UsedRange.Cells(j, selectedCol).Value Then ActiveSheet.Cells(Target.Row, Target.Column + 1).Value = Worksheets(FileName).UsedRange.Cells(j, 1).Value isUpdate = True End If Next If Not isUpdate Then ActiveSheet.Cells(Target.Row, Target.Column + 1).Value = "" End If End If '列迴圈。自己主動求和 Dim sum As Double sum = 0 For j = 5 To ActiveSheet.UsedRange.Columns.Count - 1 Step 2 sum = sum + Val(ActiveSheet.Cells(Target.Row, j).Value) Next ActiveSheet.Cells(Target.Row, ActiveSheet.UsedRange.Columns.Count).Value = sum End Sub <span style="color:#ff0000;"> </span>'獲取當前操作的檔名 Private Function GetName() As String GetName = ActiveSheet.Name End Function
主表程式碼:
Option Explicit 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
總結
多表操作思想:
1.多表操作時要注意分類,一般各表之間不是孤立存在的。把同類型(比方按性別分類。按年齡段分類,按年級 分類)放到一個Excel裡去處理;
2.一個Excel中多表之間操作要注意引數傳遞,資料獲取方式和啟用問題,多做測試。
優化思想:
一項工作反覆多遍時,肯定能夠優化,優化方式非常easy。提取公共部分!