excel文件打开时 vba满足条件弹窗提醒?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了excel文件打开时 vba满足条件弹窗提醒?相关的知识,希望对你有一定的参考价值。

AG列为公式获得的数值,AH列为“是”或“否”。当同一行的AG列>25,AH列为“否”时,弹出对话框,内容“请进行报备!”,需要确认消掉对话框,不需要确认效果。当同一行的AG列<=25,AH列为“是”或“否”,或者当同一行的AG列>25,AH列为“是”时,不做任何反应,不弹出对话框。文件打开的时候自动检查并弹窗提示。这样的情况如何通过VBA实现。

注意工作表名的写法:

一、用工作表的大名写:

Private Sub Workbook_Open()    

    If Application.CountIfs(Sheet1.Columns("B"), ">25", Sheet1.Columns("C"), "否") Then MsgBox "请进行报备", 48

End Sub

二、用工作表的小名写:

Private Sub Workbook_Open()

    If Application.CountIfs(Sheets("月报表").Columns("B"), ">25", Sheets("月报表").Columns("C"), "否") Then MsgBox "请进行报备", 48

End Sub

三、提示:注意上面的工作表名的两种写法。

用工作表的大名,好处是大名不会变化,比如后续更改了工作表名称,则不用改代码。

用工作表的小名,如果你后续更改了工作表名称,则需要同时修改原来写在代码里的工作表名称。

追问

请再看一下,行号和列号变了,按截图里面的行号列号编代码就好。

追答

如果有多行符合 B格>25、C格为“否”,是不是只弹一次窗就行?
在文件打开时弹窗对吧。你先回答一下这个疑问,我晚上给你写。要吃饭了。

追问

简单说,就是文件打开时,哪怕只有一行满足条件都弹窗提醒,多行满足条件只用弹一次即可。除非文件打开时,一行都不满足条件才不弹窗提醒。注意我提到的后续判断条件,即如果“当同一行的AG列25,AH列为“是”时,不做任何反应,不弹出对话框。”感谢,麻烦了。

追答

已经更新了代码了。如果有问题再问

参考技术A 本文将讲述如何在Excel中打开工作簿时弹出一个提示窗口。如何使用VBA宏在打开工作簿或Excel文件弹出一个消息框。
打开工作簿时显示提示窗口
如果要在打开特定工作簿时显示消息框,可以使用Excel VBA宏来实现结果。只需执行以下步骤:
步骤1:打开您的Excel工作簿,然后单击开发工具选项卡下的“Visual Basic”命令,或者只需按“ALT + F11”快捷方式。

步骤2:然后将出现“Visual Basic编辑器”窗口。

步骤3:双击VBAProject窗格下的ThisWorkbook对象,将会显示“ThisWorkbook”的代码窗口。
步骤4:将以下VBA宏代码复制并传递到代码窗口。

Private Sub Workbook_Open()
MsgBox "pop up message box"
End Sub

步骤5:单击“保存”按钮,将此工作簿保存为Excel启用宏的工作簿,需要从“保存类型”列表框中选择“Excel启用宏的工作簿”。

步骤6:重新打开该工作簿,您将在当前工作表的顶部看到安全警告消息。单击“启用内容”按钮以激活VBA宏。

步骤7:一个提示窗口将会弹出。
参考技术B 如果仅仅是当到期日期距离当前日期还有15天打开excel表格时单元格变红提示即将到期,不必VBA,条件格式设置即可 参考技术C 使用VBA即可,代码如下:
Private Sub Workbook_Open()
Dim my_Range As Range
For Each my_Range In Worksheets(1).UsedRange
If my_Range.Column = 3 And my_Range = Date Then
MsgBox "到期了"
End If
Next
End Sub

excel vba 删除行直到条件

【中文标题】excel vba 删除行直到条件【英文标题】:excel vba Delete rows until criteria 【发布时间】:2018-03-14 20:08:52 【问题描述】:

我是 Excel VBA 的新手,我真的需要一些帮助。我尝试在整个网络上搜索解决方案,但找不到类似的问题。

我正在尝试创建一个宏,该宏将有助于根据某些条件删除行并继续删除行,直到满足另一个特定条件。

