programing

런타임 동안 Excel 응용 프로그램 숨기기

codeshow 2023. 8. 30. 22:19
반응형

런타임 동안 Excel 응용 프로그램 숨기기

웹스크래핑을 하는 긴 스크립트에서 엑셀을 숨기려고 합니다.애플리케이션을 잘 숨길 수 있습니다. 문제는 변경할 때.Visible로 돌아가다.True저는 1-2개의 추가 애플리케이션을 받고 있습니다(엑셀 셸만 비웁니다).이 중 하나는 내 것인 것 같아요.PERSONAL.xlsb워크북, 하지만 다른 것이 무엇인지 잘 모르겠어요 - 가끔은 하나를 더 받고, 때로는 두 개를 더 받아요.이 셸 파일을 닫을 수 있는 유일한 방법은EXCEL.EXE작업 관리자를 통해 프로세스를 수행할 수 있습니다.

메인했습니다.Windows(1)(애플리케이션이 아니라 워크북만 숨깁니다.)

Sub Test()

Windows(ThisWorkbook.Name).Visible = False

Application.Wait (Now + TimeValue("0:00:05"))

Windows(ThisWorkbook.Name).Visible = True

End Sub

기본 워크북을 다시 표시하려면 어떻게 해야 합니까?

샘플 코드:

Sub Test()

Application.Visible = False

Application.Wait (Now + TimeValue("0:00:05"))

Application.Visible = True

End Sub

enter image description here

편집: 이 기능은 Windows 7, Excel 2016에 있습니다.

: 실행 중인 : 실행 중Application.Visible = True그 자체로도 이 두 개의 환상적인 응용 프로그램을 제공합니다.

이가 편3: 이는분명매저가에 저장되어 이 있습니다.PERSONAL.xlsb파일 - 새 컴퓨터로 이동하여 이 워크북에 새 매크로를 추가하면 문제를 재현할 수 있습니다.하지만, 어떻게 피해야 할지 아직 잘 모르겠어요...

작업 관리자:

img1

Filemaker Pro에서 Excel을 여는 스크립트:

Open URL [With dialog:Off; "C:\Users\Username\Desktop\TestFile.xlsm"]

에 안에.TestFile.xlsm:

Private Sub Workbook_Open()

Application.Visible = False

'Refresh a query in the Excel workbook that is linked to Filemaker Pro

'Webscrape, webscrape, webscrape from a worksheet inside this Excel document
'to a hidden Internet Explorer Window (ewww, IE!)

Application.Wait (Now + TimeValue("0:00:05"))

Application.Visible = True

'Either close Excel completely or reload my main instance of Excel

End Sub

저는 엑셀을 완전히 그만둘 수 있다는 것을 깨달았습니다.어플.종료, 그러나 즉시 종료할지 또는 가져오기 프로세스를 요약하는 사용자 양식을 Excel에서 다시 칠할지 결정하지 않았습니다.

저는 당신의 문제를 재현할 수 있었습니다.먼저 Personal.xlsb를 로드하지 않고 Application을 숨기는 것을 테스트해 보았는데 잘 작동했습니다.그리고 나서 저는 Personal.xlsb를 로드했고 당신이 했던 것과 같은 동작을 받았습니다: 애플리케이션 후에 추가 Excel 쉘이 보이게 되었습니다.표시 = 참입니다.

왜 가끔 셸이 두 개 더 나오는지는 모르겠지만, 아마 다른 애드인(.xlam)이 로드되어 있을 것입니다.먼저 모든 애드인을 언로드하는 코드를 추가할 수도 있지만, 다른 해결책이 있습니다. 그냥 새로운 엑셀 인스턴스를 실행하고 매크로 워크북을 로드하고 매크로를 실행하는 것이 어떻습니까?예를 들어 워크북 이름이 C인 경우:\Book1.xlsb의 매크로는 "MyMacro"입니다. 그런 다음 Book1을 실행할 코드가 있는 두 번째 워크북을 만듭니다.다음과 같이:

Sub LaunchIt()

    Dim xlApp As Excel.Application
    Dim wb As Workbook

    Set xlApp = New Excel.Application

    With xlApp
        Set wb = .Workbooks.Open("C:\Book1.xlsb")
        .Run "'" & wb.Name & "'!MyMacro"
        wb.Close SaveChanges:=False
        .Quit
    End With

End Sub

기본적으로 Excel의 새 인스턴스는 표시되지 않으므로 가시성을 설정할 필요가 없습니다.저는 그것을 테스트했고 그것은 저에게 효과가 있었습니다.

