2017-01-13 5 views
1

Я работаю над частью шаблона, которая требует, чтобы я копировал и вставлял несколько строк значений с тем же числом столбцов из разных листов и добавлял их вместе (то есть копировать значения в листе 1 , вставить в лист 10, скопировать значение из листа 2, вставить в лист 10, но после последней строки значений, скопированных из листа 1, и так далее). Я обычно используюЛучший способ копирования и вставки значений

Диапазон (выбор, Selection.End (xlDown)). Выберите
Range (Выделение Selection.End (xlToRight)). Выберите

скопировать данные.

Затем я использую сделать, пока оператор, чтобы найти последнюю строку целевого листа (т.е. лист 10) и вставить его туда:

Range("A6").Select 
Do While ActiveCell.Value <> ""    
ActiveCell.Offset(1, 0).Select 
Loop 

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 

Но у меня проблема, если один исходных листов имеет только одну строку. Он копирует строку и все пустые строки после нее до нижней строки excel, и, таким образом, excel не может вставить ее на целевой лист из-за своего размера. Любой лучший способ сделать это?

+0

'Range (Выбор, Cells (Rows.Count, Selection.Column) .END (xlUp)). Select' будет лучшим способом выбора исходного набора строк , но, пожалуйста, прочитайте этот ответ о том, как [избегать использования Select] (http://stackoverflow.com/a/10717999/6535336) – YowE3K

+0

Как выглядит диапазон, который вы пытаетесь скопировать? Столбцы А через что? –

+0

Столбцы A thru N. –

ответ

0

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

Dim lr As Long 
lr = Cells(Rows.Count, Selection.Column).End(xlUp).Row 
Range(Selection, Cells(lr, Selection.Column)).Select 

так же в целевом листе вы можете использовать

Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Select 

Однако я настоятельно рекомендую не использовать .Выберите в своем коде

+0

Если я не использую .Выберите, какой будет лучший код для использования? –

0

При компоновке макроса перейти к последней строке, используя что-то вроде activecell.end (xldown) .select, выберем самую последнюю строку, если есть только одна строка.

Один из способов я обойти это с помощью оператора IF, чтобы проверить, содержит ли строка 2 данные в столбце: (выбор от A1 до A3 будет работать с activecell.end (xldown) .Select)

Sub Example() 
Range("A2").Select 
If IsEmpty(ActiveCell.Value) then 
'do this set of instructions 
else 
'do that set of instructions 
end if 
End Sub 

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

Sub Example2() 

Dim ws as worksheet 
Set ws = ThisWorkbook.Sheets("Sheet10") 'change quotes to sheet 10 name if different 

Dim i as integer 
i = 1 

While i = <=9 
ThisWorkbook.sheets("sheet" & i).activate 
Range("A2").Select 
If IsEmpty(ActiveCell.Value) then 
EndRow = "2" 
Go To NoA2 'Go to will skip to NoA2 below 
Else 
ActiveCell.End(xlDown).Select 
EndRow = activecell.row 'this will get the row number for later 
End If 
NoA2: 'skip will continue from here 
ActiveCell.end(xlToRight).Select 
EndCol = Split(ActiveCell(1).Address(1, 0), "$")(0) 'Get column letter 
Range("A1:" EndCol & EndRow).Select 
Selection.Copy 
ws.activate 
Range("A2").Select 
If IsEmpty(ActiveCell.Value) then 
ActiveCell.PasteSpecial Paste:=xlPasteValues 
Else 
Range("A1").Select 
ActiveCell.End(xlDown).Select 
ActiveCell.PasteSpecial Paste:=xlPasteValues 
i = i+1 
Wend 

End Sub 

Оба набора кода не проверялось, но второй должен делать то, что вам нужно, обернув через каждый лист, основанный на имени листа, который является «Sheet1», «Sheet2» и т. д. вверх на лист 9

Надежда, что помогает вам

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