vba宏怎么用啊,为什么我vba在表格里输入内容什么都是语法错误?

我遇到一个Python代码问题,该代码试图在Excel工作簿中执行VBA宏。每当它试图使用excel_AddIns:

  • 暂定2:尝试动态启动Excel实例
  • 发生了什么:没什么不同
  • 暂定3:尝试指定插件所在的位置
    • 注意:尝试了两条指向插件所在位置的路径
  • 暂定4:尝试使用absulute路径调用函数

VBA最最精典的教程(基础入门)

VBA最最精典的教程(基础入门)

您还没有浏览的资料哦~

快去寻找自己想要的资料吧

您还没有收藏的资料哦~

收藏资料后可随时找到自己喜欢的内容

0x00 如何创建一个宏

都知道学会了英语语法,再加上大量的词汇基础,就算基本掌握了英语了。 类似的要使用vba,也要入乡随俗,了解他的构成,简单的说vba包含数据类型变量/常量对象和常用的语句结构

不过呢在量和复杂度上远低于英语,不用那么痛苦的记单词了,所以vba其实很简单的。 熟悉了规则之后剩下就是查官方函数啦,查Excel提供的可操作对象啦。

顺带一提的是,函数其实也很容易理解,方便使用。拿到一个函数,例如Sum, 只要知道它是求多个数的和就够了,剩下的就是用了。例如Sum(1000,9)结果就是1009了。 函数的一大好处就是隐藏具体实现细节,提供简洁的使用方法。

Trim函数删除给定输入字符串的前导空格和尾随空格。 语法:Trim(String)

InStr函数返回一个字符串第一次出现在一个字符串,从左到右搜索。返回搜索到的字符索引位置。 InStrRev函数与InStr功能相同,从到左搜索。返回搜索到的字符索引位置。

  • Start - 一个可选参数。指定搜索的起始位置。搜索从第一个位置开始,从左到右。
  • String1 - 必需的参数。要搜索的字符串。
  • Compare - 一个可选参数。指定要使用的字符串比较。它可以采取以下提到的值:
  • String - 必需的参数。输入从中返回指定数量的字符的字符串。
  • Start - 必需的参数。一个整数,它指定了字符串的起始位置。
  • Length - 必需的参数。一个整数,指定要返回的字符数。
  • String - 必需的参数。 输入从左侧返回指定数量的字符的字符串。
  • Length - 必需的参数。 一个整数,指定要返回的字符数。
  • String - 必需的参数。需要被搜索的字符串。
  • findString - 必需的参数。将被替换的字符串部分。
  • replaceWith - 必需的参数。用于替换的子字符串。
  • start - 可选的参数。规定开始位置。默认是 1。
  • count - 规定指定替换的次数。默认是 -1,表示进行所有可能的替换。
  • compare - 可选的参数。规定所使用的字符串比较类型。

4.7 其他字符串函数

  • & 字符串连接操作,在VBA中连个字符串连接使用&进行连接
' 选中不关联的单元格,cells(2, 3)返回结果为:B3
  1. 行列相关 行和列的引用
Rows ' 工作表上所有的行
  1. 选择当前工作表中的单元格
  1. 选择同一工作簿中其它工作表上的单元格
' 也可以先激活该工作表,然后再选择:
  1. 选择与当前单元格相关的单元格/偏离当前单元格(Offset) 语法:Offset(D, R) 以当前为基础原点,向下D,且向右D移动,如果负数即为向反方向移动 即向上和向左移动。 例如,要选择距当前单元格下面5行左侧4列的单元格
  1. 选择一个指定的区域并扩展区域的大小
' 要选择当前工作表中名为“Database”区域,然后将该区域向下扩展5行,可以使用下面的代码:
 
  1. 选择一个指定的区域,再偏离,然后扩展区域的大小
' 选择名为“Database”区域下方4行右侧3列的一个区域,然后扩展2行和1列,可以使用下面的代码:
 
  1. 同时选择两个或多个指定区域 注意:所选区域必须在同一工作表(sheet)中。
  1. 选择两个或多个指定区域的交叉区域 注意:所选区域必须在同一工作表(sheet)中。
' 要选择名为“Test1”和“Test2”的两个区域的交叉区域
 
  1. 利用End函数的相关操作

End(xldown):从被选中的单元格向下寻找,如果被选中单元格为空,则一直向下走到 第一个非空单元格;如果被选中单元格为非空,则向下走到最后一个非空单元格。 End函数的4个方向参数:xlUp, xlDown, xlToLeft, xlToRight。

' 选择连续数据列中的最后一个单元格
' 选择连续数据列底部的空单元格
' 获取连续数据最后一行的行号
' 想选择连续数据最后面的空白行
' 选择某列中连续数据单元格区域
' 选择某列中非连续数据单元格区域
 

补充: 对于上述代码中非连续数据,也可以利用UsedRange.Rows.Count获取所有数据的条/行数。

