用于分析两个布尔条件的最简洁的ElseIf逻辑是什么?

时间:2016-02-22 23:30:07

标签: excel vba excel-vba

我有一个名为AddSheetAtEnd的函数,它在当前的书中创建一个新的工作表。我正在使用它来准备输入某些数据的工作表。

原来我是这样的:

matrix()

如果工作表确实存在,则此函数退出,并且我有另一个函数在稍后写入数据之前擦除工作表中的所有内容。我决定添加一个可选参数Function AddSheetAtEnd(ShtName As String) If Not IsWorksheetName(ShtName) Then 'if worksheet doesn't exist, create sheet With ThisWorkbook .Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = ShtName AddSheetAtEnd = True End With Else 'if worksheet exists, quit function AddSheetAtEnd = False Exit Function End If End Function 来授予删除工作表的权限,并在必要时添加一个新工作,而不是必须有另一个功能来擦除工作表上的数据。现在我需要一种执行方式:

readOnlyFlag

我正在尝试确定最简洁(最有效的执行方式。到目前为止,我已经提出了这个问题:

If readOnlyFlag = True AND sheetExists = True Then
    'do nothing, exit
Elseif readOnlyFlag = False AND sheetExists = True Then
    'delete sheet
    'create sheet
Elseif readOnlyFlag = True AND sheetExists = False Then
    'create sheet
Elseif readOnlyFlag = False AND sheetExists = False Then
    'create sheet
End If

是否有更强大或简洁的方法来组织这个?这是多余的,或遗失的可能情况?

2 个答案:

答案 0 :(得分:3)

您可以使用错误并做出如下假设:

On Error Resume Next
If Not readOnlyFlag Then
    'delete sheet
End If
shtCount = ThisWorkbook.Worksheets.Count
'create sheet
If ThisWorkbook.Worksheets.Count > shtCount Then 'Set your flag or pass back the result from the function
On Error GoTo 0

设置错误命令以继续。

如果它不是只读的,那么删除工作表,如果它不存在,它就会继续。

然后创建工作表,如果它已经存在,则继续

将错误命令设置回正常

答案 1 :(得分:3)

您可以将布尔值转换为1&0; s和0' s然后求和以找出什么是什么。对于每个额外的布尔值,将其乘以2的额外幂(第一次测试在2 ^ 0,因此时间1 - 不要相乘 - 第二次测试在2 ^ 1,因此时间2,第三次测试在2 ^ 2,所以第4次等等)

根据您的具体情况,您可以Abs(readOnlyFlag) + Abs(sheetExists) * 2

  • 如果readOnlyFlag为False,则为0,而True为1
  • 如果sheetExists为False 0和True,则为2

结果是0 =两个都是假,1 = readOnlyFlag是真,2 =表单超时为真,3 =双为真

通用代码如下所示:

Select Case Abs(readOnlyFlag) + Abs(sheetExists) * 2
    Case 0: 'Both False
    Case 1: 'readOnlyFlag true
    Case 2: 'sheetExists true
    Case 3: 'Both True
End Select

根据您的具体情况,它变为:

With ThisWorkbook
    Select Case Abs(readOnlyFlag) + Abs(sheetExists) * 2
        Case 0, 1:  .Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = ShtName
        Case 2:     DeleteSheet (ShtName)
        Case 3:     AddSheetAtEnd = False
    End Select
End With