Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在excel VBA中循环列的行直到为空_Excel_Vba - Fatal编程技术网

在excel VBA中循环列的行直到为空

在excel VBA中循环列的行直到为空,excel,vba,Excel,Vba,我有一个带有列“N”的工作表,其中包含30行,每行中都有复选框 在vba中,我想做一个循环,在空单元格处停止,即第31行,我尝试了以下方法: Private Sub CommandButton1_Click() Range("N9").Select Do If CheckBox1.Value = True Then Call do_OM ActiveCell.Offset(1, 0).Select Loop while ActiveCel

我有一个带有列“N”的工作表,其中包含30行,每行中都有复选框

在vba中,我想做一个循环,在空单元格处停止,即第31行,我尝试了以下方法:

Private Sub CommandButton1_Click()

 Range("N9").Select
 
 Do

 If CheckBox1.Value = True Then Call do_OM 
 
 ActiveCell.Offset(1, 0).Select
 
  
 
 Loop while ActiveCell.value = "" 


 


End Sub
这个循环只适用于一行,这意味着带有复选框的单元格是空单元格,而我想要的是在没有复选框的单元格处停止。。怎么办

+

如何说“如果复选框(行号).Value=True?”


提前感谢:)

编辑 此部分将遍历非活动的X复选框

Dim nm As Object
Set nm = ActiveSheet.CheckBox1
nm.TopLeftCell.Row

'Iteration
For Each nm In ActiveSheet.OLEObjects
    If TypeName(nm.Object) = "CheckBox" Then
        debug.print nm.TopLeftCell.row
        If nm.Object.Value = True Then ' do stuff
    End If
Next nm
    
由于复选框没有绑定到工作表,因此实际上没有一种方式来表示
复选框(行号)
。也有意义,因为一行上可能有多个框。
但是,如果复选框的名称与行号对齐,则可以遍历它们。不管怎样,你都可以重复它们,但是是的

你可以这样做:

For i = 1 To 30
    ActiveSheet.CheckBoxes(i).Value
Next i

循环遍历这些框。第二张显然会贯穿整张纸。
我不认为您可以检查单元格中是否有框,但您可以使用
.TopLeftCell.Row
检查该框所在的单元格,该行应返回对象左上角的行。然后,您可以使用
Intersect
将其与范围交叉引用(可能还有
.TopLeftCell.Column

可能有兴趣。但正如我所说的,它并不是真的检查一个单元格是否有复选框,而是按照我的建议使用Intersect检查所有复选框,并检查其中是否有任何复选框在单元格中。然而,你可以说最终结果是一样的

编辑注释:这是用于活动X框的注释

Dim nm As Object
Set nm = ActiveSheet.CheckBox1
nm.TopLeftCell.Row

'Iteration
For Each nm In ActiveSheet.OLEObjects
    If TypeName(nm.Object) = "CheckBox" Then
        debug.print nm.TopLeftCell.row
        If nm.Object.Value = True Then ' do stuff
    End If
Next nm
    
ActiveX复选框
  • 删除、替换或注释
    调试。使用您需要的内容打印
    行,例如
    doom
    调用
    被视为不推荐使用)
  • 请注意:
    ole.Name
    ,但
    ole.Object.Value
选项显式
子复选框示例()
将ole设置为对象
对于ActiveSheet.OLEObjects中的每个ole
如果TypeName(ole.Object)=“复选框”,则
调试。打印
Debug.Print ole.Name,ole.TopLeftCell.Address(0,0)_
ole.BottomRightCell.Address(0,0)
如果ole.Object.Value=True,则
“不要
Debug.Print“复选框”&勾选ole.Name&“
其他的
Debug.Print“复选框”&未勾选ole.Name&“
如果结束
如果结束
下一个ole
端接头
子复选框示例2()
将ole设置为对象
对于ActiveSheet.OLEObjects中的每个ole
如果TypeName(ole.Object)=“复选框”,则
Debug.Print ole.Name,ole.TopLeftCell.Address(0,0)_
ole.BottomRightCell.Address(0,0)
使用ole.Object
Debug.Print.Caption.Value
以
如果结束
下一个ole
端接头

在本例中,您的选择实际上与复选框无关。无论您选择的单元格是什么,您始终会检查复选框1的值。那么,如何验证其中是否没有复选框?复选框是
形状
,形状位于叠加在工作表网格上的不同UI层上。形状的位置由其左上角到Excel屏幕左上角的距离(以点为单位)定义,以便点(0,0)等于单元格A1的左上角。由于单元和形状位于不同的层上,因此单元不能处于形状中,也不能处于单元中。您可以在同一坐标处定位多个形状,但无法看到所有形状。您可以使用Z顺序来确定哪一个应该“在顶部”。谢谢您的回答,我将尝试这一个,您能告诉我例如,我有Dim nm作为字符串,其中nm包含复选框的名称(chekbox1或checkbox2..),为什么我不能应用这一行代码:row_se=nm&TopLeftCell。row我得到一个错误,我想得到这样的结果(如果nm=checkbox3)row_se=checkbox3.TopLeftCell.RowExcel对使用字符串和名称很挑剔。Dim nm作为一个对象,它应该可以工作,请参见编辑。我在迭代中得到了奇怪的结果,我意识到他们迭代了表单控制复选框,而不是活动的x复选框。我仍然会得到一些错误,啊,真的,因为我使用的是活动的x复选框,我真的不知道这两种类型之间的区别,尽管activex有打开的“查看代码”是的,对不起,这也让我有点困惑。第一部分应适用于其他部分,最后一部分应适用于活动X。