Как скопировать данные из другой рабочей книги (Excel)? - PullRequest
6 голосов
/ 27 января 2009

У меня уже есть макрос, который создает листы и некоторые другие вещи. После того, как лист был создан, я хочу вызвать другой макрос, который копирует данные из второго Excel (он открыт) в первый и активный файл Excel.

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

Sub CopyData(sheetName as String)
  Dim File as String, SheetData as String

  File = "my file.xls"
  SheetData = "name of sheet where data is"

  # Copy headers to sheetName in main file
  Workbooks(File).Worksheets(SheetData).Range("A1").Select  # fails here: Method Select for class Range failed
  Workbooks(File).Worksheets(SheetData).Range(Selection, Selection.End(xlToRight)).Select
  Workbooks(File).Worksheets(SheetData).Selection.Copy ActiveWorkbook.Sheets(sheetName).Cells(1, 1)
End Sub

Что не так?

Я действительно хочу избежать того, чтобы "my file.xls" был активным.

Редактировать: мне пришлось отказаться от него и скопировать SheetData в целевой файл как новый лист, прежде чем он мог работать. Найти и выбрать несколько строк

Ответы [ 5 ]

2 голосов
/ 12 января 2014

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

Рабочий и чистый код доступен по ссылке ниже:

http://vba -useful.blogspot.fr / 2013/12 / как-делать-я-извлечения-данных-от-another.html

2 голосов
/ 07 марта 2011

Два года спустя (нашел это в Google, так что для всех остальных) ... Как уже упоминалось выше, вам не нужно ничего выбирать. Эти три строки:

Workbooks(File).Worksheets(SheetData).Range("A1").Select<br> Workbooks(File).Worksheets(SheetData).Range(Selection, Selection.End(xlToRight)).Select<br> Workbooks(File).Worksheets(SheetData).Selection.Copy ActiveWorkbook.Sheets(sheetName).Cells(1, 1)

Можно заменить на

Workbooks(File).Worksheets(SheetData).Range(Workbooks(File).Worksheets(SheetData). _<br> Range("A1"), Workbooks(File).Worksheets(SheetData).Range("A1").End(xlToRight)).Copy _<br> Destination:=ActiveWorkbook.Sheets(sheetName).Cells(1, 1)

Это должно обойти ошибку выбора.

1 голос
/ 27 января 2009

Хотели бы вы, чтобы файл "my file.xls" был активным, если он не влияет на экран? Отключение обновления экрана - это способ достижения этой цели, а также повышение производительности (значительно, если вы выполняете циклы при переключении между рабочими листами / рабочими книгами).

Команда для этого:

    Application.ScreenUpdating = False

Не забудьте вернуть его на True, когда ваши макросы будут завершены.

0 голосов
/ 27 февраля 2016

Мне нужно было скопировать данные из одной рабочей книги в другую с помощью VBA. Требование было таким, как упомянуто ниже. 1. При нажатии кнопки Active X откройте диалог, чтобы выбрать файл, из которого необходимо скопировать данные. 2. При нажатии кнопки «ОК» значение должно быть скопировано из ячейки / диапазона в рабочую книгу.

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

Ниже приведен код, который я написал в VBA. Любые улучшения или новые альтернативы приветствуются.

Код: Здесь я копирую содержимое A1: C4 из рабочей книги в A1: C4 текущей рабочей книги

    Private Sub CommandButton1_Click()
        Dim BackUp As String
        Dim cellCollection As New Collection
        Dim strSourceSheetName As String
        Dim strDestinationSheetName As String
        strSourceSheetName = "Sheet1" 'Mention the Source Sheet Name of Source Workbook
        strDestinationSheetName = "Sheet2" 'Mention the Destination Sheet Name of Destination Workbook


        Set cellCollection = GetCellsFromRange("A1:C4") 'Mention the Range you want to copy data from Source Workbook

        With Application.FileDialog(msoFileDialogOpen)
            .AllowMultiSelect = False
            .Show
            '.Filters.Add "Macro Enabled Xl", "*.xlsm;", 1

            For intWorkBookCount = 1 To .SelectedItems.Count
                Dim strWorkBookName As String
                strWorkBookName = .SelectedItems(intWorkBookCount)
                For cellCount = 1 To cellCollection.Count
                    On Error GoTo ErrorHandler
                    BackUp = Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount))
                    Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount)) = GetData(strWorkBookName, strSourceSheetName, cellCollection.Item(cellCount))
                    Dim strTempValue As String
                    strTempValue = Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount)).Value
                    If (strTempValue = "0") Then
                        strTempValue = BackUp
                    End If
Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount)) = strTempValue 
ErrorHandler:
                    If (Err.Number <> 0) Then
                            Sheets(strDestinationSheetName).Range(cellCollection.Item(cellCount)) = BackUp
                        Exit For
                    End If
                Next cellCount
            Next intWorkBookCount
        End With

    End Sub

    Function GetCellsFromRange(RangeInScope As String) As Collection
        Dim startCell As String
        Dim endCell As String
        Dim intStartColumn As Integer
        Dim intEndColumn As Integer
        Dim intStartRow As Integer
        Dim intEndRow As Integer
        Dim coll As New Collection

        startCell = Left(RangeInScope, InStr(RangeInScope, ":") - 1)
        endCell = Right(RangeInScope, Len(RangeInScope) - InStr(RangeInScope, ":"))
        intStartColumn = Range(startCell).Column
        intEndColumn = Range(endCell).Column
        intStartRow = Range(startCell).Row
        intEndRow = Range(endCell).Row

        For lngColumnCount = intStartColumn To intEndColumn
            For lngRowCount = intStartRow To intEndRow
                coll.Add (Cells(lngRowCount, lngColumnCount).Address(RowAbsolute:=False, ColumnAbsolute:=False))
            Next lngRowCount
        Next lngColumnCount

        Set GetCellsFromRange = coll
    End Function

    Function GetData(FileFullPath As String, SheetName As String, CellInScope As String) As String
        Dim Path As String
        Dim FileName As String
        Dim strFinalValue As String
        Dim doesSheetExist As Boolean

        Path = FileFullPath
        Path = StrReverse(Path)
        FileName = StrReverse(Left(Path, InStr(Path, "\") - 1))
        Path = StrReverse(Right(Path, Len(Path) - InStr(Path, "\") + 1))

        strFinalValue = "='" & Path & "[" & FileName & "]" & SheetName & "'!" & CellInScope
        GetData = strFinalValue
    End Function
0 голосов
/ 29 января 2009

Не думаю, что вам нужно что-то выбирать вообще. Я открыл две пустые книги Book1 и Book2, поместил значение «A» в Range («A1») Sheet1 в Book2 и отправил следующий код в ближайшее окно -

Рабочие книги (2). Рабочие листы (1). Диапазон («А1»). Копирование рабочих книг (1). Рабочие листы (1). Диапазон («А1»)

Диапазон («А1») на Листе 1 Книги1 теперь содержит «А».

Кроме того, учитывая тот факт, что в вашем коде вы пытаетесь скопировать из ActiveWorkbook в «myfile.xls», порядок, как представляется, меняется на обратный, поскольку метод Copy должен применяться к диапазону в ActiveWorkbook и к месту назначения. (аргумент функции Copy) должен иметь соответствующий диапазон в "myfile.xls".

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