Передача параметров из Excel в макрос - PullRequest
0 голосов
/ 25 апреля 2020

Я делаю макрос в VBA (Excel 2016 32bit + Windows 10 Pro), который срабатывает при наступлении события Workbook.NewSheet . Этот макрос должен переименовывать Sheet.CodeName свойство каждого нового листа.

Проблема в том, что когда я запускаю свой макрос в режиме разбиения, шаг за шагом, он работает прекрасно. Но он не может переименовать свойство Sheet.CodeName после закрытия VB Editor (VBE). Просто свойство Sheet.CodeName пусто, поэтому макрос не знает, какой лист должен быть переименован. Если я открою VBE и, ничего не делая, закрою его снова, Macro будет работать правильно. И затем этот макрос корректно работает с Workbook.Open и Workbook.SheetChange событиями. Только событие Workbook.NewSheet создает проблему.

Дайте мне предложение, пожалуйста, если вы знаете, как я могу улучшить передачу параметров из Excel в мой макрос позади. закрыто VBE.

Привет!

Спасибо за желание помочь мне! Код очень прост. Цель - получить значение свойства sh_CodeName в окне сообщения при закрытии VBE.

Текущий код:

Private Sub Workbook_NewSheet(ByVal sh As Object)
NewSheet sh
End Sub

Option Explicit
Sub NewSheet(ByVal sh As Object)
Dim sh_CodeName As String, sh_Name As String, i As Integer

sh_CodeName = sh.CodeName: sh_Name = sh.Name

MsgBox "Code Name - " & sh_CodeName & vbCrLf & "Name - " & sh_Name, vbOKOnly, "MESSAGE FROM WorkBook.NewSheet"

End Sub

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Кажется, что sh.codename недоступен после добавления нового листа, если он не получил доступ к проекту VBA. Может быть, у кого-то есть что-то еще по этому поводу.

Этот код работает для меня, но имеет недостаток в том, что вам необходимо доверять доступ к объектной модели проекта VBA .

Sub NewSheet(ByVal Sh As Object)
    Dim sh_CodeName As String, sh_Name As String, i As Integer


    sh_CodeName = ActiveWorkbook.VBProject.VBComponents(Sh.Name).Properties("_Codename")
    sh_Name = Sh.Name

    MsgBox "Code Name - " & sh_CodeName & vbCrLf & "Name - " & sh_Name, vbOKOnly, "MESSAGE FROM WorkBook.NewSheet"

End Sub

Даже этот простой макрос не будет давать кодовое имя при запуске с закрытым VBE

Sub TestAddIt()

Dim sh As Worksheet

    Set sh = ActiveWorkbook.Worksheets.Add
    MsgBox sh.Name & " - " & sh.CodeName

End Sub

PS : другим обходным путем может быть открытие VBE и его закрытие снова, но вам все равно нужен доступ к проект VBA

Sub TestAddIt()

Dim Sh As Worksheet

    Set Sh = ActiveWorkbook.Worksheets.Add

    With Application.VBE.MainWindow
        .WindowState = 1
        .Visible = True
        .Visible = False
    End With

    MsgBox Sh.Name & " - " & Sh.CodeName

End Sub

Обновление : Это также сработало для меня.

Sub TestAddIt()

Dim Sh As Worksheet

    Set Sh = ActiveWorkbook.Worksheets.Add
    ' Recompile the project
    Application.VBE.CommandBars.FindControl(ID:=578).Execute

    MsgBox Sh.Name & " - " & Sh.CodeName

End Sub
0 голосов
/ 25 апреля 2020

Вы помогаете мне с этим утверждением.

sh_CodeName = ActiveWorkbook.VBProject.VBComponents(Sh.Name).Properties("_Codename")

Я немного его изменил (Sh .CodeName вместо Sh .Name). И добавил задержку.

Sub Check_NewSheet(ByVal sh As Object)
    Dim sh_CodeName As String, sh_Name As String, i As Integer

On Error Resume Next
    sh_CodeName = ThisWorkbook.VBProject.VBComponents(sh.CodeName).Properties("_Codename")
If Err.number > 0 Then
i = 0
Do While sh_CodeName = ""
    sh_CodeName = ThisWorkbook.VBProject.VBComponents(sh.CodeName).Properties("_Codename")
DoEvents
i = i + 1
Loop
End If
sh_Name = sh.Name

    MsgBox "Code Name - " & sh_CodeName & vbCrLf & "Name - " & sh_Name & vbCrLf & _
    "Attempts - " & i, vbOKOnly, "MESSAGE FROM WorkBook.NewSheet"

End Sub

Теперь это работает довольно хорошо. Это довольно хорошо, как временное решение. Но мне все еще интересно выяснить, что не так в связи Excel с макросами. Итак, если вы найдете один, пожалуйста, поделитесь им со мной.

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