1. 程式人生 > >教你高速入門Excel-巨集與VBA(續)

教你高速入門Excel-巨集與VBA(續)

引言    

    通過上次的解說(教你高速入門(上))(教你高速入門(下))。相信一些簡單的問題大家已經能夠使用巨集和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。提取公共部分!