我有一个名为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
是否有更强大或简洁的方法来组织这个?这是多余的,或遗失的可能情况?
答案 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
结果是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