【问题标题】:Excel VBA Delete Row and Suppress PromptExcel VBA 删除行并禁止提示
【发布时间】:2014-07-19 16:18:05
【问题描述】:

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

然后我有另一个名为“打开”的工作表。在 A 列中,从第 3 行开始,在第一个空白单元格中输入新的工作表名称,然后自动排序。然后,用户可以单击 Open 工作表中的工作表名称,它将跳转到该工作表。

在生成的工作表上,每个工作表都有一个“删除”单元格。当用户单击它时,它会提示用户是否确定要删除工作表。如果他们选择否,则什么也不会发生,但如果他们选择是,它将删除工作表并从“打开”工作表的列表中删除工作表名称。如果用户从下拉列表中选择已解决,它也将与单击删除按钮相同,但它不会提示用户是否确定要删除,它只是将其删除。

这是对它的作用的一个非常简短的细分,并且所有这些代码都运行良好。

我要做的是向“打开”表添加其他信息,同时填写 B 列和 C 列。随着工作表的创建、更新和解析,打开工作表会自动填充和更新。这不是问题,并且可以正常工作。问题是尝试编写将删除 Open 工作表中的整行而不提示用户更改的单元格过多的代码(此提示的说明如下)。

在“打开”表中,我的代码可以防止用户一次更改多个单元格。如果删除了多个单元格,则允许这样做并且不显示任何消息。如果填充了超过 1 个单元格,它将提醒用户并撤消更改。代码如下,并且确实有效。

打开工作表代码

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 表中尝试了此代码,但它并不完全有效。

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 行。添加的行是:

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

我说它不完全有效,因为如果我在打开工作表本身上,选择一行,右键单击并选择删除,这确实有效,并且没有收到提示说太多更改。但是,当我实际单击其中一张生成的工作表中的“删除”单元格时,我仍然会收到提示:

太多改动

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

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

【问题讨论】:

  • 也许这会有所帮助。从对象浏览器。 Property DisplayAlerts As Boolean Member of Excel.Application 。然后按 F1 得到The default value is True. Set this property to False if you don’t want to be disturbed by prompts and alert messages while a macro is running; any time a message requires a response, Microsoft Excel chooses the default response.

标签: excel vba


【解决方案1】:

我刚刚想通了。我应该改用这个:

If Selection.Rows.Count <> 1 Then

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

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

这似乎运作良好。当我应该提示时,系统会提示我,而当我不应该提示时,我不会提示。

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    相关资源
    最近更新 更多