' 不带第一个参数调用 Getobject 函数将返回对该应用程序的实例的引用。如果该应用程序不在运行,则会产生错误。 ' 在此处对文件进行操作。 ' 注意,当试图退出 Microsoft Excel 时,标题栏会闪烁,并显示一条消息询问是否保存所加载的文件。

移动工作表是指将工作表移到工作簿中的其他位置。 在VBA中,可以使用WorkSheet.Move方法来移动工作表。

语法:表达式.Move(Before, After) 其中,在Move方法中,主要包含两个参数,其功能如下:

Before 在其之前放置移动工作表的工作表。如果指定了After,则不能指定Before。 After 在其之后放置移动工作表的工作表。如果指定了Before,则不能指定After。 例如:移动 "工资表" 至Sheet3工作表之后,可以输入以下代码:

另外,如果既不指定Before也不指定After,Microsoft Excel将新建一个工作簿, 其中包含所移动的工作表。例如,输入以下代码,即可新建一个工作簿, 且该工作表中包含有 "工资表" 工作表。

复制工作表是指将工作表进行备份,以便于用户对备份文件进行操作时,不会损坏原有文件。 在VBA中,使用Sheets.Copy方法可以将工作表复制到工作簿的另一位置。 语法:

其中,在Copy方法中,包含的两个参数与在Move方法中的参数相似,其参数功能如下: Before 将要在其之前放置所复制工作表的工作表。如果指定了After,则不能指定Before。 After 将要在其之后放置所复制工作表的工作表。如果指定了Before,则不能指定After。 例如:复制 "工资表" 表格至Sheet3工作表之后,可以输入以下代码:

另外,用户还可以在不同的工作簿之间进行复制。 例如:将当前工作簿中的“工资表”工作表复制到打开的Book1工作表中,可以输入以下代码:

5.4.1 显示所有数据记录

先判断是否有自动筛选,如果没有为A1添加一个自动筛选

只保留一个箭头,其他的过滤箭头全隐藏

5.4.4 复制所有的过滤后的数据

5.4.5 检查是否有自动筛选:

如若清空某个选中的单元格中的数据,使用的API为:ClearContents

5.5.1 清理/删除Excel中第一个标题行以外的所有行

同样使用ClearContents方法,主要是确定如何选中除第一行以外的表格。

0x06 文件,文件夹等 相关常用操作

以下文件,文件夹等相关方法可自行封装成共通(common function)以便项目中使用。

6.1 判断文件,文件夹等是否存在

1.2 使用Dir()判断文件是否存在

注意: VBA中两种判断文件是否存在的方法,使用 FileExistsDir,期中 FileExists返回逻辑值,而 Dir 返回字符串,因此 Dir 不能参与逻辑值的比较。

FreeFile函数返回一个整数,即表示可由 Open 语句使用的文件标识符号句柄。

参数num=1,返回一个范围为 256–511 的文件号。

EOF函数 在对文件进行读取时,用于确认读取位置是否到达文件末尾。到达文件末尾时返回真(true)。

'使用可能なファイル番号を取得します。 'このマクロが組み込まれているエクセルファイルと '同一フォルダ内の"test.txt"を入力とします。 '入力ファイルの存在チェック '入力ファイルがない場合はここで処理を終了させます。 'テキストファイルを入力モードで開きます。 'ファイルの終わりになるまで 'ファイル内のデータを1行ずつ読み込みます。 'イミディエイトウィンドウへ表示
  1. 获取C盘根目录下的所有文件名并且将每个文件名写入工作表

6.3 文件夹相关操作

6.4 其他操作(获取文件名等)

0x07 日期和时间 相关函数

Date 函数返回当前的系统日期。
Time 函数返回当前的系统时间。
Now 函数返回当前的系统日期和时间。

注意: 如果同时读取 Date、Time 以及 Now,那么 Now = Date + Time,但是实际上,我们不可能同时调用这三个函数,因为执行完一个函数之后,才能执行另一个函数,所以如果您在程序中必需同时取得当时的日期和时间,必需调用 Now,再利用 DateVale 及 TimeValue 分别取出日期和时间。

  1. CDate 函数可把一个合法的日期和时间 表达式 转换为 Date 类型,并返回结果。

提示: 请使用 函数来判断 date 是否可被转换为日期或时间。

date 参数通常是一个字符串表达式, 表示从100年1月1日到9999年12月31日之间的日期。 但是,date 还可是任何表示该范围内的日期、时间或日期和时间的表达式。

