我试图寻找这个问题的答案,但无济于事。我需要此宏来运行特定工作簿上名为常规的特定工作表。目的是让单元格I24每分钟乘以1.0003(据我所知,这使得它成为一个循环)。以下代码仅在我打开常规表单时有效。当我切换到另一个工作表时它停止循环。
此外,无论选择了常规工作表,我都希望宏自动打开以打开工作簿,以便常规工作表上的I24不会被重定向而不会重定向到工作表。只是你知道,我在工作簿中的各种其他工作表上引用了该单元格,这就是为什么我需要宏不断运行。下面是我的代码(因为我对VBA很新,所以可能没有达到最佳状态):
Sub auto_open()
WshtNames = Array("General")
Application.ScreenUpdating = False
Dim num As Long
num = Sheets("General").Range("I24").Value
num = num * 1.0003
Range("I24").Value = num
Application.OnTime Now + TimeValue("00:01:00"), "auto_open"
Application.ScreenUpdating = True
End Sub
谢谢,非常感谢您的帮助。
答案 0 :(得分:2)
分析您的代码并提出改进和删除不必要代码的建议
在这种特定情况下,切换Application.ScreenUpdating
并没有多大意义,因为Range("I24")
中只有一次更新。因此如果你把它关闭就没有收获
如果您有许多更新,那么只有一个优势,以便在切换Application.ScreenUpdating = True
时一次性执行这些更新。
使用Option Explicit
。这会强制您正确声明所有变量。
您设置WshtNames
但从不使用它,因此可以删除此行。
使用Worksheets
代替Sheets
,除非您确实需要使用Sheets
(Sheets
还包含图表,不仅包含工作表)。
如果num
为Long
,那么它只能包含整数/整数。因此,如果你乘以num = num * 1.0003
,它将自动转换为Long
,这与num = num
的结果相同,这意味着它不会改变任何内容。您需要至少使用Double
或Decimal
。
您没有为Range("I24").Value = num
指定工作表,因此Excel假定范围在活动工作表中。这就是您选择其他工作表时代码失败的原因。永远不要让VBA猜测工作表总是指定正确的Worksheets("General").Range("I24").Value = num
。
所以我们可以一起改变你的代码......
Sub auto_open()
WshtNames = Array("General") '(3) can be removed because WshtNames is never used
Application.ScreenUpdating = False '(1) dosn't make much sense
Dim num As Long '(5) wrong data type
num = Sheets("General").Range("I24").Value '(4) use worksheets
num = num * 1.0003 'see (5)
Range("I24").Value = num '(6) Always specify a worksheet
Application.OnTime Now + TimeValue("00:01:00"), "auto_open"
Application.ScreenUpdating = True
End Sub
进入这个...
Option Explicit
Public Sub auto_open()
Dim num As Double
With Workheets("General") 'note we use a with statement to specify the sheet for the ranges (starting with a dot now!)
num = .Range("I24").Value
num = num * 1.0003
.Range("I24").Value = num
End With
Application.OnTime Now + TimeValue("00:01:00"), "auto_open"
End Sub
甚至更短,因为我们不需要num
变量用于那个简短的计算:
Option Explicit
Public Sub auto_open()
With Workheets("General") 'note we use a with statement to specify the sheet for the ranges (starting with a dot now!)
.Range("I24").Value = .Range("I24").Value * 1.0003
End With
Application.OnTime Now + TimeValue("00:01:00"), "auto_open"
End Sub
答案 1 :(得分:1)
这部分代码的逻辑错误:
Dim num As Long
num = Sheets("General").Range("I24").Value
num = num * 1.0003
Long
是一个完整的数字。如果将其乘以1.0003
,则与乘以1
的情况相同。请考虑使用Double
。
或Decimal
,以获得更好的精确度:
Dim num as Double
num = Sheets("General").Range("I24")
num = CDec(num * 1.0003)
答案 2 :(得分:0)
您必须将单元格设置为变量。
Dim myCell as Range
Set myCell = ThisWorkbook.Worksheets("General").Range("I24")
并在代码中:
myCell.Value = num
编辑:
整个代码:
Sub auto_open()
WshtNames = Array("General")
Application.ScreenUpdating = False
Dim myCell As Range
Set myCell = ThisWorkbook.Worksheets("General").Range("I24")
myCell = myCell * 1.0003
Application.OnTime Now + TimeValue("00:01:00"), "auto_open"
Application.ScreenUpdating = True
End Sub