【问题标题】:Loop through Range of sheets循环遍历工作表范围
【发布时间】:2018-08-23 01:51:48
【问题描述】:

我正在尝试遍历一系列工作表。但是,从工作表的范围中选择工作表时出现错误。

Sub Calc_sheets()

Dim sheetnames As Variant
sheets("Calc_sheets").Select
'sheetnames = Worksheets("Calc_sheets").Range("a2:a4").Value # returns an error in row "Sheet = sheetnames(k)"

sheetnames = Array("Sheet1", "Sheet2") # works fine

For k = 0 To Application.CountA(sheetnames) - 1

        Sheet = sheetnames(k)
        sheets(Sheet).Select
        ActiveSheet.Calculate
Next k

End Sub

你知道怎么解决吗?

最好的,

【问题讨论】:

  • 未经测试,但我想你只需要说,Set sheetnames = Worksheets...
  • 无论如何使用.SelectActiveSheet. 都不是一个好主意。见How to avoid using Select in Excel VBA macros - Stack Overflow
  • 您的阵列基础是什么?如果数组是sheetnames(1)="Sheet1": sheetnames(2)="Sheet2",那么sheetnames(0) 将返回错误。使用LboundUbound 进行检查

标签: arrays vba excel loops range


【解决方案1】:

你必须使用Set

Dim Sheet AS Worksheet
Set Sheet = sheetnames(k)

但您可以将其缩短为

Sub Calc_sheets()
    Dim sheetnames As Variant
    sheetnames = Array("Sheet1", "Sheet2")

    Dim Sheet As Variant
    For Each Sheet In sheetnames
        Sheets(Sheet).Calculate
    Next
End Sub

甚至更短:

Sub Calc_sheets()
    Dim Sheet As Variant
    For Each Sheet In Array("Sheet1", "Sheet2")
        Sheets(Sheet).Calculate
    Next
End Sub

【讨论】:

    【解决方案2】:

    使用 Lbound 和 Ubound 循环遍历数组。

    将 sht 声明为工作表并设置工作表。然后避免使用 select 和 activate。

    Sub Calc_sheets()
    
    Dim sheetnames As Variant
    Dim sht as Worksheet
    
    
    sheetnames = Array("Sheet1", "Sheet2")
    
    For k = LBound(sheetnames) to Ubound(sheetnames)
    
            Set Sht = worksheets(sheetnames(k))
            sht.Calculate
    Next k
    
    End Sub
    

    【讨论】:

    • shet ?不是`嘘?你打字的速度太快了;)
    • @ShaiRado 这个宏的目的是计算。一切都是为了完成工作。
    • 太棒了。如何从工作表中提取工作表名称形成范围?
    • 工作表名称 = 工作表 ("sheet3").range("A1:A4").value @AlexKlindt
    • 这会为我返回运行时错误 9 - 在行 Set sht = Worksheets(sheetnames(k))
    【解决方案3】:
    Sub CalcSheets()
    
        Dim k           As Long
        Dim sheetnames  As Variant
    
        sheetnames = Array("Sheet1", "Sheet2")
    
        For k = 0 To Application.CountA(sheetnames) - 1
            Sheets(sheetnames(k)).Calculate
        Next k    
    End Sub
    

    一般而言,应避免使用SelectActiveSheet,如果您明确使用.Calculate,则整个工作表设计中应该存在相当大的问题。

    【讨论】:

      猜你喜欢
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2013-05-03
      • 2016-01-01
      相关资源
      最近更新 更多