分析两个布尔标准的最简洁的ElseIf逻辑是什么?

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

本来我是这样的:

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以允许删除工作表,并在必要时添加一个新工作表,而不必使用另一个function从工作表中擦除数据。 现在我需要一个执行这个的方法:

 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 

我试图确定最简洁(有效的执行方法,我已经提出了这个问题:

 If readOnlyFlag = True AND sheetExists = True Then AddSheetAtEnd = False Exit Function Elseif readOnlyFlag = False Then If sheetExists = True Then DeleteSheet(ShtName) With ThisWorkbook .Sheets.Add(After:=.Sheets(.Sheets.Count)).Name = ShtName AddSheetAtEnd = True End With End If 

有没有更强大或简洁的方式来组织这个? 这是多余的,还是错过了可能的情况?

您可以将布尔值转换为1和0,然后求和以找出是什么。 对于每一个附加的布尔值,乘以2的附加幂(第一次testing是在2 ^ 0,所以时间1 – 不乘 – 秒testing在2 ^ 1,所以时间2,第三次testing是在2 ^ 2,等4等等)

对于你的具体情况,你会做Abs(readOnlyFlag) + Abs(sheetExists) * 2

  • 如果readOnlyFlag是False,则得到0,True则得到1
  • 如果sheetExists是False你0和True你得到2

结果是0 =两者都是假的,1 =只读标志为真,2 = sheetExists为真,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 

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

 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 

设置错误命令以继续。

如果不是只读,则删除表单,如果不存在,则继续。

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

将错误命令恢复正常