Excel VBA 常用代碼


基本操作科普: (1)打開宏編輯頁面 Alt+F12; (2)運行宏 F5 #復制完代碼,按下F5就等結果好了 (3)逐行運行宏代碼 F8 #調試代碼很好用 (4)中斷宏代碼 Ctrl+Break #出現無腦無限循環時候很好用 (5)在宏編輯頁面下,選中需要操作的工作薄,插入模塊后粘貼代碼 (6)錄制宏是個極好的入門神奇

 

一、工作表處理:

1.一鍵生成帶超鏈接的工作表目錄

點擊查看代碼

    Sub ml()
    Dim sht As Worksheet, i&, strShtName$
    Columns(1).ClearContents
     '清空A列數據
    Cells(1, 1) = "目錄"
    '第一個單元格寫入字符串"目錄"
    i = 1
    '將i的初值設置為1.
    For Each sht In Worksheets
        '循環當前工作簿的每個工作表
        strShtName = sht.Name
        If strShtName <> ActiveSheet.Name Then
        '如果sht的名稱不是當前工作表的名稱則開始在當前工作表建立超鏈接
            i = i + 1
            '累加i
            ActiveSheet.Hyperlinks.Add anchor:=Cells(i, 1), Address:="", SubAddress:="'" & strShtName & "'!a1", TextToDisplay:=strShtName
            '建超鏈接
        End If
    Next
    End Sub  
### 2. 一鍵批量取消工作表隱藏
點擊查看代碼

    Sub qxyc()
        Dim sht As Worksheet
        '定義變量
        For Each sht In Worksheets
        '循環工作簿里的每一個工作表
            sht.Visible = xlSheetVisible
             '將工作表的狀態設置為非隱藏
        Next
    End Sub  
### 3. 一鍵匯總各分表數據到總表
點擊查看代碼

    Sub collect()

    'VBA編程學習與實踐,一鍵多表數據匯總~看見星光

    Dim sht As Worksheet, rng As Range, k&, trow&

    Application.ScreenUpdating = False

    '取消屏幕更新,加快代碼運行速度

    trow = Val(InputBox("請輸入標題的行數", "提醒"))

    If trow < 0 Then MsgBox "標題行數不能為負數。", 64, "警告": Exit Sub

    '取得用戶輸入的標題行數,如果為負數,退出程序

    Cells.ClearContents

    '清空當前表數據

    Cells.NumberFormat = "@"

    '設置文本格式

    For Each sht In Worksheets

    '遍歷表格

        If sht.Name <> ActiveSheet.Name Then

        '如果表格名稱不等於當前表名則進行復制數據……

            Set rng = sht.UsedRange

            '定義rng為表格已用區域

            k = k + 1

            '累計K值

            If k = 1 Then

            '如果是首個表格,則K為1,則把標題行一起復制到匯總表

                rng.Copy

                [a1].PasteSpecial Paste:=xlPasteValues

            Else

                '否則,扣除標題行后再復制黏貼到總表,只黏貼數值

                rng.Offset(trow).Copy

                Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1).PasteSpecial Paste:=xlPasteValues

            End If

        End If

    Next

    [a1].Activate

    '激活A1單元格

    Application.ScreenUpdating = True

    '恢復屏幕刷新

    End Sub
### 4. 按指定名稱批量建立工作表

'VBA根據A列數據批量建立工作表的代碼如下:

