Могу ли я использовать Python для запуска фрагмента кода VBA без сохранения макроса в Excel? - PullRequest
0 голосов
/ 23 апреля 2020

Я работаю над автоматизацией некоторых электронных таблиц, и при использовании OpenPyXl для комментариев в электронной таблице комментарии не корректируются по размеру.

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

Можно ли добавить этот макрос, внедрив его в мой код python каким-либо образом? или вызов сценария VBA?

Это мой код VBA:

Sub AutoFitCommentBox()
    Set myRange = Application.Selection
    Set myRange = Application.InputBox("Select one Range that contain comment boxes:", "AutoFitCommentBox", myRange.Address, Type:=8)
    For Each oneCell In myRange
        If Not oneCell.Comment Is Nothing Then
            oneCell.Comment.Shape.TextFrame.AutoSize = True
        End If
    Next
End Sub

1 Ответ

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

Я протестировал код, который компилируется и работает нормально. Если вы заинтересованы в улучшении кода UserForm, вы можете найти эту статью о UserForm1.Show полезной.

В этом решении будет использоваться UserForm с ComboBox и CommandButton, все из которых имеют имена по умолчанию.

Вам потребуется открыть книгу Excel, в которой вы сохраняете этот код (и не забудьте сохранить в формате с поддержкой макросов). Вы можете открыть книгу с дополнительным кодом, который вы можете добавить, если хотите.

Когда форма загрузится, ComboBox заполнит список всех открытых имен книг Excel. Примечание: Я не тестировал этот код, но если память мне правильно служит, он не найдет книги, открытые в отдельном экземпляре Excel - это означает, что ваша книга может не появляется в списке.

Когда пользователь делает свой выбор, форма скрывается и затем вызывает ваш код, который вы написали, с добавлением передачи Workbook name, выбранного в пользовательской форме. При этом ваш код будет специально нацелен на указанную книгу без написания кода.

В модуле кода ThisWorkbook:

Private Sub Workbook_Open()

UserForm1.Show

End Sub

В модуле кода UserForm1:

Option Explicit
___________________________________________________________________________________

Private Sub CommandButton1_Click()

Dim ComboBoxSelection As String
ComboBoxSelection = Me.ComboBox1.Value

Me.Hide

AutoFitCommentBox (ComboBoxSelection)

End Sub
___________________________________________________________________________________

Private Sub UserForm_Initialize()
Dim WorkbookNameArray As Variant
Dim ArrayElementCounter As Long

WorkbookNameArray = FindOpenWorkbooks

For ArrayElementCounter = LBound(WorkbookNameArray) To UBound(WorkbookNameArray)
    Me.ComboBox1.AddItem WorkbookNameArray(ArrayElementCounter)
Next ArrayElementCounter
End Sub

В модуле кода Module1:

Public Sub AutoFitCommentBox(ByVal TargetWorkbookName As String)
    Dim TargetWorkbook As Workbook
    Dim myRange As Range

    Set TargetWorkbook = Workbooks(TargetWorkbookName)

    With TargetWorkbook
        Set myRange = Application.Selection
        Set myRange = Application.InputBox("Select one Range that contain comment boxes:", "AutoFitCommentBox", myRange.Address, Type:=8)

        Dim oneCell As Variant
        For Each oneCell In myRange
            If Not oneCell.Comment Is Nothing Then
                oneCell.Comment.Shape.TextFrame.AutoSize = True
            End If
        Next
    End With
End Sub
_________________________________________________________________________________

Public Function FindOpenWorkbooks() As Variant

Dim myWorkbook As Workbook
Dim WorkbookArray As Variant
Dim ArrayElementCounter As Long

ReDim WorkbookArray(1 To Application.Workbooks.Count)
i = LBound(WorkbookArray)

For Each myWorkbook In Application.Workbooks
    WorkbookArray(i) = myWorkbook.Name
    i = i + 1
Next myWorkbook

FindOpenWorkbooks = WorkbookArray

End Function

Для справки вот скриншот созданного мной UserForm:

Screenshot of userform

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