2015-11-09 6 views
1

Пожалуйста посоветуйте на код, необходимый для заполнения этого описания:Макрос для копирования одного диапазона в другой, как значения и в формулах

Мне нужно создать макрос, чтобы скопировать диапазон L18: L20 и вставить формулы в соответствующий столбец (M18: M20). Затем мне нужно использовать специальную пасту и скопировать и вставить значения из диапазона M18: M20 в диапазоне L18: L20.

Мне нужно это для сортировки цикла, поэтому, когда я запускаю макрос, формулы из M18: M20 копируются и вставляются в N18: N20, а затем значения копирования и вставки из N18: от N20 до M18: M20 и т. Д. ,

Вот мой код:

Sub Macro1() 

Range("L18:L20").Copy 
Range("M18:M20").PasteSpecial Paste:=xlPasteFormulas, _ 
          Operation:=xlNone, _ 
          SkipBlanks:=False, _ 
          Transpose:=False 
Range("M18:M20").Copy 
Range("L18:L20").PasteSpecial Paste:=xlPasteValues, _ 
          Operation:=xlNone, _ 
          SkipBlanks:=False, _ 
          Transpose:=False 

End Sub 
+2

пахнет домашнее задание показать нам свой код :) – Poof

+2

ли эти действия вручную во время записи макроса: http://www.excelfunctions.net/Record-A-Macro.html Затем, отредактируйте сгенерированный код, чтобы отредактировать его и сделать его более общим. Назначьте кнопку и престо. – steenbergh

+0

@steenbergh Да, я новичок в vba и макросах. Я сделал это с помощью рекордера, и я могу назначить его кнопке, однако я не могу создать цикл, в котором он переместится в столбец с последним диапазоном (теперь с формулой). – Andrew

ответ

1

Дайте этому попытку:

Sub test_Andrew() 

Dim Ws As Worksheet, _ 
    LastCol As Integer 

Set Ws = ActiveSheet 

With Ws 
    LastCol = .Cells(18, .Columns.Count).End(xlToLeft).Column 

    .Range(.Cells(18, LastCol), .Cells(20, LastCol)).Copy 
    .Cells(18, LastCol + 1).PasteSpecial Paste:=xlPasteFormulas, _ 
           Operation:=xlNone, _ 
           SkipBlanks:=False, _ 
           Transpose:=False 
    .Range(.Cells(18, LastCol + 1), .Cells(20, LastCol + 1)).Copy 
    .Cells(18, LastCol).PasteSpecial Paste:=xlPasteValues, _ 
           Operation:=xlNone, _ 
           SkipBlanks:=False, _ 
           Transpose:=False 
End With 
End Sub 
+0

Это работает отлично! Большое спасибо! – Andrew

+0

@ Андрей: Рад, что я мог бы помочь! ;) ** Поскольку вы новичок в SO, просто несколько указателей **: Когда ваша проблема будет решена, вы можете подтвердить ответ, щелкнув галочкой ** прямо под стрелками вверх/вниз. ** Используйте «вверх-вниз» голоса по каждому сообщению (Q или A), которое вы считаете полезным/бесполезным (или плохого качества) **. И взгляните на ссылки, чтобы знать, как задавать правильные вопросы: stackoverflow.com/help/how-to-ask и stackoverflow.com/help/mcve – R3uK

1

Попробуйте это:

Sub Macro1(colindex As Integer) 
    ' ' Macro1 Macro ' 
    'make our ranges variable and based on the input column 
    Dim range_alpha As Range, range_beta As Range 
    Set range_alpha = ActiveSheet.Range(ActiveSheet.Cells(18, colindex), ActiveSheet.Cells(20, colindex)) 
    Set range_beta = ActiveSheet.Range(ActiveSheet.Cells(18, colindex + 1), ActiveSheet.Cells(20, colindex + 1)) 
    range_alpha.Select 

    range_alpha.Select 
    Selection.Copy 
    range_beta.Select 
    Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 
    range_beta.Select 
    Application.CutCopyMode = False 
    Selection.Copy 
    range_alpha.Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 
    Range("M18:M20").Select 
End Sub 


Sub Macro1_BySelection() 
    '' use this sub to call Macro 1 if you want to select a column first 
    Macro1 Selection.Column 
End Sub 


Sub Macro1_ByProbe() 
    '' use this sub to call Macro 1 for the first empty column found 
    Dim tst As String 
    Dim colindex As Integer 
    colindex = 1 
    tst = ActiveSheet.Cells(18, colindex).Value 

    Do While tst <> "" 
     colindex = colindex + 1 
     tst = ActiveSheet.Cells(18, colindex).Value 
    Loop 

    Macro1 colindex 
End Sub 
Sub Macro1_ByR3uk() 
    Dim LastCol As Integer 
    LastCol = ActiveSheet.Cells(18, ActiveSheet.Columns.Count).End(xlToLeft).Column 

    Macro1 LastCol + 1 
End Sub 

Ваша первоначальная функция была улучшена, чтобы действовать не на фиксированный диапазон «Lxx», но принять число как индекс столбца.

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

  • Macro1_BySelection() использует ячейку, которая выбирается при вызове макроса.
  • Macro1_ByProbe() тесты, чтобы найти первую пустую колонку.
  • EDIT: Я любил путь R3uk по поиску последних использовавшихся колонков лучше, чем я, использовал свою технику macro1_ByR3uk() (мы учимся каждый день :-))
+0

Большое спасибо! это работает ! – Andrew

+0

@Andrew Нет проблем; Я даже узнал, что я сам это понял. Если этот ответ разрешил ваш вопрос, пожалуйста, рассмотрите [принятие его] (http://meta.stackexchange.com/q/5234/179419), нажав галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как вам, так и мне. – steenbergh

+0

Я попытался щелкнуть по галочке, но это только позволяет мне отметить один ответ, а не оба (поскольку я впервые принял ответ R3uK). Просьба сообщить об этом – Andrew

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