Toon posts:

[Excel] Macro in ander bestand draaien

Pagina: 1
Acties:

Vraag


  • 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


  • g0tanks
  • Registratie: Oktober 2008
  • Laatst online: 11:05

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


  • 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


  • 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.


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee