引用单元格时出错 - 需要常量表达式
Error while referencing cell - Constant Expression Required
我想做什么?
代码的第 3 行有一个时间值(30 秒),用于在一定时间后重复宏,但我正在寻找,而不是在代码中写 30 秒,我想在代码中写 30 或其他任何内容sheet Record
的 F2
单元格,每次我想从那里更改时间值。
我试过的解决方法
我用下面的代码替换了第三行
Public Const cRunIntervalSeconds =ThisWorkbook.Worksheets("Record").Range("F2").Value
' run my code every 30 seconds or whenever I want from the F2 cell
然后我也报错了,所以我尝试用("$F")
代替("F2")
,但还是没有解决。我是 VBA 的新手,但相信它背后有一些我遗漏的简单的东西。
问题来了!
行号3 给我一个错误,.Value
突出显示为
Compile Error: Constant Expression Required
下面是代码
Option Explicit
Public RunWhen As Double
Public Const cRunIntervalSeconds = ThisWorkbook.Worksheets("Record").Range("F2").Value ' time value in Seconds to run a macro from F2 cell
' When I use the below code in the place of 3rd line, it works fine but I need to control it from F2 cell
' Public Const cRunIntervalSeconds = 30
Public Const cRunWhat = "The_master" ' the name of the procedure to run
Dim FirstTime As Boolean
Sub StartTimer()
Set cRunIntervalSeconds = ThisWorkbook.Worksheets("Record").Range("F2").Value
If FirstTime Then
'change for today + 9:00 AM
RunWhen = Date + TimeSerial(8, 55, 0)
Else
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
End If
Application.OnTime EarliestTime:=RunWhen, _
Procedure:=cRunWhat, Schedule:=True
End Sub
Sub The_master()
Call Macro2
' Call StartTimer to run macro again
If Time > TimeSerial(12, 0, 0) Then
'do nothing
Else
StartTimer
End If
End Sub
Sub StopTimer()
'useful for testing to stop any scheduled macro
On Error Resume Next
Application.OnTime EarliestTime:=RunWhen, _
Procedure:=cRunWhat, Schedule:=False
End Sub
Sub Auto_Open()
FirstTime = True
'Change for 9:00 AM
If Time > TimeSerial(8, 55, 0) Then
FirstTime = False
End If
Call StartTimer
FirstTime = False
End Sub
我的完整代码有点复杂,它在上午 9 点开始一个宏,然后每 30 秒重复一次,直到下午 2 点。
使用 Const statement 声明常量。
Declares constants for use in place of literal values.
如果您希望它是可变的(例如可变单元格值,那么您需要声明一个变量而不是常量!
所以声明一个变量
Public RunIntervalSeconds As Long
并初始化它,例如在 Workbook_Open
或 Record
工作表的 Worksheet_Change
事件中:
RunIntervalSeconds = ThisWorkbook.Worksheets("Record").Range("F2").Value
在你 set/initialized 一个变量值之后你可以在任何模块中使用它。
或者您可以使用 function
到 return 单元格 F2 的值。如果您想避免每次使用该函数时都重复从单元格中读取值,您可以使用 Static
变量,这样它只在第一次使用时读取它:
Public Function RunIntervalSeconds(Optional ByVal ForceRefresh As Boolean = False) As Long
Static CellValue As Long ' this variable will keep the value because it is static
If CellValue = 0 Or ForceRefresh Then ' if the variable was not initialized yet read
' read the value from the cell
CellValue = ThisWorkbook.Worksheets("Record").Range("F2").Value
End If
' and return it from the function
RunIntervalSeconds = CellValue
End Function
然后可以使用此函数代替 public 变量。
您可以像 RunIntervalSeconds
一样使用它,它将使用在第一次调用时从单元格中读取的值,或者您可以使用 RunIntervalSeconds(ForceRefresh:=True)
来刷新单元格中的值。
我想做什么?
代码的第 3 行有一个时间值(30 秒),用于在一定时间后重复宏,但我正在寻找,而不是在代码中写 30 秒,我想在代码中写 30 或其他任何内容sheet Record
的 F2
单元格,每次我想从那里更改时间值。
我试过的解决方法
我用下面的代码替换了第三行
Public Const cRunIntervalSeconds =ThisWorkbook.Worksheets("Record").Range("F2").Value
' run my code every 30 seconds or whenever I want from the F2 cell
然后我也报错了,所以我尝试用("$F")
代替("F2")
,但还是没有解决。我是 VBA 的新手,但相信它背后有一些我遗漏的简单的东西。
问题来了!
行号3 给我一个错误,.Value
突出显示为
Compile Error: Constant Expression Required
下面是代码
Option Explicit
Public RunWhen As Double
Public Const cRunIntervalSeconds = ThisWorkbook.Worksheets("Record").Range("F2").Value ' time value in Seconds to run a macro from F2 cell
' When I use the below code in the place of 3rd line, it works fine but I need to control it from F2 cell
' Public Const cRunIntervalSeconds = 30
Public Const cRunWhat = "The_master" ' the name of the procedure to run
Dim FirstTime As Boolean
Sub StartTimer()
Set cRunIntervalSeconds = ThisWorkbook.Worksheets("Record").Range("F2").Value
If FirstTime Then
'change for today + 9:00 AM
RunWhen = Date + TimeSerial(8, 55, 0)
Else
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
End If
Application.OnTime EarliestTime:=RunWhen, _
Procedure:=cRunWhat, Schedule:=True
End Sub
Sub The_master()
Call Macro2
' Call StartTimer to run macro again
If Time > TimeSerial(12, 0, 0) Then
'do nothing
Else
StartTimer
End If
End Sub
Sub StopTimer()
'useful for testing to stop any scheduled macro
On Error Resume Next
Application.OnTime EarliestTime:=RunWhen, _
Procedure:=cRunWhat, Schedule:=False
End Sub
Sub Auto_Open()
FirstTime = True
'Change for 9:00 AM
If Time > TimeSerial(8, 55, 0) Then
FirstTime = False
End If
Call StartTimer
FirstTime = False
End Sub
我的完整代码有点复杂,它在上午 9 点开始一个宏,然后每 30 秒重复一次,直到下午 2 点。
使用 Const statement 声明常量。
Declares constants for use in place of literal values.
如果您希望它是可变的(例如可变单元格值,那么您需要声明一个变量而不是常量!
所以声明一个变量
Public RunIntervalSeconds As Long
并初始化它,例如在 Workbook_Open
或 Record
工作表的 Worksheet_Change
事件中:
RunIntervalSeconds = ThisWorkbook.Worksheets("Record").Range("F2").Value
在你 set/initialized 一个变量值之后你可以在任何模块中使用它。
或者您可以使用 function
到 return 单元格 F2 的值。如果您想避免每次使用该函数时都重复从单元格中读取值,您可以使用 Static
变量,这样它只在第一次使用时读取它:
Public Function RunIntervalSeconds(Optional ByVal ForceRefresh As Boolean = False) As Long
Static CellValue As Long ' this variable will keep the value because it is static
If CellValue = 0 Or ForceRefresh Then ' if the variable was not initialized yet read
' read the value from the cell
CellValue = ThisWorkbook.Worksheets("Record").Range("F2").Value
End If
' and return it from the function
RunIntervalSeconds = CellValue
End Function
然后可以使用此函数代替 public 变量。
您可以像 RunIntervalSeconds
一样使用它,它将使用在第一次调用时从单元格中读取的值,或者您可以使用 RunIntervalSeconds(ForceRefresh:=True)
来刷新单元格中的值。