2016-07-19 1 views
1

Ребята Мне нужна помощь с этими фанковыми командами vba. У меня есть две таблицы: первая labownik-mil-2dl8.xls и вторая zestawienie.xls, и я хочу выбрать несколько строк в первой, чтобы скопировать второй, но не A1 в A1. Так что если мой выбор строк от 5270 до 5273, я хочу получить, например, E5272 до D7 и AK5272 до E7 и так далее. Было бы неплохо, если бы это можно было сделать, нажав кнопку во второй электронной таблице (сначала просто сделав выбор в первой таблице). Макро должен вставляться в первую пустую строку во второй таблице. у меня есть что-то вроде этого:копирование выбранных данных из одной книги в другую с помощью переадресации ячеек

Sub Get_Data() 
    Dim lastrowDB As Long, lastrow As Long 
    Dim arr1, arr2, i As Integer 

    With Sheets("zestawienie") 
     lastrowDB = .Cells(.Rows.Count, "D").End(xlUp).Row + 1 
    End With 

    arr1 = Array("E", "AK", "B", "D", "F", "G", "H") 
    arr2 = Array("D", "E", "F", "H", "L", "M", "N") 

    For i = LBound(arr1) To UBound(arr1) 
     With Sheets("Labownik") 
      lastrow = Application.Max(3, .Cells(.Rows.Count, arr1(i)).End(xlUp).Row) 
      .Range(.Cells(3, arr1(i)), .Cells(lastrow, arr1(i))).Copy 
      Sheets("zestawienie").Range(arr2(i) & lastrowDB).PasteSpecial xlPasteValues 
     End With 
    Next 
    Application.CutCopyMode = False 
End Sub 

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

Спасибо заранее

ответ

1

Вы должны добавить объект рабочей книги, так что он будет знать, как работать с обоими тетрадей. Ваш код обрабатывает их как рабочие листы в одной книге.

Dim wbSecond as Workbook 

Set wbSecond = Workbook.Open(parameters) 

Это позволит вам прямо сейчас ссылаться на одну книгу в wbSecond, и вы всегда можете сослаться на книгу, которую вы как MyWorkbook.

Затем вы можете использовать следующий синтаксис:

MyWorkbook.Sheets(sheet_name).cells(row,col) = wbSecond.Sheets(sheet_name).cells(row, col)

0

Одним из способов может быть с Application.Intersect:

Dim rngFrom As Range, rngTo As Range, index As Long 

Set rngTo = Workbooks("zestawienie.xls").Sheets("Arkusz1").Range("D7,E7,F7,H7,L7,M7,N7") ' the columns "D", "E", "F", "H", "L", "M", "N" on row 7 

Set rngFrom = Workbooks("labownik-mil-2dl8.xls").Sheets("Labownik - 2SLU").Range("E:E,AK:AK,B:B,D:D,F:F,G:G,H:H") ' the columns "E", "AK", "B", "D", "F", "G", "H" 

Set rngFrom = Application.Intersect(rngFrom, rngFrom.Worksheet.Range("5270:5273")) ' the columns "E", "AK", "B", "D", "F", "G", "H" intersected with rows from 5270 to 5273 gives the ranges E5270:E5273,AK5270:AK5273,B5270:B5273,D5270:D5273,F5270:F5273,G5270:G5273,H5270:H5273 

For index = 1 To rngTo.Areas.Count 

    rngFrom.Areas(index).Copy 
    rngTo.Areas(index).PasteSpecial xlPasteValues 

Next 
Смежные вопросы