发布
社区首页 >问答首页 >一旦范围内的所有单元格都有值,就触发宏。

一旦范围内的所有单元格都有值,就触发宏。
EN

Stack Overflow用户
提问于 2016-11-29 20:11:31
回答 2查看 389关注 0票数 1

我想要触发一个宏,只有在给定范围内的所有单元格都有一个值之后才能运行。当工作簿关闭时,我希望打开输入范围而不输入值。当前,当打开工作簿时,下面的代码将运行。

代码语言:javascript
代码运行次数:0
复制
Sub Page_Setup()

Sheet1.Unprotect
Application.EnableEvents = False
Application.ScreenUpdating = False

Sheet1.Range("Inputs").Style = "40% - Accent2"
Sheet1.Range("Calcs").Style = "40% - Accent3"
Sheet1.Range("C8:C12").Value = "-"
Sheet1.Range("Calcs").Value = "-"
Sheet1.Range("C13").Value = 64
Sheet1.Range("C14:C16").Value = 0

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub

当用户在从C8到C12的每个单元格中输入一个值后,我希望宏运行。提前感谢您的帮助。

编辑:

我想要的是,只有当范围"C8:C12“有一个数值时,宏才能运行。我倾向于在工作簿最初打开时清除该范围,以避免显示在关闭工作簿时输入的值(并由宏计算)。下面的代码在打开工作簿时运行。

代码语言:javascript
代码运行次数:0
复制
Private Sub Workbook_Open()

Application.ScreenUpdating = False

Sheet1.Range("User").Value = Environ("UserName")
Sheet1.Range("Run_Date").Value = Format(Date, "mm/dd/yy")
Application.Run ("Page_Setup")

Application.ScreenUpdating = True

End Sub

然后,我想触发一个单独的宏(Case1)来运行一次C8:C12都有数值。我有下面的代码

代码语言:javascript
代码运行次数:0
复制
Private Sub Worksheet_Change(ByVal Target As Range)

Sheet1.Unprotect
Sheet2.Unprotect
Application.ScreenUpdating = False
Application.EnableEvents = False

Dim KeyCells As Range

Set KeyCells = Worksheets("Sheet1").Range("Inputs")

    If Not Application.Intersect(KeyCells, Range(Target.Address)) Is Nothing   Then

    Application.Run ("Case1")

End If

Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub

我的问题是,如果单元格没有数值,Case1将返回一个错误。很抱歉造成了混乱,我希望这能澄清我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-30 08:17:35

我的理解是你必须

  • ThisWorkbook代码窗格中放置以下代码: 私有子Workbook_Open() Application.ScreenUpdating = False Application.EnableEvents = False‘<-这是为了避免后续的’.Range(“输入”).ClearContents‘触发器'Worksheet_Change()’与Sheet1 .Range(“用户”).Value= Environ("UserName") .Range("Run_Date").Value =Format(日期),( "mm/dd/yy") .Range(“输入”).ClearContents End With Application.Run "Page_Setup“Application.EnableEvents = True Application.ScreenUpdating = True End Sub
  • Sheet1代码窗格中放置以下代码: 私有子Worksheet_Change(ByVal目标作为范围)与范围(“输入”)‘--引用您的“输入”范围(如果不是相交的话)(.Cells,如果更改影响引用范围,如果WorksheetFunction.Count(.Cells) = .Cells.Count,则<--如果引用范围“满”,数字Application.ScreenUpdating = False Application.EnableEvents = False sure 1.解除保护sure 2.取消对错误GoTo ErrHandler‘-的保护-确保始终退出此操作事件处理程序正确地Application.Run "Case1“ErrHandler:‘-还原设置Sheet1.Protect’--在需要时添加密码Sheet2.Protect‘<-添加密码(如果需要) Application.ScreenUpdating = True Application.EnableEvents = True End if End if Sub
票数 0
EN

Stack Overflow用户

发布于 2016-11-29 20:22:09

代码语言:javascript
代码运行次数:0
复制
Public b_is_run As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not b_is_run And (WorksheetFunction.CountA(Range("c8:C12")) = 5) Then
        b_is_run = True
        Debug.Print "run here"
    End If
End Sub

Public Sub restart()
    b_is_run = False
End Sub

您有一个公共布尔b_is_run,它检查代码是否运行一次,如果是,则不会再次运行它。如果要重新启动,请关闭工作表或restart()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40874946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档