例如。在下表中,我想删除 Col A = 1 AND Col C = 0 的行,然后继续删除该行 UNTIL Col A = 1 下面的行和 Col C 0

  A  |  B  |  C
-----|-----|-----
 1   |  TC |  2 
-----|-----|-----
 2   |  TC |  1 
-----|-----|-----
 1   |  TC |  0 
-----|-----|-----
 2   |  TC |  2 
-----|-----|-----
 3   |  TC |  1 
-----|-----|-----
 1   |  TC |  2 
-----|-----|-----
 1   |  TC |  0
-----|-----|-----
 1   |  TC |  1
-----|-----|-----
 2   |  TC |  0
-----|-----|-----
 3   |  TC |  2

所以宏的最终结果是:

  A  |  B  |  C
-----|-----|-----
 1   |  TC |  2 
-----|-----|-----
 2   |  TC |  1 
-----|-----|-----
 1   |  TC |  2 
-----|-----|-----
 1   |  TC |  1
-----|-----|-----
 2   |  TC |  0
-----|-----|-----
 3   |  TC |  2

理想情况下,我想通过删除 Col A = 2 和 Col C = 0 的行并删除该行下方的行,直到 Col A = 2 和 Col C 0 再循环一次。

下面是我想出的宏。接受所有建议并渴望学习。

Sub deleterow()

Range("C2").Select
Do Until ActiveCell.Offset(0, -2) = "1" And ActiveCell.Value <> "0"
If ActiveCell.Value = "0" And ActiveCell.Offset(0, -2) = "1" Then
Rows(ActiveCell.Row & ":" & Rows.Count).Delete
End If
Loop

End Sub

期待回音!

谢谢

【问题讨论】:

【参考方案1】:

您的循环在第一行停止,因为符合条件。所以下面的代码从第一行循环到最后填充的行来搜索条件。

Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(1) 'Set the first worksheet to work
Dim n As Long, i As Long
Dim rng As Range, new_rng As Range

lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row 'lastrow number
For n = 1 To 2 'Criteria is Col A = 1 To 2
    For i = 1 To lastrow 'Loop from 1 to last row
        If ws.Cells(i, 1) = n And ws.Cells(i, 3) = 0 Then
            If rng Is Nothing Then Set rng = ws.Range("A" & i) 'Set first Range so Union won't give an error
            Set new_rng = ws.Range("A" & i)
            Set rng = Union(rng, new_rng) 'create a non contiguous range to delete
        End If
    Next i
Next n

rng.EntireRow.Delete

请注意,如果工作表很大,则不是最佳方法。有改善代码性能的最佳方法。使用了循环,因为这是 OP 尝试的方法。

另一种方法是过滤多条件并删除显示的行。

【讨论】:

提前道歉,因为我对此很陌生。我试图应用上面的代码,但它似乎不起作用。我正在查看您的代码,但我不确定我是否理解。我想我理解代码的概念,但我无法掌握其中的某些行。为什么是“如果 rng 什么都没有然后设置”..?不应该是“如果 rng 不是什么就设置”?而且我不明白“rng = Union(rng,new_rng)”这一行。 rng 怎么可能等于它自己的一个 Union 和一个新的 rng? 另外,我不确定过滤器和删除方法如何解决这个特定问题。因为宏需要继续删除,直到满足条件。但是,只要可行,我愿意接受任何解决方案。 联合用于创建非连续范围,如Range("B1:B5","C42:C65","Z300"),因此您可以使用 delete 一次删除所有内容。因为删除动作很慢,所以如果你只删除一次,它可以优化执行这些动作的时间。而If rng Is Nothing Then Set rng = ws.Range("A" &amp; i) 用于使用联合,因为如果没有 2 个范围,联合就会出错。所以对于第一个范围(当 rng 为空或什么都没有时),你设置rng=new_rng=ws.Range("A" &amp; i) 并参考this question了解如何使用自动过滤器和循环删除

以上是关于excel文件打开时 vba满足条件弹窗提醒?的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:不满足条件时如何让UDF返回0

Excel VBA:从最大值循环并检查条件

VBA:打开,编辑,保存...在 VBA 编辑器打开时工作,而不是在关闭时工作?

excel中if函数若满足条件返回“是”,不满足条件无返回值怎么写

excel,如筛选一样满足一个条件,返回所有数据

Excel VBA 条件格式与函数