我正在尝试更改多个工作簿的事件过程?

如何解决我正在尝试更改多个工作簿的事件过程?

请帮忙,因为我说错了 “未设置对象变量或带块变量。 错误#91 卡在wb.close行中 如果需要更改多个工作簿的事件过程,请提供帮助 任何想法

    Sub CopyCode()

  Dim wb As Workbook

  Dim strInput
  Dim VBP As Object,VBC As Object,CM As Object
  Dim strpath As String,strCurrentFile As String
  
 
  strpath = "C:\Users\Basem Lap\Desktop\test\"
  strCurrentFile = Dir(strpath & "*.xls"*)
   
  

  
  
  
  Do While strCurrentFile <> ""
    Set wb = Workbooks.Open(strpath & strCurrentFile)
    Set VBP = wb.VBProject
    Set VBC = VBP.VBComponents(wb.CodeName)
    Set CM = VBC.CodeModule
    
    
    Application.DisplayAlerts = False
    
    
    Application.DisplayAlerts = False
    
    With wb.VBProject.VBComponents("ThisWorkbook").CodeModule
     .ReplaceLine 1,"Private Sub Workbook_BeforeClose(Cancel As Boolean)" 
       
    End With
    
    
    
    
    wb.Close savechanges:=True
    Application.DisplayAlerts = False
    
    Set wb = Nothing
    strCurrentFile = Dir
  Loop
  
  MsgBox "Done"
End Sub


解决方法

请更改:

strCurrentFile = Dir(strpath & "*.xls"*)

具有:

strCurrentFile = Dir(strpath & "*.xls*")

通配符必须在字符串中。

但是我不明白您的代码将如何传递。该错误(首先)应在上述行中出现...

请尝试在讨论的行之后立即添加此代码行:

Debug.Print strCurrentFile: Stop

代码停止时返回什么?它是真实的工作簿全名吗?

当尝试修改代码模块中的某些内容时,我建议添加对“ Microsoft Visual Basic for Applications Extensibility xx”库的引用,并适当地声明所使用的变量。您会从智能建议中受益,这可能会有所帮助。

已编辑:

如果要替换的代码行是第一行,则现有代码应将其替换为所需的代码行。如果不是,请使用下一个代码,该代码将首先搜索要替换的代码,然后在要替换的位置进行替换:

Function ReplaceCodeLine(wb As Workbook,strModule As String,strSearch As String,strReplace As String) As Boolean
 Dim VBProj As Object,VBComp As Object,CodeMod As Object
 Dim startL As Long,endL As Long
 Dim strCLine As String,boolFound As Boolean

    Set VBProj = wb.VBProject
    Set VBComp = VBProj.VBComponents(strModule)
    Set CodeMod = VBComp.CodeModule
    startL = 1
    With CodeMod
        endL = .CountOfLines
        boolFound = .Find(Target:=strSearch,StartLine:=startL,StartColumn:=1,_
              EndLine:=endL,EndColumn:=255,wholeword:=True,MatchCase:=False,_
                                                             patternsearch:=False)

        If boolFound Then
            strCLine = Replace(CodeMod.Lines(startL,1),strSearch,_
                                     strReplace,Compare:=vbTextCompare)
            .ReplaceLine startL,strCLine
            ReplaceCodeLine = True
        Else
            ReplaceCodeLine = False
        End If
    End With
End Function

可以通过在标准模块中复制上述函数并替换下一部分来从代码中调用它:

With wb.VBProject.VBComponents("ThisWorkbook").CodeModule
     .ReplaceLine 1,"Private Sub Workbook_BeforeClose(Cancel As Boolean)" 
       
End With

与此:

Dim strExist as String,strToReplace as String
strExist = "Private Sub Workbook_SheetChange(ByVal Sh As Object,ByVal Target As Range)"
strToReplace = "Private Sub Workbook_BeforeClose(Cancel As Boolean)"
Debug.Print ReplaceCodeLine(wb,"ThisWorkbook",strExist,strToReplace)

