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

从函数单元格执行时,Excel VBA ByVal目标作为范围不更新目标工作表

是因为ByVal关键字在VBA中用于传递参数时,表示按值传递,即传递参数的副本而不是原始对象。在Excel VBA中,当将范围作为参数传递给函数时,如果使用ByVal关键字,函数将使用传递的范围的副本而不是原始范围。

这意味着,如果在函数中对传递的范围进行修改,原始范围不会被更新。这是因为函数只能修改传递的范围的副本,而不是原始范围。

为了解决这个问题,可以使用ByRef关键字来传递参数。ByRef表示按引用传递,即传递参数的引用而不是副本。这样,在函数中对传递的范围进行修改时,原始范围也会被更新。

以下是一个示例代码,演示了ByVal和ByRef的区别:

代码语言:vba
复制
Sub Test()
    Dim rng As Range
    Set rng = Range("A1:B2")
    
    ' 使用ByVal关键字传递范围
    ByValExample rng
    MsgBox rng.Address ' 输出 $A$1:$B$2,原始范围未被修改
    
    ' 使用ByRef关键字传递范围
    ByRefExample rng
    MsgBox rng.Address ' 输出 $C$1:$D$2,原始范围被修改
End Sub

Sub ByValExample(ByVal rng As Range)
    rng.Offset(2, 2).Value = "ByVal"
End Sub

Sub ByRefExample(ByRef rng As Range)
    rng.Offset(2, 2).Value = "ByRef"
End Sub

在上述示例中,ByValExample函数使用ByVal关键字传递范围,并在范围的偏移位置写入"ByVal"。然而,当在主程序中检查范围的地址时,发现原始范围并没有被修改。

相反,ByRefExample函数使用ByRef关键字传递范围,并在范围的偏移位置写入"ByRef"。当在主程序中检查范围的地址时,发现原始范围已经被修改。

总结起来,使用ByVal关键字传递范围时,函数只能修改传递范围的副本,而不是原始范围。如果需要修改原始范围,应该使用ByRef关键字传递参数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Excel VBA编程

使用ScreenUpdating属性设置更新屏幕 设置DisplayAlerts属性禁止显示警告对话框 借助worksheetfunction属性使用工作函数 设置属性,更改Excel工作界面 application...,一个worksheet对象代表工作簿中的一个普通工作 range 代表Excel中的单元格,可以是单个单元格,也可以是单元格区域 application对象操作 使用ScreenUpdating属性设置更新屏幕...——add 创建空白工作簿:如果直接调用workbook对象的add方法,而设置任何参数,excel将创建一个只含普通工作的新工作簿 指定用来创建工作簿的模板: 如果想将某个工作簿文件作为新建工作簿的模板...工作由活动工作变为活动工作时发生 followHyperlink 单击工作中的任意超链接时发生 PivotTableUpdate 在工作更新数据透视后发生 selectionchange...标签告诉VBA,当程序运行过程中晕倒运行时错误时,跳转到标签所在行的代码继续执行程序,实际上就是让程序跳过出错的代码,另一个地方重新开始执行程序。

45.5K33

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

可以在启动(当Excel开启时)动态设置值,可以在运行时改变它们的值(在使元素无效后通过使用VBA回调过程)。...正如本文开头提到的,也可以在满足某条件时在运行时动态地隐藏(和取消隐藏)内置组。这样的例子包括:选择了图表工作、选择了特定的工作组合框中选择了特定项、以及勾选了网格线复选框。...如果活动工作不是标准工作,就隐藏该组,否则该组可见。 注意,当打开工作簿时,创建ribbon对象。编辑VBA代码可能销毁这个新创建的对象。...与隐藏(和取消隐藏)内置组相似,可以在运行时当满足某条件时动态地隐藏(和取消隐藏)内置选项卡。例如,运行时当满足某条件时,下面的示例XML代码和VBA代码可以隐藏(和取消隐藏)“开始”选项卡: ?...在Excel 2007中,Invalidate方法使功能区中所有的控件无效。随后,调用HideHomeTab过程。如果活动工作不是标准工作,就隐藏“开始”选项卡,否则该选项卡可见。