이 동작을 재현할 수도 있지만 창의 Visible-Property를 false로 설정하면 해결됩니다.

Private Sub Workbook_Open()
Dim x As Workbook
With Application
    .Visible = False
    .Wait (Now + TimeValue("0:00:05"))
    .Visible = True
        For Each x In .Workbooks
            If x.Name = "PERSONAL.XLSB" Then 'maybe also other addins(?)
                x.Windows(1).Visible = True
                x.Windows(1).Visible = False 'toggle
                x.Saved = True 'for not getting save-alerts
            End If
        Next
End With
End Sub

편집:

또는 각 루프에 대한 를 다음으로 변경합니다.

    For Each myAdd In AddIns
        myAdd.Installed = False
    Next myAdd

제 쪽에서는 작동합니다(단, 닫을 때는 이전에 설치한 추가 기능을 True로 다시 설정해야 합니다)

내가 올바르게 이해했다면 특정 작업 중에 사용자가 보이지 않게 되었다가 작업이 완료되면 다시 나타나시겠습니까?

만약 그렇다면, 내 애플리케이션이 실제로 Excel로 시작할 때 사용한 코드를 살펴보십시오. 이 코드는 특정 양식만 표시됩니다.

사용자가 완료하고 애플리케이션을 종료하려면 cmdQuit 명령 버튼을 누릅니다.이 코드 뒤에 있는 코드는 Excel을 다시 표시합니다.아래에 코드를 붙여넣었습니다.이것이 당신의 상황에 대한 해결책을 찾도록 영감을 주는 데 도움이 되기를 바랍니다.

사항
이상적으로는 전체 엑셀을 보이지 않게 만들고 싶습니다!따라서 기계에 Excel 인스턴스가 하나만 열려 있으면 다음을 사용합니다.Application.visible = true그러나 다른 스프레드쉬트가 열려 있을 수도 있습니다.이 경우 현재 워크북만 숨깁니다.이런 이유로ThisWorkbook.Windows(1).Visible = False는 에음사용다니됩 됩니다.Else블록으로 막다

일단 엑셀이 보이지 않게 되면, 우리는 우리의 양식을 적재합니다.이러한 창은 사용자와의 상호 작용을 위한 프런트 엔드 GUI를 제공합니다.따라서 저는 엑셀이 배후에서 실행되고 있다는 징후 없이 엑셀에서 적절한 애플리케이션을 만들 수 있습니다.

일단 사용자가 완료되면, 그는 내가 cmdExit이라고 불렀던 종료 버튼을 누릅니다.아래에서 코드가 이 단추를 구부리는 것을 볼 수 있습니다.GUI 양식을 언로드하고 사용자가 Excel을 다시 볼 수 있도록 합니다.이것은 당신이 성취하고자 하는 것과 비슷합니다.

Private Sub Workbook_Open()

    Stop

    ' Hide Excel...
'    ActiveWorkbook.Windows(1).Visible = False
    If Workbooks.Count < 2 Then
        Application.Visible = False
    Else
        ThisWorkbook.Windows(1).Visible = False
    End If

    Load frmMain
    frmMain.Show vbModal

End Sub


Private Sub cmdQuit_Click()

    'ThisWorkbook.Windows(1).Visible = True
    Application.Visible = True
    Unload frmMoreOccupationLines
    Unload Me

End Sub


두 개 이상의 워크북이 표시되는 이유는 실수로 Excel의 이전 인스턴스가 열려 있지만 숨겨져 있기 때문일 수 있습니다(보이지 않음).그것들은 언로드되지 않았고 여전히 메모리에 남아 있습니다.이해 하셨나요?그래서 당신이 할 때Application.visible=true제대로 종료하지 않은 모든 이전 인스턴스를 볼 수 있습니다.따라서 코드에서 적절한 언로드 및 종료 전략을 구현하는 것이 해결책이 될 수 있습니다.

따라서 다음과 같은 솔루션을 찾고 있을 수 있습니다.

Sub Test()
    If Workbooks.Count < 2 Then
        Application.Visible = False
    Else
        ThisWorkbook.Windows(1).Visible = False
    End If

    Application.Wait (Now + TimeValue("0:00:05"))

    If Workbooks.Count < 2 Then
        Application.Visible = True
    Else
        ThisWorkbook.Windows(1).Visible = True
    End If
End Sub


Private Sub cmdQuit_Click()
    Application.Visible = True
    'Unload Me
    Application.Quit
End Sub

언급URL : https://stackoverflow.com/questions/52524148/hiding-the-excel-application-during-run-time

반응형