點擊查看代碼

    Sub NewSht()
    'ExcelHome VBA編程實踐與學習
    Dim Sht As Worksheet, Rng As Range
    Dim Sn, t$
    Set Rng = Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)
    '將工作表名稱所在的單元格區域賦值給變量Rng,單元格A1是標題,不讀入
    On Error Resume Next
    '當代碼出錯時繼續運行
    For Each Sn In Rng
    '遍歷Rng(工作表名稱集合)
        t = Sn
        '還記得這里我們為什么用這句代碼嗎?
        Set Sht = Sheets(t)
        '當工作簿不存在工作表Sheets(t)時,這句代碼會出錯,然后……
        If Err Then
        '如果代碼出錯,說明不存在工作表Sheets(t),則新建工作表
            Worksheets.Add , Sheets(Sheets.Count)
            '新建一個工作表,位置放在所有已存在工作表的后面
            ActiveSheet.Name = t
            '新建的工作表必然是活動工作表,為之命名
            Err.Clear
            '清除錯誤狀態
        End If
    Next
    Rng.Parent.Activate
    '重新激活名稱數據所在的工作表
    End Sub
### 5. 一鍵將總表數據拆分為多個分表
點擊查看代碼
Sub SplitShts()
    Dim d As Object, sht As Worksheet
    Dim aData, aResult, aTemp, aKeys, i&, j&, k&, x&
    Dim rngData As Range, rngGist As Range
    Dim lngTitleCount&, lngGistCol&, lngColCount&
    Dim rngFormat As Range
    Dim strKey As String
    Set d = CreateObject("scripting.dictionary")
    Set rngGist = Application.InputBox("請框選拆分依據列!只能選擇單列單元格區域!", Title:="提示", Type:=8)
    '========用戶選擇的拆分依據列
    lngGistCol = rngGist.Column
    '========拆分依據列的列標
    lngTitleCount = Val(Application.InputBox("請輸入總表標題行的行數?"))
    '========用戶設置總表的標題行數
    If lngTitleCount < 0 Then MsgBox "標題行數不能為負數,程序退出。": Exit Sub
    Set rngData = ActiveSheet.UsedRange
    '========總表的數據區域
    Set rngFormat = ActiveSheet.Cells
    '========總表的單元格集用於粘貼總表格式
    aData = rngData.Value
    lngGistCol = lngGistCol - rngData.Column + 1
    '========計算依據列在數組中的位置
    lngColCount = UBound(aData, 2)
    '========數據源的列數
    For i = lngTitleCount + 1 To UBound(aData)
        If aData(i, lngGistCol) = "" Then aData(i, lngGistCol) = "單元格空白"
        strKey = aData(i, lngGistCol)
    '========統一轉換為字符串格式
        If Not d.exists(strKey) Then
    '========字典中不存在關鍵字時將行號裝入字典
            d(strKey) = i
        Else
            d(strKey) = d(strKey) & "," & i
    '========如果字段存在關鍵字則合並行號
        End If
    Next
    Application.DisplayAlerts = False
    For Each sht In ActiveWorkbook.Worksheets
    '========刪除字典中存在的表名
        If d.exists(sht.Name) Then sht.Delete
    Next
    Application.DisplayAlerts = True
    aKeys = d.keys
    '========字典的key集
    Application.ScreenUpdating = False
    For i = 0 To UBound(aKeys)
        If aKeys(i) <> "" Then
            aTemp = Split(d(aKeys(i)), ",")
    '========取出item里儲存的行號
            ReDim aResult(1 To UBound(aTemp) + 1, 1 To lngColCount)
    '========聲明放置結果的數組aResult
            k = 0
            For x = 0 To UBound(aTemp)
                k = k + 1
                For j = 1 To lngColCount
                    aResult(k, j) = aData(aTemp(x), j)
                Next
            Next
            With Worksheets.Add(, Sheets(Sheets.Count))
    '========新建一個工作表
                .Name = aKeys(i)
                .[a1].Resize(UBound(aData), lngColCount).NumberFormat = "@"
    '========設置單元格為文本格式
                If lngTitleCount > 0 Then .[a1].Resize(lngTitleCount, lngColCount) = aData
    '========標題行
                .[a1].Offset(lngTitleCount, 0).Resize(k, lngColCount) = aResult
    '========數據
                rngFormat.Copy
                .[a1].PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    '========復制粘貼總表的格式
                .[a1].Offset(lngTitleCount + k, 0).Resize(UBound(aData) - k - lngTitleCount, 1).EntireRow.Delete
    '========刪除多余的格式單元格
                .[a1].Select
            End With
        End If
    Next
    rngData.Parent.Activate
    '========激活總表
    Application.ScreenUpdating = True
    Set d = Nothing
    Set rngData = Nothing
    Set rngGist = Nothing
    Set rngFormat = Nothing
    Erase aData: Erase aResult
    MsgBox "數據拆分完成!"
  End Sub
