2016-06-21 3 views
1

Я ищу колонку в людям рабочая тетрадь и копирование ее в следующий пустой ряд в rota workbook. Проблема заключается в том, что она также копирует заголовок столбца (первая строка). Основываясь на приведенном ниже коде, какие-либо предложения о том, как исключить первую строку, содержащую заголовки столбцов?vba - Скопировать все данные в колонку, за исключением заголовка столбца

' find the column in the people workbook 
name = WorksheetFunction.Match("name", people.Sheets("Open").Rows(1), 0) 
num = WorksheetFunction.Match("num", people.Sheets("Open").Rows(1), 0) 

'find the next empty row 
Dim lastrow As Integer 
lastrow = rota.Sheets("Offer").Range("A" & Rows.Count).End(xlUp).Row + 1 

' copy from the people workbook into the next free space in rota workbook 
people.Sheets("Open").Columns(name).Copy Destination:=rota.Sheets("Offer").Range("A" & Rows.Count).End(xlUp).Offset(1) 
people.Sheets("Open").Columns(num).Copy Destination:=rota.Sheets("Offer").Range("B" & lastrow) 

Im угадывание ИТС на следующей точке, что мне нужно указать, чтобы не копировать первую строку вместо того, чтобы скопировать полный столбец с именем «номер» ...

people.Sheets("Open").Columns(num).Copy Destination:=rota.Sheets("Offer").Range("B" & lastrow) 
+0

Проверьте это: http://superuser.com/questions/42304/select-an-entire-column-minus-header-row-in-an-excel-macro – Vityata

ответ

3

Чтобы оставить его как можно больше, я предлагаю использовать только Intersect, UsedRange и Offset. Просто измените последнюю часть к:

' copy from the people workbook into the next free space in rota workbook 
With people.Sheets("Open") 
    Intersect(.Columns(Name), .UsedRange.Offset(1)).Copy Destination:=rota.Sheets("Offer").Range("A" & Rows.Count).End(xlUp).Offset(1) 
    Intersect(.Columns(num), .UsedRange.Offset(1)).Copy Destination:=rota.Sheets("Offer").Range("B" & lastrow) 
End With 
+0

Работал точно так же, как мне это нужно, спасибо –

+0

приветствую :) –

0

Это действительно

.Columns(num).Copy 

, который принимает заголовок, из-за того, что он копирует весь столбец (отсюда «.Columns(). Copy»).

Я предложил бы использовать другой подход с массивом, чтобы скопировать & вставить данные в рабочий лист Rota:

Dim arrayCopied(), lastline as long 

' find the column in the people workbook 
Name = WorksheetFunction.Match("name", people.Sheets("Open").Rows(1), 0) 
num = WorksheetFunction.Match("num", people.Sheets("Open").Rows(1), 0) 

'Loading the data from sheet Open in the array 
' We load the array from the second line : .cells(2,name) 
With people.Sheets("Open") 
    arrayCopied = Range(.Cells(2, Name), .Cells(2, num).End(xlDown)) 
End With 

' Then we paste the data in the corresponding place in the rota sheet 
With rota.Sheets("Offer") 
    'First we calculate where the last row is: 
    lastline = .Range(.Cells(1, 1), .Cells(1, 1).End(xlDown)).Rows.Count 
    'Then we paste the array starting at the last line and finishing at the last line 
    '+ the number of lines of the corresponding copied array - 1 (because Excel cells start at 1 and not at 0) 
    .Range(.Cells(lastline, 1), .Cells(lastline + UBound(arrayCopied, 1) - 1, 2)) = arrayCopied 
End With 

Это должно сделать трюк.

+0

Потому что мне любопытно: * «Почему вы предлагаете использовать массив для копирования и вставки данных?» * –

+0

приведенный выше ответ сделал то, что мне нужно, чтобы не менять свой формат, но спасибо за ответ –

+0

Нет проблем Aaron C. Привет, Дирк Рейхель, я довольно часто использую массивы, потому что их обработка может быть полезной для расчетов между процессом copy & paste и довольно быстро (вы можете добавлять столбцы во время их обработки, сохраняя при этом исходные данные). Но я принимаю к сведению ваше решение, которое хорошо и, прежде всего, более практичный подход в этом случае. –

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