精华内容
下载资源
问答
  • VBA编写的程序中,如果可以在运行时动态创建控件无疑是非常有用的,因为有些控件是无法预先得知的,这样就更必须在运行时动态创建然后设置相应控件属性。控件的名称如下: Forms.Checkbox.1(复选框) Forms....
  • VBA运行库(wps).zip

    2021-09-03 17:48:22
    wps2019宏vba模块安装包v7.1 最新版
  • 提升VBA运行速度

    千次阅读 2019-05-03 17:36:21
    显著提升VBA运行速度的几个注意事项

    屏幕刷新:

    如果我们不需要看见代码执行过程数据变化,可以在代码开始初关闭屏幕更新

    '关闭屏幕更新
    Application.ScreenUpdating = False
    '恢复屏幕更新
    Application.ScreenUpdating = True 
    

    自动计算

    如果工作表有很多函数,在代码运行过程中,关闭公式计算可以显著提升运行速度。

    '手动重算
    Application.Calculation = xlCalculationManual
    
    '计算这个工作簿
    calculate
    
    '计算当前工作表
    activesheet.calculate
    
    '自动重算
    Application.Calculation = xlCalculationAutomatic 
    

    警告提示

    有些时候,我们不希望代码运行过程中莫名弹出一些警告提示,可以设置False关闭提示信息。

    '关闭提示
    Application.DisplayAlerts = False 
    
    '恢复提示
    Application.DisplayAlerts = True 
    

    关闭状态栏

    Application.DisplayStatusBar 关闭状态栏。 如果将 Application.DisplayStatusBar 设置为 False,Excel 将不显示状态栏。 状态栏设置与屏幕更新设置是分开的,这样即使屏幕没有更新,也可以显示当前操作的状态。 但是,如果不需要显示每个操作的状态,在代码运行时关闭状态栏也可以提高性能。

    禁用分页符

    ActiveSheet.DisplayPageBreaks 禁用分页符。 如果将 ActiveSheet.DisplayPageBreaks 设置为 False,Excel 将不显示分页符。 不需要在代码运行时重新计算分页符,并且在代码执行后计算分页符可以提高性能。

    事件关闭:

    如果代码在运行过程中,我们不需要事件触发,可以关闭事件,避免工作簿中事件频繁触发,影响处理效率。

    '关闭事件
    Application.EnableEvents = False	
    
    '启动事件
    Application.EnableEvents = True
    

    读取数据时使用 .Value2

    从 Excel 区域读取数据时使用 .Value2 而不是 .Value 或 .Text
    .Text 返回单元格的格式化值。 速度较慢,如果用户缩放,可能返回 ###,并可能丢失精度。
    .Value 在区域被格式化为日期或货币的情况下,返回 VBA 货币变量或 VBA 日期变量。 速度较慢,可能会丢失精度,并且在调用工作表函数时可能导致错误。.Value2 速度快,不会改变正在从 Excel 检索的数据。

    避免选择并激活对象

    选择和激活对象的处理过程比直接引用对象更为密集。 通过直接引用 Range 或 Shape 等对象,可以提高性能。

    其他优化

    1. 通过将数组直接分配给 Range 来返回结果。
    2. 使用显式类型声明变量,以避免在代码执行期间确定数据类型的开销(可能在一个循环中进行多次)。
    3. 对于在代码中频繁使用的简单函数,请自己在 VBA 中实现这些函数而不是使用 WorksheetFunction 对象。
    4. 使用 Range.SpecialCells 方法缩小与代码交互的单元格数量。
    展开全文
  • 解决VBA运行时错误13 类型不匹配问题 先说解决方法:找到出错的语句以后给里面的参数改类型,使其互相兼容。 比如:给单元格Cells()外面套个马甲 Val() 比如:给数字外面套个马甲Int() 详细的排查过程后面会慢慢讲...

    解决VBA运行时错误13 类型不匹配问题

    先说解决方法:找到出错的语句以后给里面的参数改类型,使其互相兼容。

    • 比如:给单元格Cells()外面套个马甲 Val()
    • 比如:给数字外面套个马甲Int()
      详细的排查过程后面会慢慢讲……这是一个翻转灵异的奇怪问题。

    我这边出问题的例子参见杨洋老师的书《深入浅出Excel VBA》第3章,3.2.1节,我原样敲仅VBE里面运行就报错了:

    Sub Scores()
    	   Dim i
    	   For i = 3 To 5
    	   		Cells(i, 6) = Cells(i, 3) + Cells(i, 4) + Cells(i, 5)
    	   		Cells(i, 7) = Cells(i, 6) / 3 '报错就在这一行
    	   Next i
     End Sub
    

    我试了下,解决方案有二:

    1. Val(Cells(i, 6)) 也就是给Cells(i, 6) 穿马甲
    2. 或者, In(3)—— 强调下3不是字符串是整数()

    解决归解决,但是要搞清楚之前死在哪里才行,于是我在代码里加了一句显示数据类型的代码

    Sub Scores()
          Dim i
          For i = 3 To 5
          		Cells(i, 6) = Cells(i, 3) + Cells(i, 4) + Cells(i, 5)
          		MsgBox MsgBox TypeName(Cells(i, 6))
          		 '让EXCEL给我跳个弹窗看看这单元格里面到底什么数据格式
          		MsgBox MsgBox TypeName(3)
          		'再看看一个数字3还能是什么形式……
          		Cells(i, 7) = Cells(i, 6) / 3 
          Next i
    End Sub
    

    果然,Cells(i,6)的数据类型不是正常的变量或者整数,而是range
    在这里插入图片描述
    而3就是平平无奇的integer
    在这里插入图片描述
    那么问题来了,Range不能被integer除可以理解,给range套上Val()完全可以理解,variant和一切都搭嘛……但为什么给本来就是integer的3外面套上一层Int()也可以解决问题不再报错呢???

    看到这里只是一般奇怪哈,更奇怪的是

    当我把两条MsgBox代码删掉,想再看看报错效果

    然后,竟然不再报错说什么 运行时错误13了

    只能风中凌乱………………

    展开全文
  • 在使用Exce模块l完成运行存储过程的操作中,发现不管怎么使用rs.open都会报错3704,”对象关闭时,不允许操作“。 代码如下: Sub linkSQL() '定义数据链接对象 ,保存连接数据库信息 Dim CN As Object '定义记录...

    一、报错3704

    在使用Exce模块l完成运行存储过程的操作中,发现不管怎么使用rs.open都会报错3704,”对象关闭时,不允许操作“。
    代码如下:

    Sub linkSQL()
       '定义数据链接对象 ,保存连接数据库信息
        Dim CN As Object
         '定义记录集对象,保存数据表
        Dim rs As Object
        
         '创建数据链接对象
        Set CN = CreateObject("ADODB.Connection")
        '创建记录集对象,用于接收数据查询获得的结果集
        Set rs = CreateObject("ADODB.RecordSet")
        
        '创建用户名
        Dim User As String
        User = Range("A2").Value
        
        '创建密码
        Dim Password As String
        Password = Range("B2").Value
        
        '创建连接数据库的库名
        Dim Db As String
        Db = Range("C2").Value
        
        '创建连接数据库的表名
        Dim formName As String
        formName = Range("H2").Value
        
        '创建起始时间
        Dim STime As String
        STime = Range("D2").Value
        
        '创建结束时间
        Dim ETime As String
        ETime = Range("E2").Value
        
        '创建机构代码
        Dim ICode As String
        ICode = Range("F2").Value
        
        '链接数据库的字符串变量
        Dim strCn As String, strSQL1 As String, strSQL As String
    
        '定义远程数据库链接字符串
        strCn = "Provider=SQLOLEDB;Server=SJFXDB01VWKCD\CDDBSERVER;Database=" & Db & ";Uid=" & User & ";Pwd=" & Password & ";"
        '打开连接
        CN.Open strCn
        
        '提取存储过程
        'strPro = "exce cd01_cdtb " & STime & "," & ETime & "," & ICode & ";"
        
        strSQL = "exec cd01_cdtb '" & STime & "','" & ETime & "','" & ICode & "%" & "'"
        MsgBox (strSQL)
        '读取数据库中的数据
        
        rs.Open strSQL, CN
        rs.Close
        CN.Close
    
    End Sub
    

    二、尝试解决

    为了解决这个问题,查了很多资料,例如:

    1、设置SET NOCOUNT ON

    打开存储过程,在begin后面加上一句代码:SET NOCOUNT ON,屏蔽掉这些信息。

    原理:

    SET NOCOUNT
    使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。
    语法
    SET NOCOUNT { ON | OFF }
    注释
    当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
    
    当 SET NOCOUNT 为 OFF 时,返回计数。
    即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。
    当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用microsoft® SQL Server™ 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECTINSERTUPDATEDELETE)结束时将不会在查询结果中显示nn rows affected。
    如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。
    SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
    权限
    SET NOCOUNT 权限默认授予所有用户。
    

    2、Recordset集合的常用方法

    '1)打开一个表
    
    Sql = "select * from 表名" 'SQL查询语句
    
    Set rs = New ADODB.Recordset '新建一个实例
    
    rs.Open SQL, conn '使用 Open 方法打开数据库中的一个表
    
    '注意,这种打开方式只能使用 rs.MoveNext (即,向后移动行坐标)而不能像其他方向,并且不能修改数据内容
    
    'rs.Open SQL, conn,1 '虽然只加了个“1”,但这种方法可以向任何方向移动行坐标。
    
    '以下参数代表了这个可选值的含义
    
    '0 = adOpenForwardOnly (默认值)打开仅向前类型游标。
    
    '1 = adOpenKeyset 打开键集类型游标。
    
    '2 = adOpenDynamic 打开动态类型游标。
    
    '3 = adOpenStatic 打开静态类型游标。
    
    '虽然使用以上方法可以可以实现行坐标(游标)的任意移动,但是仍然无法写入数据。因此需要进一步的对Open 方法进行完善
    
    'rs.Open SQL, conn, 1, 3 '后面的3是确定读写权限的
    
    '以下参数代表了这个可选值的含义
    
    '1 = adLockReadOnly (默认值)只读 — 不能改变数据。
    
    '2 = adLockPessimistic 保守式锁定(逐个) — 在编辑时立即锁定数据源的记录。
    
    '3 = adLockOptimistic 开放式锁定(逐个) — 只在调用 Update 方法时才锁定记录
    
    '4 = adLockBatchOptimistic 开放式批更新 — 用于批更新模式(与立即更新模式相对)。
    

    将原来的rs.Open strSQL, CN改为rs.Open strSQL, CN,adOpenDynamic ,adLockBatchOptimistic,仍报错。

    三、解决问题

    整理了一下思路,报错的原因是使用了已经关闭的ADO对象,但是我只Open了为什么会报已关闭的错误呢?

    原因:

    rs中的数据没有清理,打开后自动关闭,所以解决方案就是清理rs。

    修改后代码如下:

    Sub linkSQL()
       '定义数据链接对象 ,保存连接数据库信息
        Dim CN As Object
         '定义记录集对象,保存数据表
        Dim rs As Object
        
         '创建数据链接对象
        Set CN = CreateObject("ADODB.Connection")
        '创建记录集对象,用于接收数据查询获得的结果集
        Set rs = CreateObject("ADODB.RecordSet")
        
        '创建用户名
        Dim User As String
        User = Range("A2").Value
        
        '创建密码
        Dim Password As String
        Password = Range("B2").Value
        
        '创建连接数据库的库名
        Dim Db As String
        Db = Range("C2").Value
        
        '创建连接数据库的表名
        Dim formName As String
        formName = Range("H2").Value
        
        '创建起始时间
        Dim STime As String
        STime = Range("D2").Value
        
        '创建结束时间
        Dim ETime As String
        ETime = Range("E2").Value
        
        '创建机构代码
        Dim ICode As String
        ICode = Range("F2").Value
        
        '链接数据库的字符串变量
        Dim strCn As String, strSQL1 As String, strSQL As String
    
        '定义远程数据库链接字符串
        strCn = "Provider=SQLOLEDB;Server=SJFXDB01VWKCD\CDDBSERVER;Database=" & Db & ";Uid=" & User & ";Pwd=" & Password & ";"
        '打开连接
        CN.Open strCn
        
        '提取存储过程
        'strPro = "exce cd01_cdtb " & STime & "," & ETime & "," & ICode & ";"
        
        strSQL = "exec cd01_cdtb '" & STime & "','" & ETime & "','" & ICode & "%" & "'"
        MsgBox (strSQL)
        '读取数据库中的数据
        
        rs.Open strSQL, CN
        
        CN.Close
    	Set re = Nothing
    	Set CN = Nothing
    End Sub
    

    解决问题!

    展开全文
  • EXCEL vba 运行错误438

    2017-03-13 16:10:13
    运行错误 438,对象不支持该属类或方法,我用的EXCEL2013版,WIN7-64BIT 这是错误代码 : Sub BrowseToSite() Dim IE As New SHDocVw.InternetExplorer 'Set IE = New SHDocVw.InternetExplorer IE.Visible ...
  • 防止用户干预 通过将下述语句加入到过程代码中去,你可以防止用户中断你的程序: ...当用户在程序运行时按下Esc或者Ctrl+Break时,不会发生任何情况。应用程序对象的属性EnableCancelKey禁用了这些键。 ...

    防止用户干预

    通过将下述语句加入到过程代码中去,你可以防止用户中断你的程序:

    Application.EnableCancelKey = xlDisabled

    当用户在程序运行时按下Esc或者Ctrl+Break时,不会发生任何情况。应用程序对象的属性EnableCancelKey禁用了这些键。

    展开全文
  • I'm trying to run a python script from my VBA module. I've tried pretty much every example I've seen on the internet and so for have had no luck.In the VBA module I also run a .bat file, and it works ...
  • wps office vba 7.0版 WPS VBA环境安装包。
  • <p>VBA 代码可以运行运行完提示运行错误‘5’,无效的过程或调用参数,代码段指向If rng.Value = "┏" And rng(n + 1, 1).Value = "┗" Then行,请大神看看是什么...
  • VBAProject无效的过程调用或参数解决:注释掉该语句的错误处理即可,这是vba的bug,实际运行结果仍是正确的
  • 可以加上: Application.ScreenUpdating = False 关闭屏幕刷新 确实有用,这样打开excel不会显示内容,直接运算出结果
  • 上述代码中虽然打算选择online工作表,但最后运行结果是复制在当前活动的工作表,因为到” ActiveSheet.Paste“中的 ActiveSheet仍指当前活动的工作表,前面代码不改变当前活动的工作表。 修改办法:将上面标红...
  • 原文标题:简化及提高VBA运行速度的方法 原文链接:http://www.360doc.com/content/11/0829/18/4109331_144309182.shtml 原文内容: -----------------------------------------------------------------------.....
  • .Net 调用VBA Excel宏

    2017-06-06 11:11:02
    .Net 调用VBA Excel宏,PPT 可运行,bin中有VBA 代码
  • ' ---------计算程序运行所用时间:---------- Sub GetRunTime() Dim i As Long Dim dteStart As Date Dim strTime As String '关闭屏幕刷新 'Application.ScreenUpdating = False dteStart = Timer '----...
  • 用VBA代码打开xls文件时,判断被打开的xls文件是否含VBA代码并禁止其运行说明需求背景禁止被打开文件中的vba运行判断打开的文件中是否含vba代码先取得打开的文件中有多少个components利用取得的对象数量, 取得每个...
  • 问题:今天发现VBA突然运行很慢很慢。 尝试:保存为不带宏的文件===》无效 修改代码提升效率===》低效率 关掉所有xlsm文件重启===> 无效 解决:C盘虚拟内存转移,by金山毒霸 效果:2000条的填充循环秒到飞起 .....
  • VBA运行时错误1004错误

    千次阅读 2009-11-27 12:20:30
    今天帮人做一个VBA宏, 很久没干这活了. Workbooks(dirname).Sheets(i).UsedRange.Copy Sheets(i).Range("A" & usedRows).Select Selection.PasteSpecial Paste:=...
  • 代码: waitTime = TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 3) Application.Wait waitTime 来自excelhome网友Zamyi
  • VB运行库.rar

    2019-09-12 22:35:29
    VBvc运行库电脑系统如果有文件运行不起来多半是缺少运行环境这时候就用到这个了
  • excel运行vbaIf you have a VBA function that turns Microsoft Excel into a CPU munching beast, is it possible to tame things down so that you can continue to use your computer for other activities while...
  • 艺赛旗 RPA9.0全新首发免费下载 点击下载 ...详细内容请参看艺赛旗官网支持栏目:RPA社区 ...业务场景 使用 win32com 运行 Excel 中的宏运算(VBA),会遇到 VBA 运行的最后一步会弹出消息提示框,需点击这...
  • 业务场景使用 win32com 运行 Excel 中的宏运算(VBA),会遇到 VBA 运行的最后一步会弹出消息提示框,需点击这个消息提示框之后,VBA 才能运行结束,所以在运行 VBA 之后加入 Try 组件去点击时无法点击的,所以考虑...
  • VBA-加快你的代码运行速度--转自ExcelHome

    千次阅读 多人点赞 2020-05-14 14:42:32
    主题:VBA-加快你的代码运行速度 我们知道,用VBA实现同一个效果可能有多种不同的方法,写出一个最有效率的代码是大家都追求的,但是假如我水平有限,经验不足,实践不多,或者逻辑线路的设计不够简洁清爽,是不是就无法...
  • wps的vba环境,亲测win10 64位可用,有问题反馈。718161580@qq.com
  • VBA运行跑出autoexec.bat

    2021-01-13 17:27:18
    VBA运行跑出autoexec.bat 内容是REM Dummy file for NTVDM 请问如何解决
  • 跑了一个多月的程序运行时突然报错, 怎么都调不好, 换电脑之后就OK了… 要疯掉… 估计是电脑卸载了啥东西,或装了啥东西,中毒了??? 慢慢找吧[哭]
  • 新电脑WIN10下,运行vba卡顿? 同样的宏在老电脑win7没问题,没查到原因。
  • vb中运行vba代码 When trying to find the cause of a problem in VBA or VB6 it's often valuable to know what procedures were executed prior to the error. You can use the Call Stack for tha...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,798
精华内容 5,919
关键字:

vba怎么运行