### 6. 批量將工作表轉為獨立工作簿
點擊查看代碼

  Sub Newbooks()

    'EH技術論壇。VBA編程學習與實踐。看見星光

    Dim sht As Worksheet, mypath$

    With Application.FileDialog(msoFileDialogFolderPicker)

   '選擇保存工作薄的文件路徑

        .AllowMultiSelect = False

        '不允許多選

        If .Show Then

            mypath = .SelectedItems(1)

            '讀取選擇的文件路徑

        Else

            Exit Sub

            '如果沒有選擇保存路徑,則退出程序

        End If

    End With

    If Right(mypath, 1) <> "\" Then mypath = mypath & "\"

    Application.DisplayAlerts = False

    '取消顯示系統警告和消息,避免重名工作簿無法保存。當有重名工作簿時,會直接覆蓋保存。

    Application.ScreenUpdating = False

    '取消屏幕刷新

    For Each sht In Worksheets

    '遍歷工作表

        sht.Copy

        '復制工作表,工作表單純復制后,會成為活動工作薄

        With ActiveWorkbook

            .SaveAs mypath & sht.Name, xlWorkbookDefault

            '保存活動工作薄到指定路徑下,以默認文件格式

            .Close True '關閉工作薄並保存

        End With

    Next

    MsgBox "處理完成。", , "提醒"

    Application.ScreenUpdating = True '恢復屏幕刷新

    Application.DisplayAlerts = True '恢復顯示系統警告和消息

  End Sub
### 7. 按指定條件匯總各分表數據到總表
點擊查看代碼

  Sub CollectSheets()
    'ExcelHome VBA編程學習與實踐
    Dim sht As Worksheet, rng As Range, k&, trow&,temp
    Application.ScreenUpdating = False
    '取消屏幕更新,加快代碼運行速度
    temp = InputBox("請輸入需要合並的工作表所包含的關鍵詞:", "提醒")
    If StrPtr(temp) = 0 Then Exit Sub
    '如果點擊了inputbox的取消或者關閉按鈕,則退出程序
    trow = Val(InputBox("請輸入標題的行數", "提醒"))
    If trow < 0 Then MsgBox "標題行數不能為負數。", 64, "警告": Exit Sub
    '取得用戶輸入的標題行數,如果為負數,退出程序
    Cells.ClearContents
    '清空當前表數據
    For Each sht In Worksheets
    '循環讀取表格
        If sht.Name <> ActiveSheet.Name Then
        '如果表格名稱不等於當前表名則……
            If InStr(1, sht.Name, temp, vbTextCompare) Then
           '如果表中包含關鍵詞則進行匯總動作(不區分關鍵詞字母大小寫)
                Set rng = sht.UsedRange
                '定義rng為表格已用區域
                k = k + 1
                '累計K值
                If k = 1 Then
                '如果是首個表格,則K為1,則把標題行一起復制到匯總表
                    rng.Copy
                    [a1].PasteSpecial Paste:=xlPasteValues
                Else
                    '否則,扣除標題行后再復制黏貼到總表,只黏貼數值
                    rng.Offset(trow).Copy
                    Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1).PasteSpecial Paste:=xlPasteValues
                End If
            End If
        End If
    Next
    [a1].Activate
    '激活A1單元格
    Application.ScreenUpdating = True
    '恢復屏幕刷新
  End Sub


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM