Макрос WorkbookA для создания гиперссылки в WorkbookB для вызова макроса в WorkbookA без события Worksheet_FollowHyperlink - PullRequest
0 голосов
/ 02 апреля 2020

Я столкнулся с забавной (я думаю) проблемой.

  • Допустим, у меня есть .xlam файл надстройки Excel, который содержит макрос (любой макрос), даже пусть он будет Msgbox "Hello World!".
  • Допустим, я каждый раз запускаю эту надстройку на новых книгах Excel (получаемых извне).

  • Я хотел бы надстройка для вставки гиперссылки в рабочую книгу Excel, которая будет открыта.

  • Мне также хотелось бы, чтобы вставленная гиперссылка вызывала макрос в надстройке.


Теперь, что я знаю / что я пробовал:

1) Если бы я открывал одну и ту же книгу Excel каждый раз, я мог просто добавьте событие «Follow Hyperlink»: Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) в рабочую таблицу, где я бы хотел, чтобы моя гиперссылка была запущена,

, однако,

, так как я открываю новый файл каждый раз он не будет содержать этот кусок кода на рабочем листе, поэтому «Follow Hyperlink» даже не будет работать.

2) Теперь, чтобы решить проблему в точке t «1» Я знаю, что, возможно, мог бы создать другой макрос, который вставил бы код Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) во вновь открытую книгу Excel, т.е. код VBA, который записывает код VBA , , однако я не надену Не думаю, что это очень элегантный способ решения этой проблемы.


Подводя итог: Я хотел бы (книга макросов) вставить гиперссылку в другую книгу , и когда эта гиперссылка будет нажата, я бы хотел, чтобы она запускала макрос из «книги макросов» БЕЗ использования события Worksheet_FollowHyperlink.

Есть идеи? Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2020

Попробуйте использовать следующий простой способ выполнить то, что вам нужно, на самом деле:

Private Sub AddSheetEventCallProc()
   'It needs a reference to 'Microsoft Visual Basic for Applications Extensibility x.x'
    Dim wb As Workbook, wProj As VBIDE.VBProject, wCom As VBIDE.VBComponent
    Dim wMod As VBIDE.CodeModule, Hrng As Range, LineI As Long

    Set wb = Workbooks.Add 'any existing workbook can be used here
    Set Hrng = wb.Worksheets(1).Range("A1") 'use here the cell you need
    'Add the hyperlink:
    Hrng.Hyperlinks.Add Anchor:=Hrng, _
            Address:="", SubAddress:=Hrng.Address, TextToDisplay:="Call Macro"
    With wb
        Set wProj = .VBProject
        Set wCom = wProj.VBComponents(Worksheets(1).codename)
        Set wMod = wCom.CodeModule
        With wMod
            On Error Resume Next
            LineI = .CreateEventProc("FollowHyperlink", "Worksheet"): LineI = LineI + 1
            .InsertLines LineI, "  If Target.Range.Address = """ & Hrng.Address & """ Then": LineI = LineI + 1
            .InsertLines LineI, "      Application.Run ""ADDINPRESA.xlam!testMsgbox""": LineI = LineI + 1
            .InsertLines LineI, "  End If"
            On Error GoTo 0
        End With
    End With
End Sub

Второй (более сложный) способ - заставить вашу надстройку создать новую вкладку ленты:

  1. Имея надстройку, хорошо создать новый стандартный модуль с именем «modRibbon» или аналогичным. Это не обязательно, но хорошо бы отделить модуль ленты c от модуля, выполняющего надстройку. Итак, в этом, где вы должны создать Subs, который можно вызывать с помощью элементов управления создаваемой вкладки:

    Option Explicit

    Sub Test1(control As IRibbonControl) appTest1 'use here your Sub name End Sub

    Sub Test2(control As IRibbonControl) appTest2 End Sub

    Sub Test3(control As IRibbonControl) appTest3 End Sub

Полезно скопировать этот код в окне Блокнота, чтобы использовать его, когда файл xml будет создано.

Затем создайте модуль, в котором будут существовать подпрограммы, вызываемые вышеперечисленными:

Sub appTest1 () MsgBox "Идет ...", "Test1" End Sub Sub appTest2 ( ) MsgBox "Идет ...",, "Test2" End Sub Sub appTest3 () MsgBox "Идет ...",, "Test3" End Sub

Теперь вы нужно так называемое приложение OfficeRibbonEditor. Я использую OfficeRibbonXEditor скачанный с здесь . Пожалуйста, загрузите «OfficeRibbonXEditor-NETFramework.zip». После загрузки извлеките файл из архива и просто используйте его. Нет необходимости установки. Теперь запустите его, нажмите кнопку Open, найдите книгу надстроек и нажмите OK. Выберите открытую надстройку и нажмите меню «Вставить». Выберите «Часть пользовательского интерфейса Office 2010+» для Office 2010 или более поздней версии. На 2007 год выберите другой вариант. Если вам нужно, чтобы надстройка была совместима с обоими случаями, будут вставлены оба файла xml. Я покажу, как создать ленту Tab только для первого варианта. Дважды щелкните «customUI14.xml», который был создан, и скопируйте следующий код. Теперь он разбирается с указанными выше подпрограммами, но для того, чтобы он вызывал ваши указанные подпрограммы c, используйте окно Блокнота, куда вы скопировали имя подпрограммы:

Теперь закройте надстройку из Excel и нажмите кнопку Validate. Если вы допустили ошибку в коде xml, строка с ошибкой будет подсвечена. Если все в порядке, нажмите кнопку «Сохранить» и откройте надстройку. Он создаст новую вкладку ленты (TestTab) с тремя кнопками ....

В inte rnet есть способы найти все imageMSO типы. Также можно использовать собственные иконки. Я сделал это несколько лет назад. Я не помню точно, как, но вам нужна эта опция, я могу проверить мой архив файлов.

Для выяснения проблем очень хорошим ресурсом был бы сайт Рона де Брейна, который разъясняет способ выполнения такая вкладка ленты, из более чем десяти лет. Вы можете найти его здесь .

И надстройка не «импортирует» всю ленту. Он только создает новую вкладку, добавляя к ней две существующие и заставляя ее исчезать при закрытии.

Также полезно знать, что при изменении xml все изменения выполняются в коде надстройки VBA. будет потеряно и наоборот ... Вот почему хорошо позаботиться о закрытии другого в тот момент, когда вы что-то измените. При необходимости я могу опубликовать ссылку на такую ​​надстройку, которая уже сделана, но я хотел бы верить, что ее легко создать самостоятельно.

Это способ создания новой вкладки ленты. Но есть и другие способы. Когда я найду время, я постараюсь сделать это только в VBA. Практически, вы должны прочитать все подпрограммы, которые вам нужны для вызова на новой вкладке, затем разархивировать файл Excel, создать или изменить файл XML, чтобы вызвать подпрограммы и повторно сжать файл ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...