Данные импорта VBA: исключить лист, если не существует - PullRequest
0 голосов
/ 27 мая 2018

Я создал этот код, который импортирует данные из рабочей книги и вставляет их в другую.Оригинальная рабочая тетрадь состоит из сотен листов (по одному листу на каждую страну, обозначенную двузначным кодом ISO: 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

1 Ответ

0 голосов
/ 27 мая 2018

Эта функция возвращает TRUE или FALSE, указывая, существует ли в рабочей книге лист, названный в string wsName object

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

UsIF оператор для пропуска применимого кода, если лист не существует.


Редактировать:

Я могу сказать, что вы вложили много работы в свой код, которыйкруто, так что не принимайте это неправильно, когда я говорю, что это вызывает у меня беспокойство, поэтому мне пришлось упростить это.... есть много ненужных шагов.

Я верю, что «правильный путь» - это «любой способ, который работает», так что кудо в этом далеко.В программировании есть крутая кривая обучения, поэтому я решил предложить альтернативный блок кода вместо вашего.(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

Дайте мне знать, если у вас есть какие-либо вопросы, яможет рассказать вам, как это работает, если хотите.(Я здесь по крайней мере один раз в день.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...