#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 и вставьте его в свой код.