【问题标题】:Excel VBA to Work Across WorkbooksExcel VBA 跨工作簿工作
【发布时间】:2016-01-25 19:11:56
【问题描述】:

我对 VBA 编码非常陌生,老实说,我对自己在做什么并不太了解。但我走了。

我正在寻找:

  • VBA 代码可以有动态值吗?因此,不是在设置表(例如“Sheet1”)上执行的代码,而是根据某个单元格中的值更改值。
  • 触发另一个工作簿上的 VBA。例如,我想从 Workbook A 运行一个 VBA,它会触发 Workbook B 上的 VBA。

为了充分说明我想打开 Workbook A(如果需要,也可以打开 Workbook B,没关系)并单击一个在 上运行 VBA 的按钮>工作簿 B 但在某个工作表上,具体取决于 Excel A 中单元格的值(如果单元格显示“sheet3”,则 VBA 在 工作簿 B 上的“sheet3”上运行)。我还希望 Workbook A 中的单元格引用 Workbook B 中的单元格,但工作表名称是动态的。例如,我在下面粘贴了基本单元格引用,但我希望它根据单元格中的值而改变,而不是 Sheet1

='[Workbook B.xlsx]Sheet1'!$A$4

我知道这听起来很复杂和令人困惑,但如果我能得到任何帮助,将不胜感激。

Sub ReportStepOne() 
    Dim myRow As Long 

    myRow = 4 
    Rows(myRow).Value = Rows(myRow).Value 

    Dim rng As Range 
    Set rng = Range("A4:AC200") 
    rng.Cut rng.Offset(1, 0) 
    Range("A1:AC1").Copy Range("A4:AC4") 
End Sub 

我想:

  1. 编辑此代码以使其在某个工作表上触发
  2. 使工作表名称引用到 Report.xlsm 中单元格 A o Sheet2 中的任何内容。
  3. 在 Report.xlsm 中运行运行上述脚本的宏(在名为“Historical Data.xlsm”的文件中称为“StepOne”

【问题讨论】:

  • 以上代码驻留在哪个工作簿中,Report.xlsmHistorical Data.xlsm?如果我理解正确,这段代码应该在Report.xlsm 的工作表上执行,该工作表基于Report.xlsm 中的 sheet2 上的单元格
  • 代码在Historical data.xlsm 上,当前在活动工作表上触发。我希望让它在特定的工作表上触发,其中宏从Reports.xlsm 的单元格中引用“工作表名称”。然后在Reports.xlsm 中有一个宏/按钮,使上述宏运行。这是我正在尝试开发的一个新的报告系统(我必须运行这个宏大约 40 次)。感谢您的帮助@SilentRevolution。很抱歉造成混乱。
  • 所以上面的代码位于historical data.xlsm 需要引用一个工作表来检索reports.xlsm 中的工作表名称,然后执行代码。 reports.xlsm 的表 2 上命名的表是指 historical data 中的表还是 reports.xlsm 上的表?您是否总是同时打开两个工作簿,如果不是,打开哪个工作簿?
  • 该代码将引用 reports.xlsm 中 Sheet2 上的单元格 A4。是的,reports.xlsm 中的工作表名称是指historical data.xlsm 中的工作表名称。 reports.xlsm 中的单元格 A4 将自动更新为新的客户名称,每个客户在 historical data.xlsm 中都有自己的工作表。我将同时打开这两个文件。

标签: vba excel


【解决方案1】:

下面的代码获取 Reports.xlsm 中 sheet2 上单元格 A4 的值,并将 ws 变量设置为 Historical data.xlsm 中的工作表,然后将其用于其余代码。如果可能的话,我建议不要让您的潜艇分布在多个项目中,但这只是我的意见。我认为像下面这样使用正确的引用更容易。

由于您希望在Report.xlsm 上使用按钮触发器,我建议将此代码移至该工作簿。如果正确引用它,您可以打开、编辑、保存和关闭单个项目中的任何工作簿,在我看来,这比在不同项目中调用 subs 更容易。

Sub ReportStepOne()
    Dim wbHis As Workbook, wbRep As Workbook
    Dim strWsName As String
    Dim ws As Worksheet

    Set wbHis = Workbooks("Historical data.xlsm")
    Set wbRep = Workbooks("Reports.xlsm")

    strWsName = wbRep.Worksheets("Sheet2").Cells(4, 1)
    Set ws = wbHis.Worksheets(strWsName)

    With ws
        With .Rows(4)
            .Value = .Value
        End With
        With .Range("A4:AC200")
            .Cut .Offset(1, 0)
        End With
        .Range("A1:AC1").Copy .Range("A4:AC4")
    End With

End Sub

【讨论】:

  • 你真是太棒了!这完美!非常感谢@SilentRevolution。你的帮助太慷慨了。
【解决方案2】:

在另一个工作簿上触发 VBA

Option Explicit
Sub RunVBA()

    Dim xlApp As Excel.Application
    Dim xlWorkBook As Workbook


    Set xlApp = New Excel.Application
    Set xlWorkBook = xlApp.Workbooks.Open("C:\Users\Om3r\Desktop\Book1.xlsm")
    xlApp.Visible = True

    xlWorkBook.Application.Run "Module1.SubName" ' Modulename.Subname

End Sub

参考工作表使用

Sub CopyRange()
    '// From sheet1 to sheet2
    Worksheets(2).Range("A1").Value = Worksheets(1).Range("A1").Value
End Sub

【讨论】:

  • 对不起,我不太明白。这是我到目前为止的代码Sub ReportStepOne() Dim myRow As Long myRow = 4 Rows(myRow).Value = Rows(myRow).Value Dim rng As Range Set rng = Range("A4:AC200") rng.Cut rng.Offset(1, 0) Range("A1:AC1").Copy Range("A4:AC4") End Sub 我想:a)编辑此代码以使其在某个工作表上触发 b)使其工作表名称引用到 Report.xlsm 中 Sheet2 上单元格 A 中的任何内容。然后在 Report.xlsm 中运行一个运行上述脚本的宏(在一个名为“Historical Data.xlsm”的文件中称为“StepOne”,我知道我问了很多,抱歉。
  • 好的,我已经研究出如何指定 VBA 在特定工作表上触发 MySheetName = "Clients"(是的,非常复杂的东西)我只需要更改“客户端”来引用另一个工作簿中的单元格。
猜你喜欢
  • 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
相关资源
最近更新 更多