如果找到了要替换的行并进行了替换,它将在Immediate Window True中返回。

请对其进行测试并发送一些反馈。

第二次编辑

以下解决方案将使用具有正确“ ThisWorkbook”代码模块的工作簿,该代码模块将复制到strPath文件夹中的所有工作簿中。您必须注意strCurrentFile的值。它可能允许.xlsx文档,这些文档无法使用VBA保存在其中...

  1. 以下解决方案需要引用“ Microsoft Visual for Applications Extensibility 5.3”。为了以编程方式添加它,请在标准模块中复制下一个代码并运行它:
Sub addExtenssibilityReference()
   ThisWorkbook.VBProject.References.AddFromGuid _
        GUID:="{0002E157-0000-0000-C000-000000000046}",_
        Major:=5,Minor:=3
End Sub
  1. 您的现有代码应替换为下一个代码:
Sub CopyThisWorkbookCode()
'It needs a reference to 'Microsoft Visual for Applications Extensibility 5.3'.
 Dim VBProjSource As VBIDE.VBProject,VBCompSource As VBIDE.VBComponent
 Dim VBProjTarget As VBIDE.VBProject,wb As Workbook,strCode As String
 
 Set VBProjSource = ThisWorkbook.VBProject 'or another (open) workbook keeping
                                           'the ThisWorkbook code to be copyed from
 Set VBCompSource = VBProjSource.VBComponents("ThisWorkbook")
 'all ThisWorkbook module code copied as string:
 strCode = VBCompSource.CodeModule.Lines(1,VBCompSource.CodeModule.CountOfLines)

  Dim strPath As String,strCurrentFile As String
  
  strPath = "C:\Users\Basem Lap\Desktop\test\"
  strCurrentFile = Dir(strPath & "*.xls*")
    
  Application.EnableEvents = False: Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
    
  Do While strCurrentFile <> ""
    Set wb = Workbooks.Open(strPath & strCurrentFile)
    Set VBProjTarget = wb.VBProject
        
    impThisWorkbookModule VBProjTarget,strCode
    
    wb.Close savechanges:=True
    strCurrentFile = Dir
  Loop
  
  Application.EnableEvents = True: Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
  
  MsgBox "Done"
End Sub

请注意选择VBProjSource。在上面的代码中,我使用了保留此代码的工作簿。您可以使用另一个:Set VBProjSource = Workbooks("Model Workbook").VBProject

  1. 在上面的代码下面复制下一个函数:
Function impThisWorkbookModule(VBProjT As VBIDE.VBProject,strCode As String)
  Dim VBCompTarget As VBIDE.VBComponent
        
  Set VBCompTarget = VBProjT.VBComponents("ThisWorkbook")
     
    With VBCompTarget.CodeModule
        .DeleteLines 1,.CountOfLines
        .InsertLines 1,strCode
    End With
End Function 
  1. 运行CopyThisWorkbookCode Sub并发送一些反馈。
,

更改事件过程的类型

  • 类似的事情可能是解决方案。希望事件过程从第一行开始。

代码

Option Explicit

Sub CopyCode()

    Const ReplaceString As String = _
      "Private Sub Workbook_BeforeClose(Cancel As Boolean)"
    
    Dim wb As Workbook
    Dim VBP As Object,VBC As Object,CM As Object
    Dim strpath As String,strCurrentFile As String
   
    strpath = "C:\Users\Basem Lap\Desktop\test\"
    strCurrentFile = Dir(strpath & "*.xls*")
    
    Do While strCurrentFile <> ""
        
        Set wb = Workbooks.Open(strpath & strCurrentFile)
        ' Debug.Print wb.FullName
        Set VBP = wb.VBProject
        Set VBC = VBP.VBComponents(wb.CodeName)
        Set CM = VBC.CodeModule
        
        Application.DisplayAlerts = False
        CM.ReplaceLine 1,ReplaceString
        wb.Close SaveChanges:=True
        Application.DisplayAlerts = False
        
        strCurrentFile = Dir
    
    Loop
    
    MsgBox "Done"

End Sub

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res