使用Worksheet.Change事件来添加一个新的工作表

我有一个单元格范围(特别是D6:D34),其中单元格中的所有值都具有相应的表单。 然而,因为我刚刚手动添加工作表,当我添加一个新值(或更改单元格值)时,我正在考虑使用Private Sub Worksheet_Change(ByVal Target as Range)允许自动创build工作表细胞改变。 这是我试图使用,但现在我得到一个错误,“表名已经存在”,因为它向下看整个列。 我试过使用error handling跳过存在的,但它最终移动到下一个检查,但离开“Sheet1”和“Sheet2”等等任何build议如何设置?

 Private Sub Worksheet_Change(ByVal Target As Range) Dim hlValue As Range For Each hlValue In Sheets(1).Range("D6:D34") ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = hlValue Next End Sub 

我也应该说,如果其中一个单元格值被删除,工作表也应该被删除。 某种If CellValue <> Exist, Delete ? 我找不到任何东西用来检查它是否存在除了花哨的function。 我应该使用其中之一吗?

编辑:好的,我现在有这个。 这应该足够了。

 Private Sub Worksheet_Change(ByVal Target As Range) Application.DisplayStatusBar = True Application.ScreenUpdating = False 'Run faster Application.DisplayAlerts = False 'Just in case Dim shtName As Variant For Each shtName In Sheets(1).Range("D6:D34") If WorksheetExists((shtName)) Then 'do nothing Else ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = shtName Application.StatusBar = "Creating new sheet for " & shtName 'Just in case it's running slowly Sheets("Admin").Select End If Next Application.StatusBar = "READY" Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub Function WorksheetExists(sName As String) As Boolean WorksheetExists = Evaluate("ISREF('" & sName & "'!A1)") End Function 

我找不到任何东西用来检查它是否存在除了花哨的function。 我应该使用其中之一吗?

是的你应该! 工作表是Collection对象的一部分,没有内置的Exists (或类似的)方法,您可以查询。 这样的function不是很花哨:),如果你不熟悉这个function和/或调用其他子程序,这将是一个很好的介绍。

在最简单的情况下:

 Function SheetExists(sName As String) As Boolean Dim w as Worksheet On Error Resume Next Set w = Worksheets(sName) SheetExists = Not w Is Nothing End Function 

这是如何工作的:

 If SheetExists("sheet1") Then 'Do something Else 'Sheet doesn't exist, so do something else End If 

您将string值作为sName传递给函数。 无论这个表是否存在,函数都会返回TrueFalse

首先, SheetExists函数试图按名称将Worksheetvariables设置为指定的工作表。 如果工作表名称不存在,这可能会失败,所以我们将这些知识与Resume Next语句一起使用。 在发生错误的情况下, w将不会被分配工作表,并且将保持为Nothing ,然后使用布尔expression式( Not w Is Nothing )作为函数的返回值。 如果表单存在,那么w就不会是空的,所以函数将返回True ,如果表单不存在, w将为Nothing ,所以函数将返回False

上面的函数只使用ActiveWorkbook ,所以这个更强大的版本也允许你指定一个父工作簿。

 Function SheetExists(sName As String, Optional wb as Workbook = Nothing) As Boolean 'This function checks whether worksheet 'sName' exists in ' workbook object 'wb'. If no parameter is passed for 'wb' then ' assume to use the ActiveWorkbook Dim w as Worksheet If wb Is Nothing Then Set wb = ActiveWorkbook On Error Resume Next Set w = wb.Worksheets(sName) SheetExists = Not w Is Nothing End Function 

注意: On Error Resume Next没有被忽视的情况相对较less,但是在一个非常小而特定的函数中使用这个函数,具有明确的目的和期望是可以的。

或者,也可以使用蛮力迭代集合的Items来查询集合是否存在,这不依赖On Error Resume Next

 Function SheetExists2(sName as String) As Boolean Dim ws as Worksheet, ret as Boolean For Each ws In ActiveWorkbook.Worksheets If ws.Name = sName Then ret = True Exit For End If Next SheetExists2 = ret End Function