【问题标题】:vba excel looping thru an arrayvba excel通过数组循环
【发布时间】:2016-12-01 06:20:15
【问题描述】:

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

我有 395 个问题,我创建了代码来清除“Range("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?

【问题讨论】:

  • 公平地说,我没有使用过.ClearContents,但是是什么阻止你只使用完全合格的声明? Sheets("Sheet2").Range("insertRangeHere").ClearContents
  • 我喜欢测验有一个隐藏的答案表:]
  • 欢迎来到 Stack Overflow!请查看我们的SO Question Checklist 以帮助您提出一个好问题,从而得到一个好的答案。
  • 谢谢乔,如果我违反了协议,非常抱歉。一些善良的参与者确实给了我一些方向。我搜索了多个网络资源,但找不到解决方案。

标签: excel vba


【解决方案1】:

虽然您可以在 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

【讨论】:

  • 感谢您的帮助。如果这有所作为,我正在使用 Excel 2010。
  • 我使用了您发布的代码并得到了错误:“运行时错误'1004'对象'_Worksheet'的方法'范围'失败。我正在使用按钮单击运行宏。按钮位于 Sheet1,要清除的单元格位于 Sheet1。位于 sheet2 上的 D1:D395 出现我需要参考
  • 您是否更改了此代码的相关部分以指向正确的工作表?我猜它正在Sheet2.Range(listCell).clearContents 线上轰炸。点击调试按钮,查看 VBE 中Locals 窗口中listCell 变量中存储的值。它应该是从 Sheet2 的D1:D395 范围构建的单元格引用的逗号分隔列表。
  • 嗯?是的,两个 Range 语句都指示 Sheet2。本地窗口显示要清除的适用单元格的逗号分隔列表。什么将 ClearContents 语句指向 Sheet1 上的单元格?单击按钮时,它是活动工作表。
  • 您可能想将Sheet2.Range(listCell).ClearContents 更改为Sheet1.Range(listCell).clearContents 这告诉excel“在Sheet1 中有一个单元格范围,由listCell 中的单元格列表表示。清除这些单元格的内容那张纸”
【解决方案2】:

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

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

【讨论】:

  • 谢谢。我的意图是只清除列中的特定单元格。如果它们碰巧是空白的,不希望它引发错误。
【解决方案3】:

VBA Join 函数可用于将值连接到字符串中,并且需要 Excel Transpose 函数将列值二维数组“翻转”为一维行值数组:

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

【讨论】:

  • 是的,有些目标单元格可能是空白的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2019-07-05
  • 2015-09-05
  • 1970-01-01
  • 2018-04-28
相关资源
最近更新 更多