Развертывание макросов в виде надстроек с пользовательскими кнопками ленты для всего office

#excel #vba

#excel #vba

Вопрос:

Я искал способ распространять макросы в моем технически неграмотном офисе самым простым способом, который я могу.

Судя по моим исследованиям, сохранение макросов в надстройке .xlam, похоже, движется в правильном направлении.

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

До сих пор мне не удалось найти никаких руководств, и наша служба безопасности office также может блокировать определенные пути.

Редактировать: Использование превосходного решения W-Hit и настройка структуры папок, как указано, определенно помогает значительно упростить развертывание обновления с помощью подпрограммы DeployAddIn.

Я также счел полезным поместить подпрограммы DeployAddIn и InstallAddin на собственную вкладку пользовательской ленты!

Однако я столкнулся с проблемой с подпрограммой InstallAddin: как отформатировать XML-текст в VBA без синтаксических ошибок.

Я обнаружил, что каждый элемент должен иметь mso в начале, например, <button> becomes <mso:button> и каждый раздел с надписью «speech marked» в строке должен иметь «двойные метки речи».

Возможно, самый простой способ использовать эту функцию установки — сохранить и отредактировать код в активном файле, затем открыть C:Users [имя пользователя]AppDataLocalMicrosoftOfficeExcel.officeUI в Notepad . Затем просто выполните поиск и замену, чтобы добавить дополнительные кавычки, и вставьте это в раздел RibbonXML = «вставьте свой текст здесь» кода, убедившись, что он инкапсулирован окончательными метками речи, чтобы пометить весь раздел как текстовую строку.

Я мог бы также рассмотреть возможность добавления дополнительной функциональности здесь… наличие inputbox или пользовательской формы, которая позволяет вставлять код на этом этапе, вместо того, чтобы входить в редактор VBA для его вставки.

Комментарии:

1. Эта ссылка очень полезна. Вы также можете распространять их непосредственно в файлы или в надстройки. В недавнем прошлом я использовал оба варианта.

2. Я пробовал это раньше… пользовательская лента была применена к определенной книге, следующий шаг — сохранить эту книгу как .xlam, чтобы применить ленту на уровне проекта (если я правильно понял)?

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

4. Я обязательно попробую это! приветствую, чувак!

Ответ №1:

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

1-й шаг — создать структуру папок с тестовыми и производственными копиями ваших файлов .xlam, администратором которых вы являетесь.

2-й, в рабочей папке щелкните правой кнопкой мыши все файлы .xlam и установите для атрибутов в свойствах значение «Только для чтения». Если вы этого не сделаете, вы никогда не сможете обновить надстройку, если в ней есть кто-то еще.

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

Ниже приведена надстройка администратора, которую я использую для переноса файлов тестирования в рабочую среду.

 Sub DeployAddIn()
'Author       : Ken Puls (www.excelguru.ca)
'Macro Purpose: To deploy finished/updated add-in to a network
'               location as a read only file

    Dim strAddinDevelopmentPath As String
    Dim strAddinPublicPath As String
    Dim FSO As New FileSystemObject

    'Set development path
    ChDrive "R:"
    ChDir "R:addinsPROJECTS"
    strAddinDevelopmentPath = Application.GetOpenFilename()
    If strAddinDevelopmentPath = "False" Then
        Exit Sub
    ElseIf InStr(strAddinDevelopmentPath, "PRODUCTION") > 1 Then
        If MsgBox("You've Selected a Production File To Replace a Production File. Would You Like To Continue Anyway?", vbYesNo) = vbNo Then
            Exit Sub
        End If
    End If

    'Get Desitination path
    strAddinPublicPath = Replace(strAddinDevelopmentPath, "TESTING", "PRODUCTION")

    'Create dir if it doesn't exist
    On Error Resume Next
    MkDir Left(strAddinPublicPath, InStrRev(strAddinPublicPath, "") - 1)
    On Error GoTo 0

    'Turn off alert regarding overwriting existing files
    Application.DisplayAlerts = False

    'overwrite existing file
    On Error Resume Next
    SetAttr strAddinPublicPath, vbNormal
    On Error GoTo 0
    FSO.CopyFile strAddinDevelopmentPath, strAddinPublicPath, True
    SetAttr strAddinPublicPath, vbReadOnly

    'Resume alerts
    Application.DisplayAlerts = True
