程序没有响应-excel vba for循环

时间:2015-12-07 21:31:32

标签: excel vba excel-vba for-loop match

如果两张纸上的两个字符串匹配

,我每次尝试按月值求和

现在我没有看到它在无限循环中的任何地方,但仍然这个程序在一段时间后没有响应,我必须最终关闭excel via;任务管理器,因为即使{{1}}命令也无效。

这是一个相当简单的程序,但我不知道如何让它比这短。请指教。

{{1}}

感谢您的所有努力,但即使使用数组方法,如果您想查看File此处,也会处于非响应状态。

2 个答案:

答案 0 :(得分:2)

此代码可能存在问题的原因有很多:

  1. 如果这是Excel的旧版或兼容模式版本,则此行可能会失败:wk.Range("N900000").End(xlUp).Row
  2. 您正在单独编写每个单元格,这非常耗时。如果Sheet3中有很多行,那么您的代码可能会显示为锁定状态,因为编写
  3. 需要很长时间
  4. 您的声明已放弃对类型的控制,因为所有“无类型”声明都是Variants。这使得调试非常困难。在你的评论中,你会问“这有必要吗?”。答:不重要,但它会将调试任务增加一个数量级,代码可能会以您不期望的方式工作。事实上,一个实际的答案是“是的,这是非常必要的”。
  5. 没有检查细胞值和类型。如果单元格为空或不是日期,则代码仍会运行,如果所有变量都为Variants,则运行Month(dt)时代码将无法正确汇总。
  6. 使用.Text属性可能会导致问题。例如,如果日期列太窄并且单元格中有####,那么这将是.Text值(如果您的变量是'未声明的'{{1},那么再次,您无法控制最好是VariantCstr(cell.Value)
  7. 您的代码效率非常低,因为它会一遍又一遍地遍历Sheet1中的相同数据。更好的方法是只将一次加载到一个集合中,该集合的键是您正在测试的字符串值。我在下面的示例中没有这样做,因为我有点时间但你应该考虑这样做。如果Sheet1有很多行,那么你的代码实际上会很慢。
  8. 另一点是,将数组写入工作表而不是一次只有一个单元格要快得多。在您的情况下,月聚合非常适合数组。因此,您可以使用一个来优化和缩短代码。下面的代码处理上述几点,并以数组为例。

    你似乎还不清楚Noam Hacker提出的Cstr(cell.Value2)建议。这是一个很好的建议,所以我在这段代码中给你了几个例子:

    Debug.Print

答案 1 :(得分:1)

Sheet1中考虑这个模拟数据:
MockUpData

首先在列T(销售日期?)的右侧添加一列,其中包含公式=MONTH(T2),用于单元格 U2

将每月标签添加/更改为整数(B1:样本中的M1)。

然后创建动态命名范围:

  • SalesItemCol,公式为=OFFSET(Sheet1!$N$1,1,0,COUNTA(Sheet1!$N:$N)-1,1)
  • SalesQtyCol,公式为=OFFSET(Sheet1!$N$1,1,5,COUNTA(Sheet1!$N:$N)-1,1)
  • SalesMonthCol,公式为=OFFSET(Sheet1!$N$1,1,7,COUNTA(Sheet1!$N:$N)-1,1)

最后在B2上,使用公式=SUMIFS(SalesQtyCol,SalesItemCol,$A2,SalesMonthCol,B$1)然后自动填充其余部分。

或者您可以创建宏来执行上述操作...