我正在编写一个VBA宏来管理手机数据库。我正在测试的是,如果前几个月(当月和前两个月)中的任何一个有活动。如果所有三个月都显示"没有使用"然后我们将检查一个布尔框为true,然后停用该行。
我有部分写的逻辑。
我从一个具有计算字段的交叉表查询开始。这样我的查询始终保持结构。我被评估了值的字段。如果字段值大于零,请继续。如果它等于零,则将计数器设置为1.一旦计数器达到3,将该行的布尔框标记为true,表示不使用。
下面列出了代码。我的桌子上的月份列前面有两列,因此我的rsIndexes从2开始,经过12,整个表格有14列。通过我创建的For Next循环,我可以非常自然地管理出现的情况,例如7,6,5(7月,6月,5月)。
以下是我的问题:当您必须使用记录集索引1,12,11(1月,12月,11月)评估数据时,如何使用此结构并遍历记录集。从1回到12回到11这是我的问题。
Sub detectNonUsage2()
Dim rsNonUsageList As New ADODB.Recordset
lastMonthIndex = [Forms]![frmNonUsageLogic]![cboCurMonth].ListIndex
lastMonthIndex = (lastMonthIndex + 2)
MsgBox lastMonthIndex
rsSQL = "Select * from qryDeviceIDbyMonth"
rsNonUsageList.Open rsSQL, CurrentProject.Connection, adOpenKeyset, adLockReadOnly
Do Until rsNonUsageList.EOF
curVal = rsNonUsageList(lastMonthIndex)
curMonth = rsNonUsageList(lastMonthIndex).Name
curCount = 0
For curField = lastMonthIndex To lastMonthIndex - 2 Step -1
If rsNonUsageList(lastMonthIndex) = 0 Then
curCount = curCount + 1
Else
End If
curMonth = rsNonUsageList(curField).Name
Debug.Print curMonth
Next curField
If curCount >= 3 Then
'set flag for nonUsage
Else
End If
rsNonUsageList.MoveNext
Loop
rsNonUsageList.Close
End Sub
答案 0 :(得分:1)
您可以使用这样的简单查询:
Update
CellLines
Set
Deactivated = True
Where
PhoneId Not In
(Select Distinct PhoneId From CellCalls
Where CallDate Between
DateSerial(Year(Date()), Month(Date()) - 2, 1) And Date()
答案 1 :(得分:0)
我不确定“使用此结构”是什么意思,因为您的解释和代码有点难以理解。如果您只需要迭代一年中的数月,那么有效的解决方案将使用模运算。请考虑以下表达式:
result = ((month + delta + 11) mod 12) + 1
result
将是从month
开始delta
步骤转换的结果月份,例如+1或-1。这假定month
和result
在1到12的集合中。
另一种方法是简单地使用基本的 if语句来检测和控制当您处于边缘时会发生什么。如果继续前进:
if month == 12 then result = 1 else result = month + 1
否则如果向后移动
if month == 1 then result = 12 else result = month - 1