【问题标题】:VBA import data: exclude sheet if doesn't existVBA 导入数据:如果不存在则排除工作表
【发布时间】:2018-05-27 15:35:41
【问题描述】:

我已经构建了从工作簿导入数据并将其粘贴到另一个工作簿的代码。原始工作簿由数百张纸组成(每个国家一张纸,由 ISO 2 位代码标识:AE、AL、AM、AR 等...)。宏打开这些工作表中的每一个,复制相同的单元格,然后在新工作簿中打印所有这些单元格。 问题是,例如,如果工作表 F(AM) 不存在,宏就会停止。我想确保如果工作表不存在,宏将继续处理所有其他工作表(即 F(AR)、F(AT)、F(AU))直到结束。 有人有什么建议吗? 非常感谢!

    Sub ImportData()
    Dim Wb1 As Workbook
    Dim MainBook As Workbook
    Dim Path As String
    Dim SheetName As String

    'Specify input data
    Path = Worksheets("Input").Range("C6").Value
    'Decide in which target sheet print the results
    SheetName = "Data"
    'From which sheets you need to take the data?
    OriginSheet145 = "F(AE)"
    OriginSheet146 = "F(AL)"
    OriginSheet147 = "F(AM)"
    OriginSheet148 = "F(AR)"
    OriginSheet149 = "F(AT)"
    OriginSheet150 = "F(AU)"
    'Set the origin workbook
    Set Wb1 = Workbooks.Open(Path & "_20171231.xlsx")
    'Set the target workbook
    Set MainBook = ThisWorkbook

    'Vlookup to identify the correct data point
    Wb1.Sheets(OriginSheet145).Range("N25").FormulaR1C1 = "=VLOOKUP(""010"",C[-10]:C[-7],2,FALSE)"
    Wb1.Sheets(OriginSheet146).Range("N26").FormulaR1C1 = "=VLOOKUP(""010"",C[-10]:C[-7],2,FALSE)"
    Wb1.Sheets(OriginSheet147).Range("N27").FormulaR1C1 = "=VLOOKUP(""010"",C[-10]:C[-7],2,FALSE)"
    Wb1.Sheets(OriginSheet148).Range("N28").FormulaR1C1 = "=VLOOKUP(""010"",C[-10]:C[-7],2,FALSE)"
    Wb1.Sheets(OriginSheet149).Range("N29").FormulaR1C1 = "=VLOOKUP(""010"",C[-10]:C[-7],2,FALSE)"
    Wb1.Sheets(OriginSheet150).Range("N30").FormulaR1C1 = "=VLOOKUP(""010"",C[-10]:C[-7],2,FALSE)"
    'Copy the data point and paste in the target sheet
    Wb1.Sheets(OriginSheet145).Range("N25").Copy
    MainBook.Sheets(SheetName).Range("AW5").PasteSpecial xlPasteValues
    Wb1.Sheets(OriginSheet146).Range("N26").Copy
    MainBook.Sheets(SheetName).Range("AW6").PasteSpecial xlPasteValues
    Wb1.Sheets(OriginSheet147).Range("N27").Copy
    MainBook.Sheets(SheetName).Range("AW7").PasteSpecial xlPasteValues
    Wb1.Sheets(OriginSheet148).Range("N28").Copy
    MainBook.Sheets(SheetName).Range("AW8").PasteSpecial xlPasteValues
    Wb1.Sheets(OriginSheet149).Range("N29").Copy
    MainBook.Sheets(SheetName).Range("AW9").PasteSpecial xlPasteValues
    Wb1.Sheets(OriginSheet150).Range("N30").Copy

    MainBook.Save
    Wb1.Close savechanges:=False

    MsgBox "Data: imported!"

    End Sub

【问题讨论】:

  • 我不确定你在这里做什么,但我确信有更好的方法。 OriginSheet145OriginSheet150 是什么,它们在哪里设置?他们会改变吗?您将硬编码公式 (=VLOOKUP("010",C[-10]:C[-7],2,FALSE)) 复制到 6 个单元格,然后将这些单元格复制到其他地方??
  • OriginSheet 是宏从中获取数据的原始工作表。这些工作表的名称发生了变化(F(AE)、F(AL)、F(AM)...),但工作表的内部结构始终相同。因此,对于这些工作表中的每一个,代码都会获取一个数据点(通过 VLOOKUP 标识),从 OriginSheet 复制数据点并粘贴到目标工作簿中。

标签: vba loops import


【解决方案1】:

该函数返回TRUEFALSE,表示工作簿object中是否存在以stringwsName命名的工作表

Function wsExists(wb As Workbook, wsName As String) As Boolean
    Dim ws: For Each ws In wb.Sheets
    wsExists = (wsName = ws.Name): If wsExists Then Exit For
    Next ws
End Function

如果工作表不存在,请使用IF 语句跳过适用的代码。


编辑:

我可以看出您在代码中投入了很多工作,这太棒了,所以当我说它让我感到焦虑时,不要误会它,所以我必须简化它。 ...有很多不需要的步骤。

我确实相信“正确的方法”是“任何方法都行得通”,所以 kudo 已经走到了这一步。编程中有一条陡峭的学习曲线,所以我想我会提供一个替代代码块来代替你的。 (Option Explicit 位于模块的最顶部,将“强制”您正确声明/处理变量、对象等)

在没有看到您的数据的情况下,我不能保证这会起作用 - 事实上,如果您选择使用它,很可能是某个单元格引用错误,您必须尝试找出它。

Option Explicit

Sub ImportData()

    Const SheetName = "Data" 'destination sheet name
    Const sourceFile = "_20171231.xlsx" 'source filename for some reason
    Dim wbSrc As Workbook, wbDest As Workbook, sht As Variant
    Dim stPath As String, arrSourceSht() As Variant, inRow As Long

    Set wbDest = ThisWorkbook 'dest wb object
    stPath = Worksheets("Input").Range("C6").Value 'source wb stPath
    'create array of source sheet names "146-150":
    arrSourceSht = Array("F(AE)", "F(AL)", "F(AM)", "F(AR)", "F(AT)", "F(AU)")
    Set wbSrc = Workbooks.Open(stPath & sourceFile) 'open source wb

    With wbSrc
        'VLookup to identify the correct data point
        inRow = 5 'current input row
        For Each sht In arrSourceSht
            If wsExists(wbSrc, CStr(sht)) Then
                wbDest.Sheets(sht).Range("AW" & inRow) = Application._
                  WorksheetFunction.VLookup("010", Range(.Sheets(sht).Range("N" & _
                  20 + inRow).Offset(-10), .Sheets(sht).Range("N" & 20 + inRow).Offset(-7)), 2, False)
            End If
            inRow = inRow + 1 'new input row
        Next sht

        wbDest.Save 'save dest
        .Close savechanges:=False 'don't save source

    End With
    MsgBox "Data: imported!"

End Sub

Function wsExists(wb As Workbook, wsName As String) As Boolean
    Dim ws: For Each ws In wb.Sheets
    wsExists = (wsName = ws.Name): If wsExists Then Exit For
    Next ws
End Function

如果您有任何问题,请告诉我,如果您愿意,我可以指导您了解它的工作原理。 (我每天至少在这里一次。)

【讨论】:

    猜你喜欢
    • 2017-04-24
    • 2019-07-16
    • 2013-01-09
    • 2014-07-17
    • 2020-12-16
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多