我的任务是在工作簿 1 中创建一个宏,该宏可以从工作簿 2 中提取数据。要求是我在 VBA 中创建一个公式,其中包括应用工作簿 1 中的过滤器/过滤器/偏移公式,该公式可以提取工作簿 2 中的数据。来自工作簿 2 的数据。当然,两个工作簿都有相关的特定范围。
我可以在 Workbook1 中成功编写宏,以允许用户“引导”至 Workbook2 中的源数据并提取特定列和行的数据。但问题比这更复杂。特别需要过滤器/过滤器/偏移。
我可以在Workbook1的单元格“A7”中手动编写公式,以100%成功地从Workbook2中提取数据范围。
=FILTER(FILTER(OFFSET('[Glass Order Form Template.xlsm]Glass Schedule'!$C$8,0,0,3001,16),'[Glass Order Form Template.xlsm]Glass Schedule'!$D$8:$D$3008<>""),{1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,1})
如果源数据位于同一工作簿中,我想我完成任务不会有任何问题。然而,由于源数据位于 Workbook2 中,我遇到了困难。我只是不知道如何在 VBA 中编写公式,以便在公式中引用 Workbook2 时从 Workbook2 中提取数据。我尝试分配一个变量并用变量名称代替 workbook2/工作表名称,但我搞砸了。如果有人有任何想法,我将不胜感激这堂课。
数据源工作簿2的文件名:玻璃订单模板.xlsm
数据源工作表的表名称:Glass Schedule
提前致谢。这是我的代码:
Sub ImportData()
Dim dataFilePath As String
Dim dataWorkbook As Workbook
Dim targetWorkbook As Workbook
Dim AnswerYes As String
Dim AnswerNo As String
Dim lastRow As Long
' Prompt user to select data file
dataFilePath = Application.GetOpenFilename("Excel Files (*.xlsm), *.XLSM")
If dataFilePath = "False" Then Exit Sub ' User canceled the selection
' Open the data workbook
Set dataWorkbook = Workbooks.Open(dataFilePath)
' Data is in "Glass Schedule" worksheet, and range is non-contiguous columns
'Define worksheet variables
Dim sourceSheet As Worksheet 'Glass Take Off Sheet
Dim targetSheet As Worksheet 'Glass QC Sheet
'Define Range variable
Dim destination As Range
' Set Source and Target worksheets
Set sourceSheet = dataWorkbook.Worksheets("Glass Schedule")
Set targetSheet = ThisWorkbook.Worksheets("QC")
'---------------------------------------------------------------------------
'Copy from Glass Take Off workwheet and paste to QC Worksheet
'---------------------------------------------------------------------------
sourceSheet.Range("D1").Copy 'Job Number
targetSheet.Range("B2").PasteSpecial xlValues
targetSheet.Range("B3").UnMerge 'Unmerge Job Name field, if merged.
sourceSheet.Range("D2").Copy 'Job Name
targetSheet.Range("B3").PasteSpecial xlValues
With targetSheet
.Range("A7").Formula = "=FILTER(FILTER(OFFSET('[Glass Order Form Template.xlsm]Glass Schedule'!$C$8,0,0,3001,16),'[Glass Order Form Template.xlsm]Glass Schedule'!$D$8:$D$3008<>""),{1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,1})"
End With
' --------------------------------------------------------------------------
' Dialogue Box and User Input
' --------------------------------------------------------------------------
AnswerYes = MsgBox("Close Glass Take Off Sheet?", vbQuestion + vbYesNo, "User Repsonse")
If AnswerYes = vbYes Then
dataWorkbook.Close
Else
Exit Sub
End If
End Sub
以下代码行解决了该问题。请注意公式中额外的一组引号
.Range("A7").Formula2 = "=FILTER(FILTER(OFFSET('[Glass Order Form Template.xlsm]Glass Schedule'!$C$8,0,0,3001,16),'[Glass Order Form Template.xlsm]Glass Schedule'!$D$8:$D$3008<>""""),{1,1,1,1,0,0,1,1,0,0,0,0,0,0,1,1})"