End Sub
  

в-четвертых, я также написал макрос для изменения пользовательской ленты. Ссылка ниже, в дополнение к сайту Рона Дебрюина, полезна. https://grishagin.com/vba/2017/01/11/automatic-excel-addin-installation.html
Код для автоматизации установки надстроек после получения нужного текста из файла officeUI

 Sub InstallAddin()
    'Adapted from https://grishagin.com/vba/2017/01/11/automatic-excel-addin-installation.html
    Dim eai As Excel.AddIn
    Dim alreadyinstalled As Boolean
    Dim ribbonXML As String

    'check if already installed
    For Each eai In Application.AddIns
        If eai.Name = "Main addin.xlam" Then
            eai.Installed = False
            Exit For
        End If
    Next

    'add and install the addin
    Set eai = Application.AddIns.Add("path to Main addin.xlam", False)
    eai.Installed = True

    'append quick access ribbon xml to add button
    ClearCustRibbon
    LoadNewRibbon

    'have to close addin for it to load properly the first time
    Workbooks("Main addin.xlam").Close

End Sub

Sub ClearCustRibbon()
'https://social.msdn.microsoft.com/Forums/vstudio/en-US/abddbdc1-7a24-4664-a6ff-170d787baa5b/qat-changes-lost-when-using-xml-to-modify-ribbon-excel-2016-2016?forum=exceldev
Dim hFile As Long
Dim ribbonXMLString As String

hFile = FreeFile
OfficeUIFilePath = Environ("USERPROFILE") amp; "AppDataLocalMicrosoftOfficeExcel.officeUI"

ribbonXMLString = "<mso:customUI           xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">" amp; _
"<mso:ribbon>" amp; _
"<mso:qat>" amp; _
"<mso:sharedControls>" amp; _
"</mso:sharedControls>" amp; _
"</mso:qat>" amp; _
"</mso:ribbon>" amp; _
"</mso:customUI>"

Open OfficeUIFilePath For Output Access Write As hFile
Print #hFile, ribbonXMLString
Close hFile

End Sub

Sub LoadNewRibbon()
Dim hFile As Long

hFile = FreeFile
OfficeUIFilePath = Environ("USERPROFILE") amp; "AppDataLocalMicrosoftOfficeExcel.officeUI"

ribbonXML = "your ribbon text here"

Open OfficeUIFilePath For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile
End Sub
  

*** ВАЖНО—- Если вы устанавливаете надстройку вручную, убедитесь, что вы выбрали нет при запросе, хотите ли вы сохранить файл на локальном компьютере. Если вы сохраните его на локальном компьютере, он создаст локальную копию и никогда не будет обновляться, если вы внесете изменения в сетевую копию или потребуется исправить ошибку.

Есть и другие советы, но в основном вам нужно будет адаптировать их к тому, как вы работаете. Надеюсь, это поможет.

Комментарии:

1. наконец-то нашел время разобраться в этом, я полагаю, что я все понимаю, выглядит фантастически! вы просто находка!!

2. Ах, теперь я столкнулся с проблемой с этим… как я понимаю, в части LoanNewRibbon «текст вашей ленты здесь» должен быть заменен XML-кодом, и каждая строка с префиксом «<mso: чтобы заставить это работать … это отображается как синтаксическая ошибка, и я не могу понять, почему!

3. проще всего перейти к OfficeUIFilePath после того, как вы вручную настроили свою ленту так, как вы хотите, а затем просто скопируйте xml и вставьте его в свой код.