Excel VBA跨工作簿​​工作

时间:2016-01-25 01:39:45

标签: excel vba excel-vba

我对VBA编码很陌生,并且对我所做的事情没有很好的理解。但是我走了。

我希望看看:

  • VBA代码可以有dyname值吗?因此,代替在集合表格上执行的代码(例如“Sheet1”),该值根据特定单元格中的值而变化。
  • 在另一个工作簿上触发VBA。例如,我想从工作簿A 运行VBA,在工作簿B 上触发VBA。

要完全解释我想要打开工作簿A (和工作簿B ,如果需要,无关紧要)并单击一个在练习册B ,但在特定工作表上取决于 Excel A 中单元格的值(如果单元格显示“sheet3”,则VBA在工作簿B上的“sheet3”上运行)。我还希望工作簿A 中的单元格引用工作簿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”

2 个答案:

答案 0 :(得分:0)

在另一个工作簿上触发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

答案 1 :(得分:0)

下面的代码获取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