【问题标题】:Excel VBA: set a range as an activate sheetExcel VBA:将范围设置为激活表
【发布时间】:2020-02-21 00:28:30
【问题描述】:

我目前正在处理一个工作簿,其中所有工作表信息都存储在工作表中(“概述”)。在“A:A”列中,我有每个工作表的名称。我想做的是贯穿“A:A”列中列出的每个单元格并打印出该工作表的宏。打印代码不是问题。问题是我不知道将单元格称为工作表。我想出了这个解决方案,但我不工作。

Worksheets(Range("A1")).Activate

是否可以从单元格中引用激活工作表?

【问题讨论】:

  • 单元格的格式是什么?如果名称完全匹配,那应该可以工作。如果您在 A1 中的值包含工作簿名称或其他内容,则它将不起作用。您通常会像 Worksheets("Sheet1") 那样执行此操作,因此您需要确保 Range("A1") = Sheet1 才能进行替换。这一点你应该很清楚,但你可以随时分享 A:A 的样本数据以确保
  • 请注意,Range("A1")ActiveSheet 上隐含为 A1,这可能不是您想要的工作表。
  • 附带说明,您可能不需要激活工作簿,只需参考即可。
  • @urdearboy "A:A" 列中的信息是 1、2、3、4 等。就像其他工作表的名称一样
  • 我最初的评论是错误的。我能够重现问题并使用Range.Value 解决

标签: excel vba range


【解决方案1】:

试试

Worksheets(Range("A1").Value).Activate

如 cmets 中所述,您的代码将受益于在此处限定您的对象(Range("A1") 在哪张纸上?)。最后,您很少需要激活工作表来对其执行操作。跳过Activate 直接跳到你的行动声明

【讨论】:

  • 感谢您的回答!我用我在这个之后的行动声明进行了尝试,但它似乎不起作用。声明为:Range("A1:C20").SelectSelection.PrintOut Copies:= 1, Collate:= True
  • 这确实是一个不同的问题,并且可能与您依赖Selecting 范围的事实有关。自动化不需要选择任何东西来工作。请参阅@Tim 的解决方案。为什么不跳过Select 并尝试ws.Range("A1:C20").PrintOut。无需选择....如果您可以激活工作表,那么您的问题就得到了回答。其他任何内容都应该是包含更新代码和新问题的新帖子
【解决方案2】:
Dim ws As Worksheet

With ThisWorkbook 'or ActiveWorkbook, or ?
    Set ws = .Worksheets(.Worksheets("Overview").Range("A1").Value)
End With

'do something with ws

【讨论】:

    【解决方案3】:

    以下代码通过名称引用给定的工作表,在Worksheets("Overview") 中的列A:A 中写入文本:

    Sub PrintWorksheetNames()
    
        Dim myCell As Range
        Dim lastCell As Long
        lastCell = LastRow("Overview")
    
        For Each myCell In ThisWorkbook.Worksheets("Overview").Range("A1:A" & lastCell).Cells
            Dim wksName As String
            wksName = myCell.Text
            ThisWorkbook.Worksheets(wksName).Range("A1:C20").PrintOut Copies:=1, Collate:=True
        Next
    
    End Sub
    
    Public Function LastRow(wsName As String, Optional columnToCheck As Long = 1) As Long
    
        Dim ws As Worksheet
        Set ws = ThisWorkbook.Worksheets(wsName)
        LastRow = ws.Cells(ws.Rows.Count, columnToCheck).End(xlUp).Row
    
    End Function
    
        Public Function LastRow(wsName As String, Optional columnToCheck As Long = 1) As Long
    
            Dim ws As Worksheet
            Set ws = ThisWorkbook.Worksheets(wsName)
            LastRow = ws.Cells(ws.Rows.Count, columnToCheck).End(xlUp).Row
    
        End Function
    
    • 写入工作表名称的范围由ThisWorkbook.Worksheets("Overview").Range("A1:A" & lastCell).Cells 定义。
    • 上述范围可以硬编码,如果它不打算改变 - ThisWorkbook.Worksheets("Overview").Range("A1:A8").Cells。因此不需要额外的函数LastRow()
    • lastCellLastRow()A 的结果。 A 是第一列,因此可选参数负责处理它。
    • How to avoid using Select in Excel VBA(这是每个VBA人的必读)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多