我有一张包含多张纸的工作簿。一个工作表是一个模板,允许用户填写数据,然后当他们点击“生成”单元格时,它会在工作簿中创建一个包含所有信息的新工作表。它实际上复制了一个带有代码的不可见工作表,并且复制的工作表由用户在初始模板中指定的内容重命名。
然后我有另一张名为“Open”的表格。在A列中,从第3行开始,在第一个空白单元格中输入新的工作表名称,然后自动排序。然后,用户可以单击“打开”工作表中的工作表名称,它将跳转到该工作表。
在生成的工作表上,每个工作表都有一个“删除”单元格。当用户点击它时,它会提示用户是否确定要删除工作表。如果他们选择否则没有任何反应,但是如果他们选择是,它将删除工作表并从“打开”工作表上的列表中删除工作表名称。如果用户从下拉列表中选择已解决,则它也会像单击删除按钮一样工作,但它不会提示用户是否确定要删除,只是删除它。
这是对此操作的一个非常简短的细分,并且所有这些代码都很有效。
我要做的是在“打开”表单中添加其他信息,同时填写B和C列。在创建,更新和解决工作表时,将自动填充并更新“打开”工作表。这不是问题而且有效。问题是尝试编写将删除Open表中整行的代码,而不是提示用户有太多单元格被更改(下面提示的解释如下)。
在“打开”表单中,我有一些代码可以防止用户一次更改多个单元格。如果删除多个单元格,则允许此操作,并且不显示任何消息。如果填充了多个单元格,它将提醒用户并撤消更改。这个代码在下面并且确实有效。
打开工作表代码
If Target.Cells.Count > 1 Then
vData = Target.Formula
For Each vClear In vData
If vClear <> "" Then 'If data is only deleted then more than one cell can be changed.
MsgBox "Change only one cell at a time", , "Too Many Changes!"
Application.Undo
Exit For
End If
Next
End If
在生成的新工作表中,当用户想要删除工作表时,我会有此代码。
生成的工作表代码
If Target.Address = rDelete.Address Then
sSheetName = ActiveSheet.Name
If sSheetName <> "Template2" Then
sYesNo = MsgBox("Are you sure you want to delete outage " & sSheetName & "?", vbYesNo + vbDefaultButton2, "Delete Outage " & sSheetName)
If sYesNo = 6 Then
Application.DisplayAlerts = False 'Suppresses the confirmation when deleting a worksheet
'Removes the site name when the outage is deleted from the Open sheet
Do Until ActiveWorkbook.Worksheets("Open").Cells(iOpen, 1).Value2 = "" Or ActiveWorkbook.Worksheets("Open").Cells(iOpen, 1).Value2 = sSheetName
iOpen = iOpen + 1
Loop
ActiveWorkbook.Worksheets("Open").Cells(iOpen, 1).Value2 = ""
ActiveWorkbook.Worksheets(sSheetName).Delete
Worksheets("Template").Activate
Exit Sub
Else
rDelete.Offset(1, 0).Select
End If
End If
End If
所有代码都很棒。但是,因为在我只在“打开”表单上添加A列之前,我只需要在打开的工作表中清除包含工作表名称的一个单元格,这就是此代码在生成的工作表中的作用。
ActiveWorkbook.Worksheets("Open").Cells(iOpen, 1).Value2 = ""
我现在需要将该行更改为此。
ActiveWorkbook.Worksheets("Open").Rows(iOpen).EntireRow.Delete
该代码确实有效,但问题是,由于Open表单上的代码,用户会收到“太多更改”的消息警告。当整个行被删除时,我需要以某种方式抑制该消息。
我在Open表单中尝试了这段代码,但它并不完全正常。
If Target.Cells.Count > 1 Then
vData = Target.Formula
For Each vClear In vData
If Selection.Rows(1).Cells.Count <> Columns.Count Then 'If entire row is deleted it allows it, like for a resolved outage or deleting the outage
If vClear <> "" Then 'If data is only deleted then more than one cell can be changed.
MsgBox "Change only one cell at a time", , "Too Many Changes!"
Application.Undo
Exit For
End If
End If
Next
End If
此代码与打开工作表的原始代码之间的区别是我添加了一个If和End If Line。添加的行是:
If Selection.Rows(1).Cells.Count <> Columns.Count Then
我说它不完全正常,因为如果我在Open工作表本身,选择一行,右键单击并选择删除,这确实有效,并且没有收到提示太多更改。但是当我实际点击其中一个生成的工作表中的“删除”单元格时,我仍然会收到提示:
太多变化
但它确实删除了该行。删除行是我想要的,但我不希望提示说太多更改。
很抱歉这么长的解释,但我认为需要了解发生了什么。
答案 0 :(得分:0)
我只是想通了。我应该用它代替:
If Selection.Rows.Count <> 1 Then
而不是我试图使用的,这是:
If Selection.Rows(1).Cells.Count <> Columns.Count Then
这似乎运作良好。我应该被提示,但是当我不应该被提示时,我会被提示。