Открытие файла Excel и копирование листов с использованием VBA - PullRequest
0 голосов
/ 01 июля 2019

Мне нужно скопировать пару листов Excel ("Y", "X") из одного файла на тот же лист в другом файле Excel (назовите его Z - тот же файл, на котором я использую VBA). мое ограничение заключается в том, что имя и путь к первому файлу Excel (с X, Y) меняются, поэтому я пытаюсь написать что-то более общее, используя команду «as String» и Application.GetOpenFilename (), но я Я получаю сообщение об ошибке.

Пытался разделить на 2 разных саба

Sub BrowseForFile()
    Dim sFileName As String
    sFileName = Application.GetOpenFilename(, , "open the file: " )

    If sFileName = "false" Then Exit Sub
    MsgBox sFileName
    Workbooks.Open (sFileName)
    Workbooks(sFileName).Sheets("X").Activate
    Stop
  1. Ошибка выполнения 9
  2. файл не найден (я думаю, 1004)

1 Ответ

0 голосов
/ 01 июля 2019

Если пользователь нажимает кнопку Cancel , тогда функция GetOpenFilename возвращает логическое значение False, а не строку "false", поэтому вам нужно проверить значение If sFileName = False Then и объявить его как Variant.

Если вы открываете рабочую книгу, всегда обращайтесь к ней с переменной, чтобы вы могли легко использовать ее для доступа к рабочей книге

Dim OpenedWb As Workbook
Set OpenedWb = Workbooks.Open(sFileName)

Затем вы можете использовать переменную Wb для ссылки на рабочую книгу.Вы открыли

OpenedWb.Worksheets("X").Activate

Обратите внимание, что использование .Select и .Activate является плохой практикой, и ее следует избегать ( Как избежать использования Select в Excel VBA ).Вместо этого используйте другую ссылку для ссылки на рабочую книгу.

Dim ws As Worksheet
Set ws = OpenedWb.Worksheets("X")

и получите доступ к диапазону, например ws.Range("A1").Value.


Sub BrowseForFile()
    Dim sFileName As Variant 'needs to be variant because cancel returns a boolean False
    sFileName = Application.GetOpenFilename(, , "open the file: " )

    If sFileName = False Then Exit Sub

    MsgBox sFileName

    Dim OpenedWb As Workbook
    Set OpenedWb = Workbooks.Open(sFileName)

    Dim ws As Worksheet
    Set ws = OpenedWb.Worksheets("X")

    MsgBox ws.Range("A1").Value 'output the value of `A1` in worksheet `X` of workbook `sFileName`
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...