Excel VBA删除行和抑制提示

时间:2014-07-19 16:18:06

标签: excel-vba vba excel

我有一张包含多张纸的工作簿。一个工作表是一个模板,允许用户填写数据,然后当他们点击“生成”单元格时,它会在工作簿中创建一个包含所有信息的新工作表。它实际上复制了一个带有代码的不可见工作表,并且复制的工作表由用户在初始模板中指定的内容重命名。

然后我有另一张名为“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工作表本身,选择一行,右键单击并选择删除,这确实有效,并且没有收到提示太多更改。但是当我实际点击其中一个生成的工作表中的“删除”单元格时,我仍然会收到提示:

  

太多变化

但它确实删除了该行。删除行是我想要的,但我不希望提示说太多更改。

很抱歉这么长的解释,但我认为需要了解发生了什么。

1 个答案:

答案 0 :(得分:0)

我只是想通了。我应该用它代替:

If Selection.Rows.Count <> 1 Then

而不是我试图使用的,这是:

If Selection.Rows(1).Cells.Count <> Columns.Count Then

这似乎运作良好。我应该被提示,但是当我不应该被提示时,我会被提示。