• VBA精彩代码分享-3


    在开发VBA程序中,我们可能会需要用代码处理VBA工程,包括启用VBA工程访问,启用所有宏,动态插入代码,动态删除代码,动态添加引用和自动创建模块等等,本次的分享内容便以这些为主。

    启用VBA工程访问

    Dim oWshell As Object
    Set oWshell = CreateObject("WScript.Shell")
    oWshell.RegWrite "HKEY_CURRENT_USERSoftwareMicrosoftOffice" & Application.Version & "ExcelSecurityAccessVBOM", 1, "REG_DWORD"
    '将第二个参数改为0就是关闭

    启用所有宏

    Dim WScr As Object
    Set WScr = CreateObject("WScript.Shell")
    WScr.RegWrite "HKEY_CURRENT_USERSoftwareMicrosoftOffice" & Application.Version & "ExcelSecurityVBAWarnings", "1", "REG_DWORD"
    '将第二个参数改为0就是关闭

    在工作表插入按钮并写入单击事件

    Dim sCode, objBtn
    With ActiveSheet
     For Each obj In .OLEObjects
      obj.Delete
      Next obj
      Set objBtn = .OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=120, Top:=50, Width:=130, Height:=30)
    End With
    sCode = "' *** Code Added By VBA ***" & vbCrLf & "Private Sub " & objBtn.Name & "_Click()" & vbCrLf & "  MsgBox ""Hello""" & vbCrLf & "End Sub" & vbCrLf
    With ActiveWorkbook.VBProject.VBComponents("Sheet1").CodeModule
      NextLine = .CountOfLines + 1
      .InsertLines NextLine, sCode
    End With

    删除某个过程

    Dim CodeInd As Long
    Dim sNo, eNo, bFlag
    Const PROC_NAME = "PRIVATE SUB WORKSHEET_CHANGE(BYVAL TARGET AS RANGE)"
    bFlag = False
    With ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule
        For CodeInd = .CountOfDeclarationLines + 1 To .CountOfLines
            Select Case VBA.UCase$(Trim(.Lines(CodeInd, 1)))
                Case PROC_NAME
                    bFlag = True
                    sNo = CodeInd
                Case "END SUB"
                    If bFlag Then
                        eNo = CodeInd
                        Exit For
                    End If
            End Select
        Next CodeInd
        ' 逐行倒序删除
        'For i = eNo To sNo Step -1
        '    .DeleteLines i
        'Next
        ' 一次性删除整个过程代码
        .DeleteLines sNo, eNo - sNo + 1
    End With

    输出VBA工程的所有引用

    On Error Resume Next
    For n = 1 To ThisWorkbook.VBProject.References.Count
      Cells(n, 1) = ThisWorkbook.VBProject.References.Item(n).Name
      Cells(n, 2) = ThisWorkbook.VBProject.References.Item(n).Description
      Cells(n, 3) = ThisWorkbook.VBProject.References.Item(n).GUID
      Cells(n, 4) = ThisWorkbook.VBProject.References.Item(n).Major
      Cells(n, 5) = ThisWorkbook.VBProject.References.Item(n).Minor
      Cells(n, 6) = ThisWorkbook.VBProject.References.Item(n).fullpath
    Next n

     删除VBA工程的所有引用

    On Error Resume Next
    Dim theRef As Variant
    For I = ThisWorkbook.VBProject.References.Count To 1 Step -1
    Set theRef = ThisWorkbook.VBProject.References.Item(I)
    If theRef.isbroken = True Then
    ThisWorkbook.VBProject.References.Remove theRef
    End If
    Next I

    添加VBA工程引用

    Dim RefItem(6, 3) As Variant
    
    RefItem(0, 0) = "{000204EF-0000-0000-C000-000000000046}"
    RefItem(0, 1) = 4
    RefItem(0, 2) = 2
    
    RefItem(1, 0) = "{00020813-0000-0000-C000-000000000046}"
    RefItem(1, 1) = 1
    RefItem(1, 2) = 9
    
    RefItem(2, 0) = "{00020430-0000-0000-C000-000000000046}"
    RefItem(2, 1) = 2
    RefItem(2, 2) = 0
    
    RefItem(3, 0) = "{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}"
    RefItem(3, 1) = 2
    RefItem(3, 2) = 8
    
    RefItem(4, 0) = "{00000205-0000-0010-8000-00AA006D2EA4}"
    RefItem(4, 1) = 2
    RefItem(4, 2) = 5
    
    RefItem(5, 0) = "{0D452EE1-E08F-101A-852E-02608C4D0BB4}"
    RefItem(5, 1) = 2
    RefItem(5, 2) = 0
    
    On Error Resume Next
    For I = 0 To 5
    ThisWorkbook.VBProject.References.AddFromGuid GUID:=RefItem(I, 0), Major:=RefItem(I, 1), Minor:=RefItem(I, 2)
    Select Case Err.Number
    Case Is = 32813
    '引用已经加载,无需做任何事情
    Case Is = vbNullString
    '成功加载
    Case Else
    '加载出现错误,保存错误信息
    errmsg = errmsg & RefItem(I, 0) & "出现错误错误"
    End Select
    Next I
    If errmsg <> "" Then
    MsgBox errmsg
    End If

    创建模块并写入过程

    Application.ScreenUpdating = False
    For i = 1 To ThisWorkbook.VBProject.VBComponents.Count
    If ThisWorkbook.VBProject.VBComponents(i).Name = "auto_code" Then
    ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(i)
    End If
    Next
    ThisWorkbook.VBProject.VBComponents.Add(1).Name = "auto_code"
    ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines 1, "Sub test()"
    ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines 2, "Msgbox""hello world!"""
    ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines 4, "end sub"
    Application.OnTime Now + TimeValue("00:00:01"), "test"
    Application.ScreenUpdating = True
  • 相关阅读:
    Download: Microsoft Access Database Engine 2010 Redistributable
    18大顺丰不发航空件
    北京南站不是24*7的
    360压缩虽然有占霸道,但是for free,我已经不想去找破解软件了
    VS2010、SQL Server 2008和SQL Server 2012安装详解
    【新提醒】LENOVO_WIN7_SP1_UM_64_CN_RDVD远景Windows7,Windows8,旗舰版,系统下载,主题
    原来qq下载也有类似迅雷的功能了
    如意通5元卡办理了,可以用wifi热点了
    SQLEXPR.EXE 和 SQLEXPR32.EXE的区别 挨踢人 博客园
    HTTP Proxy Support
  • 原文地址:https://www.cnblogs.com/JTCLASSROOM/p/10881746.html
Copyright © 2020-2023  润新知