8K20
  • 暂停或延迟Excel VBA运行的3种方法

    虽然Excel VBA没有用于暂停代码运行的内置功能,但可以使用Application.Wait或Windows API的Sleep函数等方法来引入延迟。...例如,任务是自动化单元格区域A2:A7到C2:C7复制值的过程,并暂停代码脚本10秒。然后,Excel将C2:C7中的值与D2:D7中的数值相乘,并将结果放入单元格区域E2:E7中。...End Sub 使用循环来暂停 如果需要在暂停时间修改工作或在Excel数据集中输入数据,则上述两种方法不适用。此时,可以使用循环来暂停Excel VBA。...如果VBA代码延迟时不需要与Excel交互,则可以使用基于Application.Wait和Sleep函数的方法。这些方法主要帮助在运行大型VBA脚本时高效地分配PC资源。...如果在VBA代码脚本暂停时需要在Excel工作中输入数据,则应尝试基于循环的方法。它可以暂停代码的执行,直到在Excel中重组或输入数据,然后继续完成代码。

    3.7K30

    VBA代码库09:增强的CELL函数和INFO函数

    excelperfect 本文介绍的自定义函数来源于wellsr.com,以Excel的CELL函数和INFO函数为样板,可直接返回工作工作簿的名称或工作簿路径,以及与Excel及其操作环境有关的各种信息...Excel研究\06.2 VBA代码库\09\[VBACodeLibrary09.xlsm]Sheet1 下面的公式来拆分出工作簿路径、工作簿名称和工作名称。...,FIND("]",CELL("filename",A1))+1,999) 结果返回工作名称: Sheet1 详细内容参见:Excel函数学习24:CELL函数 NameOf函数 NameOf函数用来增强...A1)或VBA单元格区域如Range("A1") ' 仿照Excel内置信息函数CELL和INFO ' 开发:wellsr.com Public FunctionNameOf(Optional ByVal...注意,使用Application.Volatile以确保在打开工作簿或重新计算单元格时,所有引用NameOf函数单元格都会得到更新

    4.6K10

    VBA: 隐藏模块中出现编译错误:的解决对策

    通过64位office软件打开早期的excel文件,如果代码中存在早期面向32位office编写的VBA代码,可能会存在上述的编译错误。...(2)如果没有访问文档中 VBA 代码的权限,请与文档作者联系,让作者更新隐藏模块中的代码。...2 更新旧版本的VBA代码 对于在 Office 2010 版本之前(VBA 版本 6 和更早版本)编写的 VBA 代码,需要修改为在 64 位 Office 版本中运行,否则在 64 位平台上运行时会导致错误...此外,还必须更新任何包含指针或句柄以及 64 位整数的用户定义类型 (UDT),使之使用 64 位数据类型,同时,必须验证所有变量赋值是否正确,以防止发生类型匹配错误。...End If End Function (2)在Project界面上,右击sheet1工作,选择查看代码,将如下代码拷贝进去。

    12.9K10

    Excel事件(二)工作事件

    大家好,上节介绍了excel事件的基础知识,后面就按照事件的分类来介绍,本节将首先介绍vba程序开发中最常用的工作事件。...二、工作事件分类 上图介绍工作事件代码编写位置时,可以看到工作对象对应有多种事件类型,最常用的9中工作事件如下图所示: 工作事件发生在工作被激活、用户修改,以及更新工作上的单元格或数据透视时...当Worksheet_Change事件执行时,会将操作的单元格Range对象传递到参数targe中,然后就用来对参数进行判断,来空值用户对参数的更改。...即选中的工作单元格就触发change事件,此时将更改的单元格作为参数传递给参数Target (target是单元格对象类型参数)。...示例 平时使用excel如果多列数据,选某个单元格的数据时容易选错行。那么下么就通过selectchange事件来实现,选中一个单元格时,所在行的单元格填上颜色。

    3.6K10

    Excel VBA事件——Worksheet

    Worksheet工作中常用的事件个人认为有3个: 1、Worksheet_SelectionChange: 选择改变的时候,意思是单元格的选择变化后发生的事件: Private Sub Worksheet_SelectionChange...选中所有单元格,设置条件格式: =ROW()=selectrow 在事件中设置工作重新计算,因为CELL("row")在单元格选择变化的时候是不会重新计算的 Private Sub Worksheet_SelectionChange...(ByVal Target As Range) End Sub 这个可以用来监控数据的变化,比如某个单元格数据是否改变成了某个目标,如果是就可以执行某种代码。...Cancel = True End If End If End If End Sub 工作事件的代码是放在Sheet#里面的,如果仔细看过Workbook...工作事件还有一些其他的事件,也可以去尝试用用,根据自己的实际情况选择去使用。

    3K50

    仿Excel的撤销功能

    标签:VBA工作事件 这是在www.vbaexpress.com中看到的一个示例,实现了自己以前想做而未做的事情。...也就是,模仿Excel的撤销功能,特别是当VBA代码对工作进行操作后,使用Excel原始的撤销功能是无法恢复的,但可以使用VBA代码来实现,似乎就像Excel的撤销功能一样。...Target.Offset(, 1).Value Application.UNDO ' 撤销最后一次输入 Target.Offset(, 1).Value = Target.Value ' 将之前的值放置到目标单元格右侧的单元格...i = i + 1 ' 增加实例, 用于UNDO过程 For Each rCell In rngToProcess ' 遍历目标区域中的单元格 With Sheets("UNDO...或者,在完美Excel微信公众号中发送消息: 仿撤销功能 获取示例工作簿下载链接。 或者,直接到知识星球APP完美Excel社群中下载该工作簿。

    15110

    Excel实战:使用VBA实现自动规划求解

    标签:VBA,规划求解 规划求解可能是Excel中最好的功能之一,但它使用起来相当不便,本文探讨一种自动化实现这项功能的方法。 规划求解功能确定实现特定结果所需的输入。...图3 3.单击“确定”,Excel尝试确定可能的解决方案,并相应地更新单元格E12。 图4 4.一旦找到解决方案,单击“确定”关闭单变量求解对话框。...使用VBA自动化求解 我们可以将相关的单元格进行命名,然后在代码中运用,这样更加灵活且通用。...: I4: SetCell I8: ChangeCell 在这两个单元格中输入下面的值: I4 = Profit I8 = SalesUnits 接着,在工作代码模块,输入下面的代码: Private...Sub Worksheet_Change(ByVal Target As Range) Dim inputCells As Range '列出所有输入单元格. (1)命名单元格或 (2

    3.3K20

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

    Excel中,经常存在一个单元格引用另一个单元格中,而另一个单元格又引用其他单元格的情形。如何使用VBA代码编程确定指定单元格的所有引用单元格呢?...'不能遍历受保护工作中的引用单元格 '不能识别隐藏工作中的引用单元格 Public Function GetAllPrecedents(ByRef rngToCheckAs Range) As Object...注意,这段代码不会遍历关闭的工作簿或受保护的工作追踪引用单元格,也不会在隐藏的工作中找到引用单元格。...该函数不能作为自定义函数工作,因为当调用者是Range时,Range.ShowPrecedents和Range.NavigateArrows方法被禁用。...在Excel2010之前的版本中,Range.SpecialCells的返回值限制为8,192个连续的单元格。你不可能打破此限制。

    1.4K10

    VBA专题10-25:使用VBA操控Excel界面之一个示例程序

    学习Excel技术,关注微信公众号: excelperfect 在前面的一系列主题中,你已经学到了很多小的修改工作簿外观的VBA代码。下面,我们将介绍一个简单的示例程序,实现下面的功能特点: 1....如果激活的工作(名为Sheet1)具有指定的工作级命名区域(例如,名为MyRange的单元格区域),那么启用Custom选项卡中不同组中的一组控件按钮。...能够单元格上下文菜单中访问自定义控件(名为Remove USD)。 要创建这个程序,执行下列步骤: 1. 创建一个新工作簿,将其保存为启用宏的工作簿。 2....右击工作选项卡,选择插入来添加一个图表工作。 3. 重命名工作为Sample、Sheet1和Sheet2。 4. 激活工作Sheet1,选择一个单元格区域,在“名称”框中输入“Sheet1!...ItemLabel = ItemLabels(index) '可替换,如果项目标签被存储在工作Sheet1单元格区域A1:A7 '使用下面的代码: 'ItemLabel

    2.3K10

    一起学Excel专业开发26:使用类模块创建对象5

    '对事件进行声明 Event ChangeColor(uCellType AsanlCellType, bColorOn As Boolean) '添加新属性,引用包含Cell对象的工作 Property...ChangeColor(mcolCells(Target.Address).CellType, True) Cancel = True End If End Sub '捕获右击工作单元格事件...ChangeColor(mcolCells(Target.Address).CellType, False) Cancel = True End If End Sub '捕获工作单元格内容修改事件...对BeforeDoubleClick事件和BeforeRightClick事件进行了修改,使之能够引发新的事件,并传递给ChangeColor事件目标单元格的类型和指定颜色开或关的布尔值。...'创建新的Cells集合 Set gclsCells = New CCells Set gclsCells.Worksheet = ActiveSheet '对当前工作中已使用区域中的每个单元格创建

    69930

    Jupyter Notebooks嵌入Excel并使用Python替代VBA

    在本文的其余部分,我将向你展示如何: 使用Jupyter笔记本在Excel和Python之间共享数据 在笔记本上写Excel工作函数(udf) 脚本Excel与Python代替VBA Excel获取数据到...Excel调用Python函数 你可以直接Excel工作簿中调用Python函数,而不是在Excel和Jupyter之间不断移动数据然后运行一些Python代码 PyXLL的主要用例之一是用Python...编写自定义Excel工作函数(或“ UDF”)。...这用于在使用Python函数构建的Excel中构建模型,这些函数当然可以使用其他Python库(例如pandas和scipy)。 你也可以在Jupyter笔记本中编写Excel工作函数。...你可以将整个数据范围作为pandas DataFrames传递给函数,并返回任何Python类型,包括numpy数组和DataFrames!

    6.4K20

    Excel自定义任意图表的通用模式

    还有一种是数据多少固定,选中数据时可以使用For to语句从头到尾遍历,选中指定数据制图时可以使用For each语句。...SVG Close #1 接着,将该文件导回Excel,如果是放在单元格的迷你图,本公众号前期分享过导入Excel图片的代码,读者可自行搜索;如果是放在工作指定位置的大图,以下一句代码即可: ActiveSheet.Pictures.Insert...自动刷新 ---- 刷新图表有两种方式,一种是指定一个按钮,点击刷新: 另外可以自动刷新,新建一个新的宏,如下所示,借助Worksheet_Change事件,当工作数据有变更自动促发VBA的运行。...该代码有两个模块,首先删除当前工作中的所有图片(代码前期分享过,可公众号搜索),接着调用四象限方块图这个宏。...VBA+SVG在Excel制图的优势比DAX+SVG在Power BI中非常明显:首先,VBA中的For 语句可以很方便的循环,DAX需要新建虚拟索引;其次,Excel单元格具有灵活性,在Power BI

    2.8K10

    Excel编程周末速成班第21课:一个用户窗体示例

    图21-1:Addresses工作模板 程序运行时,它将执行以下任务: 1.使Addresses工作处于活动状态。 2.找到数据的第一个空白行。...3.输入ValidateData作为过程名称;在类型下选择“函数”。 4.单击确定。...你知道第一列标题位于单元格A2中。这意味着第一行空白开始于单元格A3或它下面的任何单元格中。有几种方法可以识别第一个空行。这里使用其中的一种,如下: 1.单元格A2开始作为参考点。...VBA学习信息 本文为知识星球:完美Excel社群正在陆续推出的《Excel编程周末速成班》系列中的一篇,到2020年12月27日,此系列已更新至第21课。...第13课:使用Excel内置函数编程 第14课:格式化工作 第15课:查找和替换操作 第16课:图表编程简介 第17课:高级的图表编程技术 第18课:使用用户窗体创建自定义对话框 第19课:用户窗体控件

    6.1K10

    java 字符串数组 下标_运行时错误9:使用字符串数组时,下标超出范围「建议收藏」

    我是vba脚本的新手 . 我正在尝试编写下面的函数,但无法成功完成 . 我真的很感激我能得到的任何帮助 ....status = “EXIT” Then Exit Do Loop End Sub Sub StopModule() status = “EXIT” End Sub Private Sub Wait(ByVal...() ,它是dll文件中的用户定义函数 ....它生成范围(1,10)中的随机数字符串;然后将字符串中的thrid随机数与excel中的单元格值进行比较,以使用某些字符串值更新excel中的单元格 ....本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.4K50

    常见的复制粘贴,VBA是怎么做的

    此外,它们被设计为特定的源工作复制到该示例工作簿中的另一个目标工作。 通过调整对象引用的构建方式,可以轻松修改这些行为。...例如,通过限定指定目标单元格区域的对象引用,可以将单元格区域复制到其他工作工作簿。...因此,无论哪个Excel工作簿处于活动状态,引用都能正常工作Excel功能区中的复制命令 在使用VBA代码复制单元格区域之前,看看Excel功能区中的“复制”按钮命令。...以一个例子来说明: 如果查看示例1(复制到剪贴板)和示例2(复制到目标区域)的结果,会注意到目标工作与源工作看起来几乎相同。换句话说,Excel复制并粘贴全部(值、公式、格式)。...相反,它使用单元格F5作为工作复制的混合引用的结果。这将导致(i)错误的结果和(ii)循环引用。

    11.9K20

    常用功能加载宏——单元格聚光灯

    如果Excel表格里数据比较多的时候,查看数据很容易看错行,这时候如果给要查看的这行数据标记颜色,那么查看数据就方便多了。...vbNewLine & "End Sub" For i = 1 To ActiveWorkbook.VBProject.VBComponents.Count '找到活动工作组件...End If End With Exit For End If Next i End Sub 这个功能的原理就是在当前活动工作中...重新计算的目的就是为了激活条件格式中的函数: =CELL("row")=ROW() Application.CutCopyMode = False判断这个条件的目的是: 如果复制了单元格,再选中其他单元格想去粘贴的时候...另外由于插入了Worksheet_SelectionChange事件代码,如果文件保存的是启用宏的格式,将会给出提示: ? 因为有加载宏一步就能添加这个功能,所以这里就可以不保存VBA代码。

    1.2K31

    最完整的VBA字符串知识介绍

    示例: Sub Exercise() ActiveCell = "完美Excel" End Sub 运行代码后,当前单元格中会输入字符串“完美Excel”。...要将字符、字符串或表达式转换为大写,可以调用VBA的UCase函数或Microsoft Excel的UPPER函数,这些函数接受一个参数作为要考虑的字符串或表达式。...字符串的左子字符串 如果有一个现有字符串,但希望使用字符串左侧字符中的多个字符创建一个新字符串,则可以使用Microsoft Excel 的LEFT函数VBA的Left函数。...如果在String1中找到String2(作为String1的一部分),函数将返回第一个字符的位置。下面是一个例子: 该函数的第一个版本要求解释器左边检查String1,寻找String2。...InStr函数用于左侧开始检查字符串。

    2.7K20

    Excel实战技巧52: 更清楚地显示数据有效性列表

    数据有效性(即“数据验证”)是Excel中常使用的一项功能。然而,在使用数据有效性创建好下拉列表后,我们不能够随便修改列表中的字体或字体大小。...图1 我们可以使用一点小技巧,用VBA代码使得当用户选择数据有效性列表所在的单元格时,增大工作的显示比例,使数据有效性列表中的字体随之变大,从而更清楚地看到其内容,其效果如下图2所示。 ?...lDVZoom = 120 lDVType = 0 Application.EnableEvents = False On Error Resume Next '目标单元格的有效性类型...,这样,在选择数据有效性列表单元格时将工作的尺寸扩大为120%。...如果所选择的单元格中没有设置数据有效性,那么工作表尺寸恢复为100%。效果演示如下图3所示。 ? 图3 上述代码的图片版如下: ?

    1.2K10
    领券