vba三个问题,如何判断target属于范围?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vba三个问题,如何判断target属于范围?相关的知识,希望对你有一定的参考价值。
代码是下面的:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If IsNumeric(Target) And Target.Column = 1 And Target.Row > 10 Then Target = Target * 1000
Application.EnableEvents = True
End Sub
作用是在第一列,从第11行开始,输入一个数字,自动乘1000。
有三个问题,
第一个,有没有个语句能判断target属于range(),然后我自己设定个range,就不用用好几个条件与到一起来限制行列了。
第二个,为啥这个if不需要endif,我试了把前后两行application.enableevents=false/true删掉,然后就会变成e+255。
第三个,我试了不用and,用if里面套if,然后我就不知道该往哪写endif了,不写又提示没有endif,如果需要这样该怎么写啊
If Application.Intersect(Target, Range("A11:A"&range("A65536").end(xlup).row)) Is Nothing Then Exit Sub '问题一:定义target的范围,来限制change的区域
'问题二:如果if语句没有换行(回车)则不用end if
Application.EnableEvents = False '问题三:EnableEvents = False的作用是暂时关闭事件触发,也就是让change事件只发生一次,否则会进入死循环
If IsNumeric(Target) Then Target = Target * 1000 '已经在开头限制了target的范围
Application.EnableEvents = True '启用事件触发
End Sub 参考技术A 你那段代码就挺好的,这个计算不复杂,计算时间可以忽略不计,基本是秒算的,干嘛还要改。
Application.EnableEvents = False的意思是禁止事件触发,避免代码在乘以1000后向表格写入结果时,又重新触发事件,造成无止境的死循环,导致表格卡死崩溃。
Application.EnableEvents = True的意思是开启事件触发,它和前面那句是成对使用的。如果你前面有禁止事件触发的命令,那么在完成操作命令的后面,必须再加上这句开启事件触发的命令。否则后继如果表格里再次有数据发生变更时,就不会再触发事件了,因为之前执行代码时禁止了事件触发。
.
下面我只给你说说IF的用法:
像这样:
if A then B
这种是then后面没有换行,所以不需要End if, 写上End if反而是错误写法。
再像这样:
if A then
B
End if
这种是then后面换行了,所以必须要用End if来结束if语句。
再像这样:
if A then
B
Else
C
End if
这种是在条件不成立时,执行Else的下面的命令。
再像这样:
if A then
B
Elseif C then
D
Elseif E then
F
Else
G
End if
这种是需要依次判断多个条件,注意各条件的优先级,先判断前面的if条件,不成立时再继续向下判断后面的条件。如果前面的条件一旦成立了,则跳出if语句、后面的条件就不再向下判断了。
如何使用不同的变量在 VBA 中自动填充范围
【中文标题】如何使用不同的变量在 VBA 中自动填充范围【英文标题】:How to autofill a range in VBA with differing variables 【发布时间】:2021-05-25 13:14:30 【问题描述】:我试图弄清楚如何根据同一行中已定义的数据自动填充特定范围的单元格。我的任务更复杂,但可以在下面的代码中看到对步骤的简化。我想要实现的是:
-
定义我想要输出值的范围
将所选范围单元格(在其左侧)同一行中的两个值相乘,并在当前所选范围单元格中输出此数字。为此,要相乘的数字之一将取决于行中的字符串(描述其类型)。
遍历定义的范围并对每一行重复计算。
我当前的代码如下,并输出“应用程序定义或对象定义错误”。
任何帮助将不胜感激。
For a = Range("P12") To Range("P33") 'Range of cells I want to fill.
If Cells(a, -10).Value = "B" 'If the cell 10 to the left of our "a" value is = "B".
Then c = Cells(a, -10).Value * Worksheets("LCI").Range("D4").Value 'Then new variable "c" = (cell 9 to left of a) * (number from another sheet containing a database)
Cells(a).Value = c 'Update value of selected range cell to contain c which we calculated.
Next 'Repeat for all rows in range.
【问题讨论】:
【参考方案1】:你很接近。
您需要将a
视为一个单元格或范围对象。该变量是具有a.row
和a.column
等属性的单元格本身,这些属性描述了它在其所在工作表上的位置。
当您说Cells(a, -10)
时,您是在说“在Activesheet
上,我想要一个单元格,其中行为a
,列的编号为-10
”。没有行 a
(因为 a
是一个范围/单元格对象,并且因为您没有指定您想要的 a
的哪个属性,所以它将默认为 a.value
这可能什么都没有)并且有Activesheet 上没有 -10
列。
您的循环定义不正确。您可以使用 For Each 循环来遍历区域中的单元格。
改为:
For Each a In Range("P12:P33")
'clear `c` each loop
c=0
If a.Offset(,-10).Value = "B" Then 'start at cell `a` and move back 10 columns and grab the value
c = a.Offset(, -10).Value * Worksheets("LCI").Range("D4").Value
End If
a.Value = c
Next a
【讨论】:
非常感谢 JNevill!如果您能提供进一步帮助,我有一些后续问题。 1.输出值从所需行下方的一排开始,我是否需要从目标范围上方的范围开始? 2.每行输出的数字都是一样的,尽管“a.Offset(, -9).Value”的值实际上每次都在变化? 我对代码进行了快速更改,以在循环的每次迭代中清除变量c
并清理格式,以便代码在循环内缩进。这可能会解决您评论中的问题 2。至于问题1......我不确定那里发生了什么。它将遍历 P12 到 P33 中的每个单元格。您可能希望将 a.value = c
行移动到 If
块中,以便仅在 a.offset(,-10).value = "B"
时设置 a.value
。以上是关于vba三个问题,如何判断target属于范围?的主要内容,如果未能解决你的问题,请参考以下文章
excel VBA,case是不是和if elseif else一样属于优先判断,找到后面就不再判断了?