即使我在同一工作簿中切换工作表,如何在指定的工作表上保持宏循环

时间:2018-02-05 09:41:09

标签: excel vba excel-vba

我试图寻找这个问题的答案,但无济于事。我需要此宏来运行特定工作簿上名为常规的特定工作表。目的是让单元格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

谢谢,非常感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

分析您的代码并提出改进和删除不必要代码的建议

  1. 在这种特定情况下,切换Application.ScreenUpdating并没有多大意义,因为Range("I24")中只有一次更新。因此如果你把它关闭就没有收获 如果您有许多更新,那么只有一个优势,以便在切换Application.ScreenUpdating = True时一次性执行这些更新。

  2. 使用Option Explicit。这会强制您正确声明所有变量。

  3. 您设置WshtNames但从不使用它,因此可以删除此行。

  4. 使用Worksheets代替Sheets,除非您确实需要使用SheetsSheets还包含图表,不仅包含工作表)。

  5. 如果numLong,那么它只能包含整数/整数。因此,如果你乘以num = num * 1.0003,它将自动转换为Long,这与num = num的结果相同,这意味着它不会改变任何内容。您需要至少使用DoubleDecimal

  6. 您没有为Range("I24").Value = num指定工作表,因此Excel假定范围在活动工作表中。这就是您选择其他工作表时代码失败的原因。永远不要让VBA猜测工作表总是指定正确的Worksheets("General").Range("I24").Value = num

  7. 所以我们可以一起改变你的代码......

    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