【发布时间】:2017-08-01 07:24:46
【问题描述】:
上周我的上一个问题得到了很好的回答,我回来寻求更多指导。
我们有一个 vba 宏,它遍历 Word 文档中的修订次数,然后根据字数为我们提供难度分数。最近,我们开始使用两个不同的过程,需要两个不同的等级,但它们基于相同的算法(修订数/字数)。本质上,我正在尝试制作一个 If ElseIf ,它将根据使用的过程返回分数。前端的计算都是一样的,所以只需要实现正确的定义即可。
当我添加askMsg问题时,原始过程仍然完好无损;但是,当我尝试运行第二个进程时,返回值为 0(应该是 1-10 的值)。我将新流程作为 If 还是 ElseIf 都没有关系;原始代码的工作原理相同,而新代码尽管它们几乎相同,但它们的工作原理相同。我已经包含了完整的代码,并用 'XX 指明了关注的行。
Sub Grade()
Dim oDoc As Document
Dim nWords As Long
Dim commentCount As Long
Dim revisionCount As Long
Dim totalRev As Long
'Dim hasChanges As Boolean
'Dim oRevision As Revision
'Dim oComment As comment
Dim rDensity As Variant
Dim mGrade As Long
Set oDoc = ActiveDocument
' update and count number of words
nWords = oDoc.Range.ComputeStatistics(wdStatisticWords)
' The following line was added to handle an accidental macro-button press on an empty
' document. It executes only if nWords is 0 to avoid the divide-by-zero error; it does not handle an
' error in getting the word count.
If nWords = 0 Then mGrade = 10: GoTo ExitManuscriptGrade
'check to see if the document has changes,
revisionCount = oDoc.Revisions.count ' get the revision count
commentCount = oDoc.Comments.count ' get the number of comments
' all the following scoring code was left exactly the same
totalRev = commentCount + revisionCount
'calculate density of revisions
rDensity = totalRev / nWords
'XX Here is where the issues start XX
askMsg = "Is this a Top Tier Sub?"
msgResult = MsgBox(askMsg, vbYesNo)
Select Case msgResult
Case vbYes
TopTier = True
Case vbNo
TopTier = False
End Select
If TopTier = True Then
'Assign manuscript grade
If rDensity > 0.4 Then
mGrade = 1
ElseIf rDensity <= 0.4 And rDensity > 0.37 Then
mGrade = 2
ElseIf rDensity <= 0.37 And rDensity > 0.34 Then
mGrade = 3
ElseIf rDensity <= 0.34 And rDensity > 0.3 Then
mGrade = 4
ElseIf rDensity <= 0.3 And rDensity > 0.26 Then
mGrade = 5
ElseIf rDensity <= 0.22 And rDensity > 0.26 Then
mGrade = 6
ElseIf rDensity <= 0.18 And rDensity > 0.22 Then
mGrade = 7
ElseIf rDensity <= 0.16 And rDensity > 0.18 Then
mGrade = 8
ElseIf rDensity <= 0.13 And rDensity > 0.16 Then
mGrade = 9
ElseIf rDensity <= 0.13 Then
mGrade = 10
End If
'Message box output for testing
MsgBox (mGrade) ' XX mGrade is always set to zero XX
Exit Sub
ElseIf TopTier = False Then
'XX This is where the code originally went prior to adding in askMsg XX
'Assign manuscript grade
If rDensity > 0.31 Then
mGrade = 1
ElseIf rDensity <= 0.31 And rDensity > 0.27 Then
mGrade = 2
ElseIf rDensity <= 0.27 And rDensity > 0.24 Then
mGrade = 3
ElseIf rDensity <= 0.24 And rDensity > 0.2 Then
mGrade = 4
ElseIf rDensity <= 0.2 And rDensity > 0.18 Then
mGrade = 5
ElseIf rDensity <= 0.18 And rDensity > 0.16 Then
mGrade = 6
ElseIf rDensity <= 0.16 And rDensity > 0.13 Then
mGrade = 7
ElseIf rDensity <= 0.13 And rDensity > 0.11 Then
mGrade = 8
ElseIf rDensity <= 0.11 And rDensity > 0.09 Then
mGrade = 9
ElseIf rDensity <= 0.09 Then
mGrade = 10
End If
'Message box output for testing
MsgBox (mGrade) ' XX This outputs the mGrade correctly XX
End If
Exit Sub
' Execution jumps to this label if there are no words in the document
ExitManuscriptGrade:
End Sub
我不确定我是否遗漏了一个小命令或需要其他一些 Else 语句,但我们将不胜感激任何帮助!
【问题讨论】:
-
在
If TopTier = True上放一个断点,然后检查此时rDensity的值是多少?然后使用 F8 单步执行代码以查看发生了什么(以及原因)。
标签: vba if-statement ms-word