If macro then afsluiten

Status
Niet open voor verdere reacties.

Plannert

Gebruiker
Lid geworden
2 dec 2011
Berichten
34
Beste forumleden,

Ik open een ander excel werkboek vanuit het excel bestand waar ik in werk. In het andere excel werkboek zit een macro, die zorgt ervoor dat het bestand geprint wordt. Nu wil ik dat wanneer deze macro gerunt heeft het werkboek weer wordt gesloten en dat ik weer terugkeer naar het excel bestand waarin ik werkte.

Nu wil ik dat de macro in het ander bestand niet wordt verandert en dan wil ik in het bestand waarin ik werk iets dat lijkt op:

Private Sub Cmd_Oldschool_Click ()

Workbooks.Open Filename:= _
"N:\Manufacturing NL\Production\SQL REPORTS\NL_Pickinglist.xlsm"
Sheets("Picklist interne bin#").Select
Range("C3").Select

If printen() Then
Workbook.Quit

End Sub


Dus als de macro gedraaid is dan het werkboek direct weer sluiten.

Alvast bedankt!
 
Het is een beetje afhankelijk van hoe de print functie wordt aangeroepen in het andere workbook.

Code:
set nieuw = Workbooks.Open(Filename:= "N:\Manufacturing NL\Production\SQL REPORTS\NL_Pickinglist.xlsm")
nieuw.call("printen")
nieuw.Close

Wat dus niet duidelijk is is hoe de printen routine geimplementeerd is in het andere workbook
 
Ik heb het even geprobeerd, maar krijg dan een foutmelding:

Run-time error '438': Object doesn't support this proerty or method.

De sub in het andere werkboek ziet er als volgt uit:

Sub printen()
'
' printen Macro
'

'

If Range("I1") > 0 Then
Sheets("Picklist interne bin#").Select
ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"
End If

If Range("I2") > 0 Then
Sheets("Picklijst externe locatie").Select
ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"
Sheets("Picklist interne bin#").Select
End If

End Sub
 
Volgens mij wordt het dan zoiets

Code:
set nieuw = Workbooks.Open(Filename:= "N:\Manufacturing NL\Production\SQL REPORTS\NL_Pickinglist.xlsm")
Application.Run (nieuw.Name & "!printen")

nieuw.Close
 
Oke, hij doet het ff te goed :P.

Ik zou graag nog ergens wat in willen vullen op het werkblad dat geopend wordt en hij mag afgesloten worden zonder op te slaan. Voor het laatste heb ik geprobeerd door .Close te vervangen door Application.CutCopyMode = False dat werkte echter niet.

Voor het eerste heb ik geprobeerd er een tekstbox er tussen te doen, maar dan refresht hij de data niet voordat er geprint wordt, ondanks dat ik dit er wel in heb staan.

Ik hoop dat jullie ook hier weer wat moois voor kunnen verzinnen!
 
Dit kan er gewoon tussen gezet worden, maar "ergens" is wel erg ruim :)

Code:
application.displayalerts = false
set nieuw = Workbooks.Open(Filename:= "N:\Manufacturing NL\Production\SQL REPORTS\NL_Pickinglist.xlsm")
nieuw.sheets(1).cells(1,1).value = "waarde op eerste blad in A1"
Application.Run (nieuw.Name & "!printen")
nieuw.Close
application.displayalerts = true

Hierbij een voorbeeld hoe je op de eerste sheet, cel A1 nog wat aan kunt passen voor het printen. Als je iets specifieks in gedachte hebt kan ik daat wellicht ook mee helpen. Deze code verhelpt ook de "save" vraag
 
Het save probleem is inderdaad opgelost, uiteraard dank daarvoor!

Het andere werkt perfect alleen niet helemaal zoals ik in gedachte had :). Na het openen van het andere workbook moet er een werkordernummer ingevuld worden in cel C3. (dit heb ik al veranderd, .Cells(3, 3)) Dan moet er een SQL Query gedraaid worden en dan moet de macro gedraaid worden. Hiervoor zit een aparte knop in de sheet. Wanneer deze knop wordt aangeklikt begint de macro te lopen en wanneer deze macro gedraait heeft wil ik weer afsluiten.

