首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

VBA使用API_01:读取文件

现在想想其实应该先了解一些数据类型、参数传递、内存方面的东西,再来用API的时候,就会顺利许多。...1、读取文件: 在Excel VBA里读取文件分3步: Open语句打开文件 Get语句读取数据 Close关闭打开的文件 用API读取文件其实也是一样的,只是我们要自己去声明这3个语句: Public...2、参数传递 值参数 很多参数API中只是使用,所以VBA里传递是按值传递还是按照地址传递其实都是一样的,这个和VBA里的Function是一样的。...另外有很多复杂的参数,一般都不大常用,这种在VBA里我们直接声明为Byval后传递0就可以,像CreateFile里的dwFlagsAndAttributes和hTemplateFile我们都可以设置为...指针参数 这是一种非常容易出错的参数,比如ReadFile中有个参数lpNumberOfBytesRead,这种参数是一种指针,API函数会在内部操作这个指针,所以如果这个参数一旦传递错误,比如按Byval

1.6K10

过程(四)传地址和传值

上节介绍了过程的传递参数部分内容,即实参与形参的结合。 在VBA中实参可以通过两种方式将数据传递给形参,分别为传地址和传值,都是在创建通用过程定义变量时。...一、 传 地 址 传地址是VBA默认的数据传递方式,在定义过程时,如果形参前面有关键字ByRef或者省略,则该参数通过传地址的方式传递。...所以使用传值方式传递参数时,传递的只是变量的副本,类似于一次赋值操作,改变只是在jisuan过程中,而再调用过程diaoyong中变量的值没有改变。...因为不希望在函数调用后,这三个参数值有什么改变 2,传址方式的速度快,但增加了过程的相互牵连;也不利于程序调试。...而传值则相反 在实际中,可以先用传值方式,等调试后,再改为传址方式 3,用传址方式,要求实参与形参的数据类型完全一致 ---- 本节主要介绍过程的参数传递问题,重点是区分传地址和传值两种方式,结合示例去理解

