2014-10-15 5 views
0

Я пытаюсь скопировать значения из нескольких листов, разных ячеек в этих листах. Мне было интересно, есть ли способ упростить код вместо обычной копии и вставки. Это код, который я использовал, и его довольно длинный.VBA-копирование из разных ячеек из разных листов в один рабочий лист

Я думал, есть ли функция, которая позволяет мне сообщать vba для копирования и вставки. Затем я определяю соответствующие ячейки для копирования-вставки. Например. B2 - D3 B4 - D4 и т.д.

Worksheets(stockcode & "_IS_" & marketcode).Range("B2").Copy 
Worksheets(stockcode & "_Stock ratio_" & marketcode).Range("D3").PasteSpecial 
Worksheets(stockcode & "_IS_" & marketcode).Range("B4").Copy 
Worksheets(stockcode & "_Stock ratio_" & marketcode).Range("D4").PasteSpecial 
Worksheets(stockcode & "_IS_" & marketcode).Range("B15").Copy 
Worksheets(stockcode & "_Stock ratio_" & marketcode).Range("D5").PasteSpecial 

ответ

0

Это может помочь.

Dim ws as Worksheet 
Set ws = Worksheets(stockcode & "_Stock ratio_" & marketcode) 
With Worksheets(stockcode & "_IS_" & marketcode) 
    .Range("B2").Copy Destination:=ws.Range("D3") 
    .Range("B4").Copy Destination:=ws.Range("D4") 
    .Range("B15").Copy Destination:=ws.Range("D5") 
End With 
Set ws = Nothing 

Если значение - это все, что вам нужно для переноса, то этого альтернативного метода может быть достаточно.

Dim ws as Worksheet 
Set ws = Worksheets(stockcode & "_IS_" & marketcode) 
With Worksheets(stockcode & "_Stock ratio_" & marketcode) 
    .Range("D3") = ws.Range("B2").Value 
    .Range("D4") = ws.Range("B4").Value 
    .Range("D5") = ws.Range("B15").Value 
End With 
Set ws = Nothing 

Первый использует With ... End With для ссылки на IS листа. Второй использует тот же метод для ссылки на Соотношение запаса лист. Когда внутри With ... End With вы используете префиксные ссылки с периодом (aka полная остановка), чтобы получить родительское отношение.

Возможно, стоит использовать With ... End With для ссылки на один рабочий лист и присвоение второго переменной. Отредактировано выше, чтобы отметить этот второй метод.

0

Вы можете создавать свои собственные процедуры, чтобы делать все, что вы можете себе представить. Вы можете значительно упростить код.

Во-первых, мы определим источник листа и назначения листа. Мы делаем это, чтобы сделать наш код легче читать, интерпретировать и поддерживать (теперь будет только одно место, где нужно возиться с этой грязной конкатенации:. Worksheets(stockcode & "_Stock ratio_" & marketcode)

Dim srcSheet as Worksheet 
Dim destSheet as Worksheet 

Set srcSheet = Worksheets(stockcode & "_IS_" & marketcode) 
Set destSheet = Worksheets(stockcode & "_Stock ratio_" & marketcode) 

Теперь мы можем просто использовать Value назначение заявление, так как вы только обеспокоены вставив значения, вы можете просто сделать это:

destSheet.Range("D3").Value = srcSheet.Range("B2").Value 
destSheet.Range("D4").Value = srcSheet.Range("B3").Value 
destSheet.Range("D5").Value = srcSheet.Range("B15").Value 

Это полностью избегает Copy и Paste/PasteSpecial методы, и должны быть быстрее, слишком

.

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

Если вы хотите просто ввести информацию, вы можете использовать Application.InputBox, вот простой пример:

Sub TransferValues() 
Dim src as Range 
Dim dest as Range 

Set src = Application.InputBox("Source?", Type:=8) 
Set dest = Application.InputBox("Destination?", Type:=8) 

dest.Value = src.Value 
End Sub 

Конечно, это не намного быстрее (если есть), чем копирование/вставка вручную, но это служит для иллюстрации концепции, которую вы можете реализовать нт.

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