vba excel通过数组循环

时间:2016-11-30 20:49:37

标签: excel-vba vba excel

我是vba的新秀。 我创建了一个在微观基础上工作的解决方案,但是当我向该代码添加其他参数时,无法运行相同的代码。 我创建了一个带有答案单元的多项选择测验,在单独的(隐藏)工作表上测试答案。相邻单元格显示“是”或“否”响应。我在网上研究的功能效果很好。我正在尝试清除所有单元格的内容,以便用户可以完成测验,清除所有响应以便再次进行测试。

我有395个问题,我创建了代码来清除“范围(”B2“)。ClearContents” 我的子程序有395个这样的命令,需要45-60秒。我正在寻找更有效的解决方案。我不想只清除整个列中有用户输入的395个非相邻单元格。

Sub Test_Clear()
Range("B2,B5,B7,B9,B11").ClearContents
End Sub

我的单元格列表在Sheet2 D1上:D395 D1中的每个单元格:D395列出了我要清除的Sheet1上的单元格(即B6,B11,B17,B22,B35等)如何引用这些单元格Sheet2并执行ClearContents?

3 个答案:

答案 0 :(得分:0)

虽然您可以在VBA而不是Sheet2范围内对列表进行硬编码,但您可以在sheet2中引用该单元格列表并一次清除所有内容:

Sub clearall()
    Dim rngCell, listCells As String
    For Each rngCell In Sheet2.Range("D1:D395").Cells
        If listCell <> "" Then listCell = listCell & "," & rngCell.Value Else listCell = rngCell.Value
    Next
    Sheet2.Range(listCell).ClearContents

End Sub

答案 1 :(得分:0)

如果您只想清除A列中包含其中某些内容的单元格,则可以使用此

Sheet1.Range("A:A").SpecialCells(xlCellTypeConstants).ClearContents
'or
Sheet1.Range("A1:A395").SpecialCells(xlCellTypeConstants).ClearContents

答案 2 :(得分:0)

VBA Join函数可用于将值连接到字符串中,并且需要Excel Transpose函数来翻转&#34;翻转&#34;列值将2D数组转换为1D行值数组:

stringAdress = Join([Transpose(Sheet2!D1:D395)], ",")

ThisWorkbook.Worksheets("Sheet1").Range(stringAdress).ClearContents

如果Sheet2!D1:D395范围内的任何单元格为空,则上述操作将导致错误。

在Excel 2016中,TextJoin函数可用于忽略空单元格(未测试):

stringAdress = [TextJoin(",", True, Sheet2!D1:D395)]

ThisWorkbook.Worksheets("Sheet1").Range(stringAdress).ClearContents