5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    VBA专题10-21:使用VBA操控Excel界面之禁用和启用控件、组和选项卡

    2010及以后版本中,使用下面的代码语句: myRibbon.InvalidateControlMso "Bold" myRibbon.InvalidateControlMso "Underline...在Custom UI Editor中保存该文件,首次在Excel中打开该文件时,将会出现关于Initialize和GetEnabledAttnSh过程提示的错误消息,因为在标准的VBA模块中仍然没有这两个回调过程...End Sub 要基于其在XML代码中的id禁用(和启用)某自定义控件,在现有的标准VBA模块或者新的标准VBA模块中包括下面的代码: Sub EnableAll() Call RefreshRibbon...是否启用(或禁用)某控件取决于在RefreshRibbon中参数传递的值。一旦使这些控件无效,就调用GetEnabledAttnSh过程,遍历共享这个相同回调的所有无效的控件。...如果控件的id与参数值匹配,就启用该控件。否则,禁用该控件。

    3.4K20

    Function函数

    前面我们说过Sub过程,VBA还有一种Function函数,语言规则与Sub差不多: Function 函数名(参数 As 数据类型) As 数据类型 End Function 与Sub不同的是:...函数可以返回一个值 不能直接运行 详细介绍请查看官方文档: https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help...这种将复杂功能分解成若干小功能,由各个小功能来组合完成一个复杂功能的编程思想是非常重要的: 可以简化开发难度 提高代码的复用 2、Function的参数 VBA中,参数的传递有2种方式: Byval...这就是Byref。 如果参数前面省略了修饰符,默认是Byref(个人认为这个默认非常的不好,我刚开始用VBA的时候碰过这个问题,莫名其妙不知道为什么变量的值不对了)。...只要简单记住,如果你传递的变量只是给其他函数使用的,并不需要改变的话,用Byval。

    1.2K30

    VBA函数与过程简洁教程

    'VBA函数与过程简洁教程 Sub 过程名() 'Sub表示过程,在执行宏或图形右击指定宏中看得到,不能返回值 Call 函数名(Array(1, 2), b) '调用过程并把返回值放入r End Sub...'结束过程 Function 函数名(a, Optional ByVal b) 'Function表示函数,在单元格中也可以使用,宏列表看不到,可以使宏列表简洁 'VBA默认ByRef会改变原参数的值...,所以加了ByVal If IsMissing(b) Then b = 1 'Optional表示参数可以选择性省略,上面的语句是如果没有时设定值,常用设定可选来灵活调试,如果有一个非可选就不能直接运行...ReDim arr(UBound(a)) '定义可变数组,UBound()是求最大下标值 arr(1) = b 函数名 = arr '返回值,仅Function可用 Exit Function...'退出函数,不要用return,return是在一个程序中回到GoSub后一行 End Function '结束函数

    98930

    VBA专题10-20:使用VBA操控Excel界面之隐藏和取消隐藏控件、组和选项卡

    可以在启动(当Excel开启时)动态设置值,可以在运行时改变它们的值(在使元素无效后通过使用VBA回调过程)。...在Custom UI Editor中保存该文件,首次在Excel中打开时,会出现关于Initialize和HideAlignmentGroup过程的错误消息提示,因为这两个过程仍然没有在标准的VBA模块中找到...方法 '使用下面的语句使功能区无效 'myRibbon.Invalidate End Sub 当激活不同的工作表时,执行SheetActivate事件处理。...当激活图表工作表时,“开始”选项卡中的“对齐方式”组被隐藏,如下图所示: ? 事实上,可以只是使用一个回调过程来隐藏多个组。...方法, '使用下面的语句使Ribbon无效: 'myRibbon.Invalidate End Sub 当激活不同的工作表时,执行SheetActivate事件处理。

    8.1K20

    VBA汇总多个Sheet数据

    : '函数返回值 Enum RetCode ErrRT = -1 SuccRT = 1 End Enum '标记一些位置信息 Enum Pos RowStart = 2...,很多人是不推荐的,因为中文Office版本下写的代码如果放到英文Office版本下会出问题,所以建议是不要使用的。...因为要汇总的表格数量是不确定的,所以vba_main必须要放一个循环语句,-1是因为最后1个表格是输出的汇总表: For i = 1 To Worksheets.Count - 1...源表格式变化了修改方便:比如这个程序的例子,如果情况变化了,工资表里加了一列工号在姓名前面,那我们又要把程序改写了,如果代码都是按固定的列号写的,改动会比较大,但是使用了Enum的话,只需要在Enum...d.dic(strkey) Else '没有出现过的时候,就是新行输出 prow = d.pNextRow '记录到字典中

    1.6K20

    解决问题_ctypes.COMError: (-2147024809, 参数错误。, (None, None, None, 0, None))

    , (None, None, None, 0, None))在使用ctypes库时,有时可能会遇到_ctypes.COMError错误,该错误通常表示函数调用时的参数错误。...这可能是由于以下几个原因导致的:参数类型不匹配:传递给函数的参数类型与函数定义的参数类型不匹配,例如传递字符串而函数期望整数。...参数个数不匹配:传递给函数的参数个数与函数期望的参数个数不匹配,例如传递少于或多于函数定义的参数个数。参数值无效:传递给函数的参数值超出了有效范围,例如传递负数而函数期望非负数。...= [ctypes.c_int, ctypes.c_float]my_function.restype = ctypes.c_int# 调用函数时传递的参数类型不匹配result = my_function...同时,在与C代码交互时,还需要遵循相应的C函数接口定义和调用约定,以确保正确的参数传递和数据类型匹配。

    1.1K10

    过程(五)可选参数和可变参数

    一、可选参数 通常情况下,创建vba过程时候,设置了形参的数量后,调用该过程时,提供的实参数量也是对应的。但在有些情况下,可以把形参设置为可选参数,即可以提供实参也可以不提供。...在vba过程中,通过在形参前面加上Optional关键字来设置该形参为可选参数,在过程内部通过使用ismissing函数可测试调用程序是否传递了可选参数。...---- 二、可变参数 上面介绍可选参数时,可以发现在定义过程时,不管是固定参数还是可选参数,都已经制定了参数的个数,那么在VBA中还可以定义可变参数,即参数的个数在定义时时未知的。...在定义过程的参数表时,在最后一个参数前面加上ParamArray关键字,过程将接受任意个数的参数。 下面通过可变参数编写求和函数的示例来介绍。...可变参数为一个数组,过程中使用lbound函数和Ubound函数获得数组的下标的上下界。然后通过for循环把每个元素进行累加,并将累加结果保存到第一个参数t中,返回给调用程序。

    4.8K20

    VBA Object对象的函数参数传递

    VBA的函数参数传递方式是Byval和Byref,数值类型、Stirng等那些值类型的是要非常注意用哪种方式的。对于Object对象引用类型的一直都说2种方式完全没有区别。...Object对象的Byval和Byref参数真的没有区别吗? 对于操作的这个Object对象来说,可以认为是没有区别,但是传递过程和其他数据类型的参数传递是一样的,遵守的规则并没有改变。...ByVal 参数传递的时候,会在内存中另外复制一份,函数操作这个副本和传递之前的那个变量已经没有了任何关系; Byref 会把参数的内存地址传递给函数,函数接收到这个是通过内存地址来读取或者改写的,操作的就是原来的变量...可以理解为参数其实就是一个LongPtr类型,所以你是复制一份这个LongPtr类型的数字传递,还是把这个LongPtr类型所在的内存地址传递给函数,对于Object这个对象来说,是没有区别的。...) Dim VarPtr中保存的数据 As Long CopyMemory VarPtr(VarPtr中保存的数据), VarPtr(rng), 4 Printf "ByRef

    3.5K20

    一起学Excel专业开发06:Excel应用程序开发的一些好的做法

    通常放置于每个过程名上方或者过程的第一行语句上方,说明过程的目的、注意事项、参数的意义和作用、函数返回值说明、过程修改的时间和内容等。 3.内部注释。...代码编写 模块设置 1.在模块顶部使用Option Explicit语句。这将强制必须显式声明所有变量,这样会避免因拼写错误导致VBA认为其是一个新变量的问题发生。...2.如果想隐藏模块中的过程,使用户接口或其他Excel工程不能使用模块中的过程,则可以在模块顶部使用Option Private Module语句声明。...建议尽量少使用这两个设置语句,以免在其他模块中使用该模块中的过程时导致不易发现的错误。 合理使用变量和常量 1.避免重复使用变量。 2.避免使用变体数据类型。 3.避免使用As New声明对象变量。...2.在声明过程参数时,显式使用ByRef或ByVal。 3.在使用前验证过程参数的有效性。 4.显示调用对象的默认属性。 5.经常使用菜单“调试-编译”命令。

    81330

    VBA位操作

    计算机在运行的过程中,所有的数据都是存储在内存中的,内存中的数据都是以二进制存储,也就是只有高电平(1)、低电平(0),而0和1其实只是为了让人方便理解。...计算机规定1个二进制叫做位bit,8个bit叫做Byte,在VBA中,能操作的最小单元就是Byte。 可是很多时候,为了节约空间,很多程序都是利用bit位来代表某些信息的,比如ZIP压缩后的数据。...在VBA中,位操作符主要有 And 运算符 Eqv 运算符 Imp 运算符 Not 运算符 Or 运算符 Xor 运算符 这些操作符一般都用在IF语句的条件判断上,And和Or用的是最多的,这种用法比较好理解...主要讲讲位操作,很多语言都有移位的操作,但是VBA却没有,不过可以利用位操作符来实现移位函数。 首先需要明白,作为一个整数,左移和右移造成了什么改变。...03 代码实现 左移,需要注意乘2的时候是否会溢出: Function BitMoveLeft(ByRef V As Long, num As Long) As Long Dim i As Long

    2.1K30

    VBA专题10-14:使用VBA操控Excel界面之在功能区中添加自定义库控件

    excelperfect 在自定义功能区时,我们可以插入图像到自定义库中,图像文件的类型可以是ico、bmp、png、jpg和tif。 要给自定义功能区选项卡添加库控件,执行下列步骤: 1....注意:在图像文件的文件名中避免使用空字符,否则不能正确地引用文件。 6. 如果需要,可右击在Custom UI Editor中插入的图像来改变其ID。如图1所示。 ? 图1 7....在Excel中打开该文件。 12. 按Alt+F11键激活VBE。 13. 插入一个标准的VBA模块,并粘贴在步骤9中复制的回调代码。 14. 在过程中添加一个MsgBox语句来测试控件。...图2 代替上述第4步和第5步中手工插入图像,可以通过使用VBA过程使用相同的图像填充库。通过赋VBA过程的名称到loadImage回调属性来实现。下面列出了XML代码和VBA代码: ?...可以包括MsgBox语句来看看该过程是如何遍历每个元素项的。 (注意,我试着使用png图像但没有成功。)

    3.1K10

    用VBA实现Excel函数02:SUM

    1、不简单的SUM第1参数: SUM函数的参数提示上,number1是一定要有的,这个number1我们在Excel里使用的时候可能看不出它有什么特殊,那是因为我们没有去仔细想过。...2、不定长参数ParamArray: 你注意看SUM函数的参数提示,应该能注意到,它的参数最后有“...”这个东西,我们在前面没有说到过,不过,在Function函数里,我们让大家去看官方文档,如果仔细看了...仅用作 arglist 中的最后一个参数来指示最后的参数为 Variant 元素的 Optional 数组。...它无法用于 ByVal、ByRef 或 Optional ParamArray修饰符,是一种不定长的参数,就是你在函数中参数用逗号分隔开,函数内部收到的其实就是1个数组,所以我们在用SUM函数的时候,你可以不停的用逗号分隔需要相加的单元格...,多种形式输入的参数解析,不定长参数的传递和使用。

    2.8K20

    VBA实用小程序79:统计不同值或唯一值的VBA自定义函数

    图1 然而,这个公式不仅复杂,而且在处理混合数据时会很慢。因此,我们可以使用VBA来编写自定义函数。...由于OnError Resume Next语句,该错误被忽略。VBACollection 对象的一个特性是键不区分大小写。 LenB函数用于检查单元格是否为空白。...在VBE中,单击“工具——引用”,找到并勾选“MicrosoftScripting Runtime”,如下图2所示。 ?...使用Static关键字代替Dim,以便在函数调用之间保留Dictionary对象引用: Public Function COUNTDISTINCTdicStatic(ByRef rngToCheck As...如果不包含引用,则需要将Dictionary 对象声明为 Object类型,并将BinaryCompare设置为等于0的常量。 可以处理跨多列的数据。 示例如下图4所示。 ?

    1.8K20

    VBA实战技巧26:使用递归确定所有的引用单元格

    在Excel中,经常存在一个单元格引用另一个单元格中,而另一个单元格又引用其他单元格的情形。如何使用VBA代码编程确定指定单元格的所有引用单元格呢?...GetAllPrecedents函数可能会返回重叠的地址,例如B2:B10和B4,因为它使用联合单元格区域地址以提高效率。当代码沿引用单元格树导航时,如果它遇到之前导航过的单元格,将忽略它。...该函数不能作为自定义函数工作,因为当调用者是Range时,Range.ShowPrecedents和Range.NavigateArrows方法被禁用。...在代码中使用了Range.CountLarge,如果使用的是Excel2003或更早版本,则需要将其更改为Range.Count。...在Excel2010之前的版本中,Range.SpecialCells的返回值限制为8,192个不连续的单元格。你不可能打破此限制。

    1.5K10

    VBA解压缩ZIP文件03——解压准备工作

    要解压缩ZIP文件,所以肯定需要读写文件的功能,为了方便,把VBA中对文件的读写功能进行一个简单的封装,方便使用。...ZIP文件压缩后,保存数据使用的最小单位是bit,注意不是Byte,计算机的1Byte=8bit,正常在VBA中操作的最小单位是Byte,为了方便读取bit位的数据,写几个简单的函数。...01 CFile文件读写 主要是使用类模块对文件操作Open、Put、Get等关键字的简单封装,这样使用起来就更加的方便。...O_WRONLY O_RDWR End Enum Public Enum SeekPos OriginF CurrentF EndF End Enum '注意大文件long类型会溢出...解压ZIP的过程中,需要不停的从压缩数据的Byte数组中读取需要的bit,实现几个简单的函数: '取某一位的Bit Function GetBitFromByte(b As Byte, ZeroBaseIndex

    1.4K40

    VBA专题10-23:使用VBA操控Excel界面之添加动态菜单

    学习Excel技术,关注微信公众号: excelperfect 在本系列后面的示例程序中,你将会看到如何使用项目和带图像的库控件通过getItemLabel和getItemImage回调属性引用的VBA...注意,上面的VBA代码以类似于CustomUI Editor中的一种方式缩进,通过使用Debug.Print语句发送构建的XML代码到立即窗口。...下面展示了选择不同的工作表时的菜单内容: 640.gif 保留自定义复选框的勾选条件 在上面的示例XML和VBA代码中,当用户在工作表Data中单击动态菜单中的复选框后,复选框会相应地显示勾选或者取消勾选...如果要保留条件,可以在其被无效前存储其状态,然后在重新创建菜单时恢复其状态。这可以通过使用模块级的变量和getPressed回调属性来实现。...一般而言,即使工作簿中的代码执行完毕,工作簿中的公共级别变量、模块级变量和过程级静态变量仍然保留其值。可以使用以下四种方法清除这些变量存储的值: 在过程中或者在立即窗口中执行End语句。

    6.2K20
    领券