是一个仅包含由有效日期分隔符分隔的数字的字符串, 则DateValue将根据您为系统指定的短日期格式识别月、日和年的顺序。 DateValue 还能清楚地识别包含月名称(长名称或简写形式)的日期。 例如,除了识别 12/30/1991 和 12/30/91 之外,DateValue 还识别 December 30, 1991 和 Dec 30, 1991。 如果省略 date 的年部分,则 DateValue 将使用计算机系统日期中的当前年。 如果 date 参数包含时间信息,则 DateValue 将不会返回它。 但是,如果 date 包含的时间信息无效(如“89:98”),则将出错。

  • 从上述 举例1 代码结果总结出,DateValue 只返回一个Date类型结果,而CDate返回结果将保留日期和时间,当参数为一个时间类型的时候,DateValue 只能返回一个 00:00:00的结果。

IsDate 函数返回一个布尔值,用于判断一个表达式是否可被转换为日期。如果表达式是日期,或可被转换为日期,则返回 True 。否则,返回 False 。

注释: IsDate 函数使用本地设置来检测字符串是否可以转换为日期。在 Windows 中, 有效日期的范围是公元100年1月1日至公元9999年12月31日;各操作系统的范围各不相同。

DateAdd 函数可返回已添加指定时间间隔的日期。

必需的。需要添加的时间间隔的数目。可对未来的日期使用正值,对过去的日期使用负值。
必需的。代表被添加的时间间隔的日期的变量或文字。

如果计算的日期位于年份数 100 前(即,你减去的年份数大于 date 中的年份,则出现错误。

如果 number 不是 Long 值,则在计算之前将其 四舍五入 到最接近的整数。

另外: 在使用“w”时间间隔(包括一周的所有天,从星期日到星期六)向日期添加天数时,DateAdd 函数会向日期添加您指定的总天数,而不是像您预期的那样仅向日期添加工作日(从星期一到星期五)数。

    数据类型,所以除非必要,否则应该避免申明变量为Variant型。

91.2 清除Excel数据透视表中过滤器缓存(旧项目)

如下图所示,根据数据范围创建数据透视表时,从源范围中删除数据后,即使刷新数据透视表,旧项目仍将存在于数据透视表的下拉菜单中。 如果要从数据透视表的下拉菜单中删除所有旧项目,可参照如下两种方法:

1. 通过更改选项来清除数据透视表中的过滤器缓存(旧项目)

Step1: 右键单击数据透视表中的任何单元格,然后单击 数据透视表选项 从上下文菜单。 看截图:

Step2: 在里面 数据透视表选项 对话框中,单击 数据 标签,选择 没有 来自 每个字段要保留的项目数量 下拉列表,然后单击 OK 按钮。

Step3: 右键单击“数据透视表”单元格,然后单击 刷新 从右键菜单。 看截图:

然后你可以看到旧的项目从数据透视表的下拉菜单中删除,如下图所示。

2. 使用VBA代码清除所有数据透视表中的过滤器缓存(旧项目)

项目 窗格打开 ThisWorkbook(Code) 窗口,然后将下面的VBA代码复制并粘贴到窗口中。

按 F5 键来运行代码,然后从活动工作簿中的所有数据透视表的下拉菜单中立即删除旧项目。

错误现象: Excel2016(365)运行macro宏时,弹出标题警告↓

91.7 Excel每次保存时都弹出警告:”此文档中包含宏、Activex控件、XML扩展包信息“(office 5+)

依次点击:“工具” → “选项" → "在安全" 选项卡中 勾选 ”保存时从文件属性中删除个人信息”。

单击“Office按钮(或文件菜单) → Excel选项(或选项) → 信任中心”,单击“信任中心设置”按钮,选择“个人信息选项”(隐私选项Privacy Options),在“文档特定设置”下 取消 勾选 “保存时从文件属性中删除个人信息” 后确定。

注意: 该选项仅对当前工作簿有效。另外,新建工作簿时该选项为灰色不可用,只有用“文档检查器”检查了文档并删除了个人信息后该选项才可用。

91.8 解决办法:使用.xlam宏文件执行VBA程序时,操作excel无任何反应

今天小伙伴遇到一个问题,自己做了一个xlam的工具,实现更改当前excel的所有sheet名称,但是当点击工具button的时候程序无反应。

首先看代码并没有什么问题,调查的时候在循环语句中添加了ThisWorkbook指定, 但执行macro的时候发现sheet名字依然没有改变。在无意间看 工程资源管理器(Project Explore) 的时候,发现VBAProject(XXX.xlam)中的默认Sheet1的名字被改变,这也就说明了,不是VBA程序 没有起作用,而是程序在执行的时候默认操作了xlam工作簿。后修改程序中的默认制定工作簿语句 为:ActiveWorkbook marco可以正常执行操作,问题得以解决。

91.9 解决办法:解决办法:复位Excel到A1单元格,锁定缩放比例85%

  1. 在 .xlam文件内编辑如下代码:

VBA示例代码查看:。

本Repository除特殊注明外,均采用 Creative Commons (自由转载-保持署名-非商用-禁止演绎)协议发布。

我要回帖

更多关于 宏与vba的关系 的文章

 

随机推荐