[Excel] Macro in ander bestand draaien

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Eppo ©
  • Registratie: Juni 2004
  • Niet online
Mijn vraag

Oke, ik heb een probleem met een Excel macro. We hebben op het werk een Excel bestand en daarop zit een zelf gemaakte opslaan knop. Die knop triggert een macro die het opslaan van het document regelt. Hij opent daarvoor het 'opslaan als' scherm met daarin de voorgestelde naam. De gebruiker klikt dan op opslaan en de macro slaat het bestand op en sluit het werkbook.

Als het Excel bestand wordt geopend, worden er gelijk al wat macro's uitgevoerd. Al deze macro's zijn beschermd met een wachtwoord en kunnen helaas niet worden veranderd.

Nu wil ik deze handeling automatisch doen. Het makkelijkste leek mij dat in een ander Excel bestand aan te roepen en de macro te laten uitvoeren. Het mag van mij ook in vbs of powershell, zolang het maar gaat werken.

Wat hij nu doet is het volgende:

Visual Basic .NET:
1
2
3
4
5
Document = "C:\Temp\temp.xlsb"
Workbooks.Open Document 'Wacht netjes totdat alles is geladen en alle macro's hebben gedraaid
Application.Run "temp.xlsb!Invoer.Knop_Afsluiten" 'Start de macro ook op.

msgbox "Yep werkt"

Opzich werkt de code goed, alleen doordat de macro 'Invoer.Knop_Afsluiten" het temp.xlsb bestand afsluit sloopt hij ook mijn macro. Die geeft dan de foutmelding (deze geeft Excel niet weer, Excel geeft niks weer en stopt gewoon de macro (Yep werkt komt ook niet in beeld).

Als ik op internet zoek naar de fotumelding dan kom ik het volgende tegen:
Problem has resolve now, there is a problem with excel application instance.

This activity is done by scheduler services and that service create new object for excel application and closed it. However macro is closed that workbook before service.

hence i remove the Workbook.close from macro of excel then its works fine.
Dat is mooi, maar ik kan de workbook.close niet verwijderen uit de andere macro. Kan ik er om een of andere manier om heen werken? Dat hij de foutmelding negeert of dat hij het sluiten tegen houdt op 1 of andere manier?

Alle reacties


Acties:
  • 0 Henk 'm!

  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 01:17

g0tanks

Moderator CSA
Eppo © schreef op dinsdag 15 september 2020 @ 17:19:
Die knop triggert een macro die het opslaan van het document regelt. Hij opent daarvoor het 'opslaan als' scherm met daarin de voorgestelde naam. De gebruiker klikt dan op opslaan en de macro slaat het bestand op en sluit het werkbook.
Het klinkt niet als een hele ingewikkelde macro als het alleen een bestandsnaam voorstelt. Is het niet makkelijk om zelf die functionaliteit na te maken?

Ultrawide gaming setup: AMD Ryzen 7 2700X | NVIDIA GeForce RTX 2080 | Dell Alienware AW3418DW


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik zie de exacte foutmelding niet, maar afhankelijk van de situatie kun je die foutmelding opvangen of negeren (bijvoorbeeld met On Error Resume Next). Verder zijn Excel VBA Project wachtwoorden eigenlijk waardeloos: https://stackoverflow.com...xcel-vba-project/31005696
Fundamenteel gezien moet VBA-code namelijk gewoon beschikbaar zijn om het uit te voeren, dus dat soort wachtwoorden zijn altijd weg te omzeilen.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • +1 Henk 'm!

  • Eppo ©
  • Registratie: Juni 2004
  • Niet online
@g0tanks en @pedorus ja het klinkt niet als een ingewikkelde macro, maar dat is ook alleen maar wat ik zie. Kan makkelijk zijn dat de macro meer doet dan alleen maar opslaan. Het wachtwoord omzeilen is wel mogelijk, maar kan het niet aanpassen omdat het bestand van het netwerk wordt gehaald. Dan moet ik de bron aanpassen en dat mag ik helaas niet.

Heb het nu als volgt opgelost:
Nieuw Excel bestand gemaakt met een macro. Daarin staat in Thisworkbook het volgende:
Visual Basic:
1
2
3
4
5
6
7
Option Explicit

Private m_CloseHelper As CloseHelper

Private Sub Workbook_Open()
    Set m_CloseHelper = New CloseHelper
End Sub

En dan heb ik een nieuwe Class module gemaakt genaamd CloseHelper. Daar staat het volgende in:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Option Explicit

Private WithEvents m_App As Excel.Application

Private Sub Class_Initialize()
    Set m_App = Excel.Application
End Sub

Private Sub Class_Terminate()
    Set m_App = Nothing
End Sub

Private Sub m_App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
    'Logic goes here, e.g. the code below will prevent the user from closing
    'any workbook other than this one, for as long as this workbook is open.
    If Counter = 1 Then
        Cancel = False
    Else
        Cancel = True
        Counter = Counter + 1
    End If
End Sub

Het was een code die ik op internet had gevonden en eigenlijk zorgt hij ervoor dat hij geen enkel Excel bestand kan sluiten, zolang het hoofddocument niet is gesloten. Ik heb het aangepast dat hij het eerste afsluiten tegenhoudt en bij de tweede keer het door laat lopen. Dit zorgt ervoor dat de macro het document niet meer kan afsluiten, maar dat mijn macro het bestand dan wel goed kan afsluiten.