我有一些VBA可以根据Excel中的工作表创建摘要报告。
作为其中的一部分,有一个For... Next
循环,有时会运行正确的次数,有时会运行一次太少次。
以下是代码示例:
For i = 1 To customerCount
' Position 0 is the customer name
customerStatus(i, 0, 0) = customerList(i)
For j = 1 To statusCount
' Fill each count entry with 0, as we don't yet know the numbers at each status
customerStatus(i, j, 0) = 0
customerStatus(i, j, 1) = 0
customerStatus(i, j, 2) = 0
customerStatus(i, j, 3) = 0
Next
Next
现有的数组名为customerList
(包含按字母顺序排列的客户名称列表),此处用于填充另一个数组。在这个阶段,循环有时会运行,以便新数组填充完整列表,有时会运行,因此最后一个条目永远不会被转移。
如果我在循环结束后查询变量i
,那么在错过最后一个客户的情况下它等于customerCount
,并且在它拥有完整客户列表的情况下它等于{{ 1}}。
更新: 为了提供更多信息,我在Excel& amp; VBA和这是一份工作报告。
工作表每个客户站点有一行,每个站点有两个状态,显示客户在两个产品中的每个产品的销售路径。使用命名范围设置电子表格,以便用户可以添加和删除列而不会导致任何错误。他们还可以添加要选择的新状态,这些状态会自动显示在工作表的下拉列表中。
报告采用每种状态(有多少状态)并给每个状态一个标题。所有在该状态下至少有一个站点的客户都会列出该状态的站点数量以及总数。当用户转到包含报告的工作表时,代码就会运行。
这里是整个代码
customerCount + 1
答案 0 :(得分:1)
围绕这个结构构建代码:
Option Explicit
Public Sub TestMe()
Dim i&, j&, customerCount&, statusCount&, counter&
Debug.Print "Code should run: "; customerCount * statusCount
For i = 1 To customerCount
For j = 1 To statusCount
counter = counter + 1
Next j
Next i
Debug.Print "Code runs: "; counter
End Sub
然后你会看到它运行了多少次以及应该运行多少次。最有可能的结果是相同的,除非你做了一些技巧,如:
答案 1 :(得分:0)
这个问题显然与你的变量没有被正确宣布有关。
如果您声明
Dim i, j, k As Long
仅k
类型为Long
,i
且j
属于Variant
类型。如果未指定类型,则VBA将采用Variant
。
所以这些线条完全一样......
Dim i As Variant, j As Variant, k As Long 'all specified
Dim i, j, k As Long 'assumes Variant for non specified types i and j
请注意,此行为与VB.NET非常不同,其中行末的类型指定逗号分隔列表中每个变量。
但在VBA中,行末的类型仅指定最后变量!