Het openen is geen probleem, het printen en het afsluiten ook niet. Alleen het invoeren van een nieuw werkordernummer en het refreshen van de query is nog het knelpunt. Wat het dus lastig maakt t.o.v. van je oplossing is dat de invoer variabel is en het refreshen niet gebeurt.

Ik hoop dat het probleem duidelijk uit een gezet is. Ik heb het idee dat het niet al te ingewikkeld moet zijn, maar ik heb nog niet zoveel ervaring met vba :$.

In ieder geval bedankt alvast!
 
Het refreshen is nu al wel gelukt, (nieuw.RefreshAll) alleen de query krijg geen tijd om te updaten, zodoende wordt er alsnog de oude informatie uitgeprint.
 
Ik moet dat even testen. Maar volgens mij kun je met

.Refresh BackgroundQuery:=False

vba laten wachten tot de refresh klaar is. Je moet dan wel even je querytables object meegeven als je dat gebruikt. Het is zeker mogelijk, maar de oplossing is nu een beetje afhankelijk hoe je de data importeerd
 
Ik heb dit nu 1 op 1 geintegreerd, nieuw.refresh backgroundquery:=False

en krijg dan een fout melding:

Run-time error '438': Object doesn't support this priorerty or method.

Waar moet ik het in zoeken, ik ben niet zo bekend met de objecten en querytables.... Laat even wat termen vallen waar ik het in moet zoeken dan weet ik het denk ik wel te achterhalen.
 
Het gaat er met name om, hoe is de data import geïmplementeerd? Is er een vba script met een import code, of een formule? Hoe haal je de data op uit de externe database?
 
De dataimport komt door middel van SQL tot stand. Je weet zelf beter dan ik hoe een SQL werkt gok ik zo. We maken gewoon met de query's de informatie die we nodig hebben in SQL en laten dat rechtstreeks in excel importeren zonder formule of vba script. <return data to Excel> gebruiken we dan. Ik zou het verder echt niet weten eerlijk gezegd...
 
Afhankelijk van de excel versie:

2007/2010

Ga naar de tabel:
Hulpmiddelen voor tabellen
vernieuwen uitklappen (pijltje onder plaatje)
eigenschappen van verbinding
"vernieuwen op de achtergrond inschakelen" uitvinken
 
Ik heb hem uitgezet en ben wat verder aan het zoeken geweest. Heb nu de .backgroundquery = False op deze manier onderstaande wijze opgebouwd. Maar krijg dan nog een error. Nu weet ik alleen niet wat er op de plek van de vraagtekens moet staan, of zit ik volledig op het verkeerde spoor?


Private Sub Cmd_OldSchool_Click()

' Dim WO As String



Application.DisplayAlerts = False
Set nieuw = Workbooks.Open(Filename:= _
"N:\Manufacturing NL\Production\SQL REPORTS\NL_Pickinglist.xlsm")
'WO = ActiveSheet.Range("C3").Value
Frm_woInvoer.Show
'nieuw.Sheets(1).Cells(3, 3).Value = Frm_woInvoer.Show
' "waarde op eerste blad in C3"
' PICKLIJSText.Refresh.BackgroundQuery:=False
' With ActiveSheet.QueryTables.Add(Connection:="PICKLIJSText", Destination:=Range("$C$3"))
With ActiveSheet.QueryTables.Add(Connection:="??", Destination:=Range("$C$3"))
.BackgroundQuery = False
End With
' RefreshAll
Application.Run (nieuw.Name & "!printen")
nieuw.Close
Application.DisplayAlerts = True
Unload Me
End Sub
 
Als je die optie hebt uitgezet zou het moeten werken (volgens microsoft help) op de vorige manier (met refreshall). de lijst zou dan eerst moeten verversen voordat met printen wordt begonnen. Ik heb het persoonlijk echter nooit aan de hand gehad.

Als je al een querytable gebruikt kun je die met deze kleine macro zien:

Code:
Sub test()
For Each qt In Sheets(1).QueryTables
MsgBox (qt.Name)
Next qt
End Sub

aangenomen dat de tabel op sheet 1 staat natuurlijk.
 
@ Wampier,

Ik heb het opgegeven.... Ik heb nog van alles geprobeerd, maar ik krijg het niet voor elkaar. Ik heb het nu maar heel simpel gehouden. Alleen het bestand wordt nu geopend. Ik wil je in ieder geval bedanken voor de tijd en moeite!

Vr.gr.
Plannert.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan