Подпрограмма, которая копирует / вставляет определенные имена на разные листы

У меня следующая проблема:

У меня есть два (динамических) списка с именами MarketsEquities и MarketsBonds, которые можно найти на рабочих листах SummaryEquities и SummaryBonds соответственно.

Затем у меня есть рабочий лист с именем PnL, на котором я хочу создать список рынков, перечисленных в предыдущих таблицах. Все эти рынки должны быть перечислены в столбце C, и между концом списка акций и началом списка облигаций должен быть сделан пробел, при этом я напишу в столбце B Bonds.

Вот что у меня есть на данный момент:

Sub InsertEquitiesBonds()
    Dim ws As Worksheet, r1 As Range, r2 As Range
    Set ws = Worksheets("PnL")
    ws.Activate
    Set Range("B3").Value = "Equities"
    Set r1 = Worksheets("SummaryEquities").Range("MarketsEquities")
    r1.Copy Range("C4")

    'I want to then insert "Bonds" in Column B at the end of the listing of equities and then list all bonds in column C below that. 

    Set r2 = Worksheets("SummaryBonds").Range("MarketsBonds")
End Sub

Помощь очень ценится.

Если вы посмотрите в Диспетчере имен, будет ли объем ваших именованных диапазонов рабочим листом или рабочей книгой? Если "Workbook", то вы можете просто использовать ThisWorkbook.Range("MarketsEquities") вместо того, чтобы указывать имя рабочего листа (которое слишком легко изменить пользователям ...)

Chronocidal 10.09.2018 11:30
1
1
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Я рекомендую указать рабочий лист для оператора каждыйRange() или Cells(), например ws.Range("C4"), в противном случае Excel угадает, какой рабочий лист вы имеете в виду.

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

    ws.Cells(ws.Rows.Count, "B").End(xlUp) 'last used cell in column B
    

    и вы можете использовать .Offset(row, column) для перемещения строк / столбцов относительно этой ячейки.

Поэтому я предлагаю следующее:

Public Sub InsertEquitiesBonds()
    Dim ws As Worksheet
    Set ws = Worksheets("PnL")

    ws.Range("B3").Value = "Equities"
    Worksheets("SummaryEquities").Range("MarketsEquities").Copy ws.Range("C4")


    Dim LastUsedCell As Range
    Set LastUsedCell = ws.Cells(ws.Rows.Count, "B").End(xlUp) 'last used cell in column B

    LastUsedCell.Offset(2, 0).Value = "Bonds" 'move 2 cells down and write Bonds
    Worksheets("SummaryBonds").Range("MarketsBonds").Copy LastUsedCell.Offset(3, 1) 'copy MarketsBonds 3 cells down and one cell right of the last used cell
End Sub

Спасибо за вашу помощь. Однако у меня есть еще один вопрос. Можно ли позволить макросу немедленно выполняться, как только я заполню списки на соответствующих листах SummaryEquities и SummaryBonds, вместо того, чтобы нажимать на макрос запуска или создавать эквивалентное сочетание клавиш

user9078057 10.09.2018 12:04

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

Pᴇʜ 10.09.2018 12:21

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

Pᴇʜ 10.09.2018 12:27

Другие вопросы по теме