按名称查找工作表而不是代理名称

时间:2018-01-30 22:51:42

标签: excel vba excel-vba

使用表单的名称​​不代号,我正在尝试进行更新/导入类型的例程。从Source(wb_From.sheet)复制并粘贴到具有相同名称的Target(wb_To.sheet)中。 我的代码是在Target BUT中找到每个选项卡名称而不是在源中找到相同的工作表名称(使用不同的Codename)。有什么建议吗?

Dim WB_To as String  'Target - WB to copy into
Dim WB_From as String  'Source- WB to copy from

For x = 1 To Workbooks(WB_To).Worksheets.Count

    'Select Target sheet
    Workbooks(WB_To). Sheets(x).Activate
    tabName = Sheets(x).Name

    'activate Source WB with same tab name
    Workbooks(WB_From).Sheets(tabName).Activate

2 个答案:

答案 0 :(得分:1)

典型的引用问题场景,因此您可能需要查看maven repository,这解释了不使用ActivateSelect等的好处。现在回答你的问题,这一行:

Workbooks(WB_To).Sheets(x).Activate 

激活Sheet(x)是的,您实际上可以通过以下方式获取它的名称:

tabName = Sheets(x).Name

但是你正在循环,谁知道你正在使用哪个工作簿(尽管你确保在正确的位置插入了Activate方法)。不妨放弃Activate。重构你的循环:

For x = 1 To Workbooks(WB_To).Worksheets.Count
    With Workbooks(WB_To).Sheets(x)
        '/* do what you need to do */
        Msgbox "Sheet " & .Name & " being processed from destination WB."
        With Workbooks(WB_From).Sheets(.Name)
            '/* your code here */
            MsgBox "Sheet " & .Name & " found on source WB."
        End With
    End With
Next
没有多大变化,只是淘汰了使用激活。 不是最优雅的解决方案,您实际上可以采用上面发布的链接中列出的任何替代方案,但我希望这可以帮助您入门。

重要说明:此解决方案未考虑源工作簿中实际不存在的不匹配工作表名称或工作表的可能性。您还需要添加一张支票来覆盖它。

答案 1 :(得分:0)

而不是循环遍历工作表索引(几乎肯定不会跨工作簿排列)循环通过工作表集合并获取名称(而不是代号)。它不能保证解决您的问题,但它会使本地窗口更容易导航,您的问题更容易追踪。

Dim WB_To as String  ‘Target - WB to copy into
Dim WB_From as String  ‘Source- WB to copy from
Dim ws as worksheet

For Each ws in Workbooks(WB_To).Worksheets

    'Select Target sheet (which will be the ws)
    ws.Activate        

    'activate Source WB with same tab name
    WB_From.Sheets(ws.name).Activate