【问题标题】:Dynamic Workbook and Worksheet name in Macro or VBA宏或 VBA 中的动态工作簿和工作表名称
【发布时间】:2014-04-25 12:25:29
【问题描述】:

我有这个有效的代码:(我目前使用 Excel 2003)

Sub test_copy1()    

Dim wb1 As Workbook     
Dim wb2 As Workbook     
Dim ws1 As Worksheet     
Dim ws2 As Worksheet      

Set wb1 = Workbooks("Workbook2.xls")     
Set wb2 = ThisWorkbook     
Set ws1 = wb1.Sheets("Run 1")     
Set ws2 = wb2.Sheets("Sheet3") 

ws2.Range("A1:h30") = ws1.Range("A177:H206").Value  

End Sub

在当前工作簿“表 3”中 单元格 J1 = Workbook2.xls 单元格 J2 = 运行 1

如何将当前工作簿“表 3”中的信息从单元格输入到宏中,以便可以根据需要进行更改并且仍然有效?

我的意思是有 2 个可以在工作表中更改的单元格,可以通过下拉列表或手动填写在当前工作簿工作表“工作表 3”上。 单元格:J1 等于文件名 (Workbook2.xls),J2 等于工作表名称 (Run 1)。

用户可以在需要时更改文件名和工作表名称,然后点击按钮来处理复制和粘贴。

我希望代码从单元格中获取信息并将它们放入代码中,而不是“硬”编码工作簿和工作表的文件名。

我希望这更有意义

感谢您的帮助。

~达

-----更新----

我已经尝试过这段代码,但它在第一次 Set Wb1= 时一直崩溃

    Sub test_copy1()

        Dim wb1 As Workbook
        Dim wb2 As Workbook
        Dim ws1 As Worksheet
        Dim ws2 As Worksheet

        Set wb1 = Workbooks(ws2.Range("J1"))
        Set wb2 = ThisWorkbook
        Set ws1 = wb1.Sheets(ws2.Range("J2"))
        Set ws2 = wb2.Sheets("Sheet3")

        ws2.Range("A1:h30") = ws1.Range("A177:H206").Value

    End Sub

--------更新-------

我使用所有示例并在范围后添加 .Value 来让它工作:)

Sub test_copy1()

    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    Set wb2 = ThisWorkbook
    Set ws2 = wb2.Sheets("Sheet3")

    Set wb1 = Workbooks(ws2.Range("J1").Value)
    Set ws1 = wb1.Sheets(ws2.Range("J2").Value)

    ws2.Range("A1:h30") = ws1.Range("A177:H206").Value

End Sub

谢谢你,谢谢你的帮助!!

【问题讨论】:

  • Set wb1 = Workbooks(ws2.Range("J1"))Set ws1 = wb1.Sheets(ws2.Range("J2"))?
  • byw,您的名称来自J1 的工作簿是否始终打开?如果不是,J1 是否只包含 wb 名称或完整路径?
  • 是的,两个工作簿始终处于打开状态。我现在就试试你的建议。
  • J1 只有文件名。是否需要完整路径?

标签: vba excel


【解决方案1】:

试试这个:

Sub test_copy1()

    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet

    Set wb2 = ThisWorkbook
    Set ws2 = wb2.Sheets("Sheet3")

    Set wb1 = Workbooks(ws2.Range("J1").Value)
    Set ws1 = wb1.Sheets(ws2.Range("J2").Value)

    ws2.Range("A1:H30").Value = ws1.Range("A177:H206").Value

End Sub

【讨论】:

  • 这里出错“Set wb1 = Workbooks(ws2.Range("J1"))”。我检查了 J1 中的文件名,它与打开的第二个文件是正确的。
  • 尝试在Set wb1 = Workbooks(ws2.Range("J1")) 之前添加MsgBox ws2.Range("J1")。它是否为您提供正确的工作簿名称?也可以试试Set wb1 = GetObject(ws2.Range("J1"))
  • 我使用了您的代码,并在单元格名称后添加了 .Value 并且它起作用了:)。我只需要在旧版本的 Excel 上测试它,但到目前为止非常好。谢谢
  • 还有一件事:你应该使用ws2.Range("A1:H30").Value = ws1.Range("A177:H206").Value 而不是ws2.Range("A1:H30") = ws1.Range("A177:H206").Value(否则它不会复制任何内容)-我已经更新了我的答案
  • 再次感谢您!我已经为此奋斗了好几天了:)
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 2021-04-29
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多