Juiste werkblad tonen na opstarten macro

Status
Niet open voor verdere reacties.

EdjeVis

Gebruiker
Lid geworden
22 nov 2006
Berichten
99
Goedemorgen,

Op een website/-portal klik ik op een knop en krijg een "ruwe" datadump naar Excel gedownload.
Ik open de download en Excel wordt geopend. Dat is op dat moment dus het workbook en worksheet dat voor staat.
Vervolgens klik ik in mijn werkbalk "Snelle toegang" om een macro op te starten. Deze macro zit in een template in een ander workbook.
Deze macro controleert (o.b.v. wat voorwaarden/aannames) of er meerdere bestanden/workbooks met downloads open staan.
Als dit er meer dan 2 zijn, wordt eerst gevraagd om het juiste bestand/workbook te selecteren.
Als dit er slechts één is, wordt direct een form getoond (met twee radiobuttons) waarin gevraagd wordt volgens welke (van 2) layouts de ruwe download opgemaakt moet gaan worden.
Na het aanklikken van de gewenste optie, wordt direct de resterende VBA-code aangeroepen en de opmaak afgerond, waarna een melding verschijnt dat de opmaak is afgerond.

Dit werkt allemaal keurig, behalve...... dat na het klikken op het icoontje in de werkbalk "Snelle toegang" weliswaar héél eventjes het userform getoond wordt (met op de achtergrond nog de ruwe download), maar na 1 à 2 seconden, wordt het werkblad van de template (waar de VBA-code in zit) getoond en ben ik dus het userform "kwijt". Ik kom alleen terug bij het userform middels ALT-TAB. Maar zoals je begrijpt...dat wil ik niet op die manier...

Ik heb al geprobeerd om op het Workbook een public variabele te declareren en deze variabele te gebruiken in de macro in de module, maar deze is daar niet beschikbaar. Ook een public variabele op het nivo van het userform krijg ik niet getoond in de macro in de module.

Kan iemand mij helpen om te zorgen dat ik het userform met het werkblad met de ruwe datadump voor kan houden?

Bij voorbaat dank!
 
Laatst bewerkt:
Je controlemacro in aparte workbook zetten met macro's (vb. Personal.xlsb) en zorgen dat die meteen wordt mee opgestart als je Excel start.
Dan is elke macro daarin onmiddellijk oproepbaar vanuit het bestand dat je daarna opent.
 
Hoi Digicafee,
Dank voor je snelle reactie.
Helaas gaat het plaatsen in de personal.xlsb 'm niet worden, want dit moet door meerdere mensen gebruikt gaan worden.
Het probleem zit 'm op dit moment niet in de oproepbaarheid van de macro (dat gaat prima met de knop in de werkbalk "Snelle toegang"), maar in het feit dat de na 1 à 2 seconden de template wordt voor gezet i.p.v. de ruwe datadump met het userform. Als ik dus héél snel klik, doet het probleem zich niet voor, maar als ik íéts te lang wacht, dan ben ik 'm kwijt.
 
Laatst bewerkt:
Als een macro met VBA wordt uitgevoerd is het normaal dat het werkblad van die workboek de focus krijgt.
Je zult dus in de macro zelf die focus opnieuw moeten verleggen door middel van VBA...

Wat je ook ziet : beide workbooks blijven actief in het geheugen hoor ...
 
En dat is dus precies mijn probleem..... hoe krijg ik de focus weer bij het andere workbook
 
Hoe ziet de macro eruit? Ben je bekent met Activeworkbook en ThisWorkbook?
 
yep
maar ik ben al wel ietsje verder....
het probleem lijkt te zitten in het feit dat het workbook waarin de VBA-code zit wordt opgestart in een nieuwe Excel-instantie oid. Na het afronden van het opstarten, krijgt dat werkblad na een paar seconden (alsnog) de focus.
Net namelijk getest met iemand van de servicedesk van onze IT-provider : als er nog geen Excel-instantie open staat en ik het bestand met de VBA-code open en metéén op ALT+F11 druk, wordt de VBA-editor getoond, maar na een paar tellen verschijnt alsnog het Excel-werkblad. Echter, als ik het bestand open en ik wacht een paar seconden en druk dán op ALT+F11, dan gebeurt dit niet.

Dit lijkt sterk op wat er gebeurt met het userform.
Dus.... ik heb nu in de code een pauze ingebouwd van 15 seconden (natuurlijk veel te lang om straks voor gebruikers te laten gebeuren, maar even ter test) en dan blijft het userform keurig in één keer voor staan.
Het lijkt er vooralsnog dus op dat er 2 oplossing zijn :
  1. De pauze zo uitkienen dat het nét lang genoeg is om de focus te behouden, maar voor de gebruiker tot een minimum beperkt blijft (niet de voorkeur)
  2. Verder puzzelen naar de oorzaak, mogelijk dus voorkomen dat een apart Excel-instantie wordt geopend of zo?
  3. Óf zorgen dat de focus weer terug komt bij het workbook met de ruwe datadump

Ter beeldvorming zijn de Excel-bestanden bijgesloten.
Het bestand met de ruwe datadump heet nu "2 (22).xlsx", maar de teller tussen haakjes loopt op én het bestand staat normaliter in de "download-map".
 

Bijlagen

  • Convert_Servoy.xlsm
    56,3 KB · Weergaven: 24
  • 2 (22).xlsx
    13 KB · Weergaven: 32
Laatst bewerkt:
Voor je puntje 3 :

Code:
[COLOR=#333333]Workbook(?).Sheets("Sheet1?").Activate[/COLOR]

verlegt meteen de focus.
 
Ik heb de code omgezet en ook al weet ik wat de naam van het workbook is en doe ik nét vóór ik het userform toon nog een "wbServoyDump.Activate" (waarbij natuurlijk eerder al "Dim wbServoyDump As Workbook"), dan nóg krijg ik (als ik dit te snel doe) het worksheet van het template-workbook voor m'n neus.
Bestand met aangepaste code is weer bijgevoegd....
 

Bijlagen

  • Convert_Servoy.xlsm
    56,9 KB · Weergaven: 25
Ik zie enkel dat je die variabel door de ganse module heen een paar keer een 'set' doet en dus de verwijzing erin wijzigt.
Te ondoorgrondelijk om te volgen vrees ik ...

Zou eerst eens heel grondig door de ganse flow moeten gaan - ben ervan overtuigd dat een grondige vereenvoudiging mogelijk is, maar te complex ineengedraaid om het te doorgronden.
Sorry, daar geraak ik niet door...

Iemand ?
 
?
Is 't écht zó complex?
In de code zet ik twee workbook-objecten :
- wbServoyDump (het workbook met de ruwe datadump)
- wbTemplate (het workbook met de layouts en de VBA-code)

Eerst wordt gecontroleerd hoeveel bestanden er mogelijk "de ruwe datadump" zijn (ik weet immers niet hoeveel bestanden de gebruiker op dat moment open heeft staan). Als dat er slechts één is, wordt het object direct gezet :
If iAantalMogelijkeServoyDumps = 1 Then
sTekst = Application.Workbooks(lLoper).Name

Als dat niet het geval is, moet de gebruiker het juiste bestand aanwijzen en daarna wordt het object gezet :
Set wbServoyDump = Workbooks(aMogelijkeServoyDumps(lLoper))

Het workbook-object "wbTemplate" wordt één keer gezet : Set wbTemplate = Workbooks("Convert_Servoy.xlsm")
 
Wat een ontzettend ingewikkelde code voor een simpel proces. Met al die variabelen is er geen doorkomen aan wat nu eigenlijk de bedoeling is. Je declareert van alles gebruikt Set en uiteindelijk doe je er niets mee

Gebruik de bestandenkiezer om de bestanden te selecteren waar je wat mee wil doen. Dmv de de publieke variabele ar kan je op alle gekozen bestanden de onnavolgbare bewerkingen uit voeren.
In de module van FrmOpstart
Code:
Private Sub Label2_Click()
  With Application.FileDialog(msoFileDialogOpen)
    .AllowMultiSelect = True
    .InitialFileName = "E:\temp\"
    .Filters.Clear
    .Filters.Add "Excelbestanden", "*.xls*"
      If .Show Then
        For Each it In .SelectedItems
          c00 = c00 & "|" & it
        Next it
        ar = Split(Mid(c00, 2), "|")
      End If
  End With
End Sub

De Sub bewerk wordt dan zoiets

Code:
Sub Bewerk()
  If IsArray(ar) Then
    For j = 0 To UBound(ar)
      With GetObject(ar(j))
        MsgBox "Doe je dingen"
      End With
    Next
   Else
    MsgBox "geen bestanden gekozen"
 End If
End Sub
 

Bijlagen

  • Convert_Servoy.xlsm
    43,5 KB · Weergaven: 24
hmmm... ik ben de eerste om te bekennen dat ik geen die-hard VBA-progger ben, maar.... ik ben toch een béétje op m'n dingetje getrapt.

Ik ga VenA's oplossing proberen en kijken of het probleem van het verliezen van de focus daarmee is opgelost (want daar ging 't uiteindelijk om, niet hoe het bestand gekozen wordt).
Vooralsnog beiden dank voor de moeite!
 
Ik bedoelde niet dat je proces te complex is, wel dat de code die je schrijft ontzettend véél ballast bevat en daardoor onleesbaar wordt.
Je gebruik veel variabelen waar ook meteen het object kon benoemd worden / je maakt veel akties apart die samen kunnen gepakt etc...

Ik zeg niet dat het niet kan werken, maar het is gewoon te complex en teveel code om me er doorheen te graven.
 
Ik heb even de code doorlopen. Die van jouw werkt niet. Alles in het testbestandje wordt als rood aangemerkt en komt ook in jouw foutenlijst. Alle loops zijn zijn zeer omslachtig en door steeds weer tellers aan te passen weet je volgens mij niet meer waar je zelf blijft.

De hele code van + 300 regels is te reduceren tot dit. Alles gestructureerd dmv een paar array's en uitgaande van dat je het formulier gebruikt om de bestanden te selecteren.

Code:
Public ar
Option Explicit
Sub VenA()
  Dim r As Range, c00 As String, c01 As String, j As Long, jj As Long, jjj As Long, y, x, ar1, ar2
  If IsArray(ar) Then 'als er bestanden gekozen zijn via FrmOpstart beter gelijk via het formulier afhandelen.
    c00 = Sheets("ToBe" & Frmopstart.OptionButton1.Value + 2).Name 'Kies de lay_out ToBe1 of ToBe2 bij meerdere bestanden geldt dezelfde lay-out
    ar1 = Sheets(c00).Cells(1).CurrentRegion 'Zet de waarden van ToBe(x) in een array
    
    For j = 0 To UBound(ar) 'Wandel door de gekozen bestanden heen.
      c01 = "" 'Hier komen de fouten in dus even leegmaken voor je aan een volgend bestand begint
      With GetObject(ar(j)).Sheets(1) 'open het gekozen bestand
        With .Range("A1:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
          .AutoFilter 1, "="
          .Offset(1).EntireRow.Delete
          .AutoFilter
        End With 'de eventueel lege rijen zijn nu verwijderd
        
        ar2 = .Cells(1).CurrentRegion.Resize(, 5) 'Zet de inhoud van Sheet1 in een array en reserveer 2 kolommen extra
        x = Application.Index(ar1, 0, 1) 'Zet kolom 1 van ar1 in een aparte array
        For jj = 1 To UBound(ar2) 'Hier begint het vegelijken
          y = Application.Match(ar2(jj, 1), x, 0) 'Zoek de waarde uit het geslecteerde bestand in x
          If IsNumeric(y) Then 'als de waarde gevonden is dan
              ar2(jj, 1) = ar1(y, 2) 'vervang de waarde in kolom 1 door de waarde uit ToBe(x) kolom 2
              ar2(jj, 4) = ar1(y, 4) 'Vul de extra kolom van ar2 met de voorgrondkleur
              ar2(jj, 5) = ar1(y, 3) 'Vul de extra kolom van ar2 met of deze rij verwijderd moet worden.
           Else
            c01 = c01 & Chr(10) & "- " & ar2(jj + 1, 1) 'Als er geen match is vul dan de variabele c01 aan. Deze wordt op het eind gebruikt voor de msgbox
            If r Is Nothing Then Set r = .Cells(jj, 1) Else Set r = Union(r, .Cells(jj, 1)) 'Als er geen match is vul het rangeobject met de cellen die niet gevonden zijn.
          End If
        Next jj 'op naar de volgende regel
        
        If Len(c01) Then 'als er items niet gevonden zijn dan volgt er een berichtje
          MsgBox "De volgende " & UBound(Split(Mid(c01, 2), Chr(10))) + 1 & " Item(s) zijn niet gevonden: " & Chr(10) & c01
        End If
        
        'Vanaf hier de handel een beetje opmaken
        .UsedRange.Clear 'maak het blad leeg
        .Cells(1).Resize(UBound(ar2), 5) = ar2 'zet de waarde van ar2 in A1 en verder
        For jjj = 1 To UBound(ar2) 'even de achtergondkleur opmaken
          If ar2(jjj, 4) <> "" And ar2(jjj, 4) <> 16777215 Then .Cells(jjj, 1).Interior.Color = ar2(jjj, 4) 'om niet elke cel aan te passen alleen de cellen met een afwijkende kleur.
        Next jjj
        
        If Not r Is Nothing Then r.Interior.Color = vbRed 'Als er bepaalde items niet gevonden zijn maak de achtergrond dan rood.
        .Columns.AutoFit 'Maak de kolommen passend
        .Rows("1:3").Insert 'voeg drie rijen in
        .Range("A1:B1") = Array("Datum/Tijd :", Format(Now, "dd-mm-yyyy hh:mm")) 'in de eertse rij
        .Range("A3:E3") = Split("item Omschrijving1 Omschrijving2 Temp1 Temp2") 'in de derde rij een paar kopteksten
        
        With .Cells(3, 1).CurrentRegion 'verwijder de True waarden
          .AutoFilter 5, True
          .Offset(1).EntireRow.Delete
          .AutoFilter
        End With 'Klaar met verwijderen
        
        .Columns("D:E").Delete 'verwijder de 2 temp kolommen
        .ListObjects.Add(xlSrcRange, .Cells(3, 1).CurrentRegion, , xlYes).Name = "TblMooiman" 'Maak van het geheel een tabel
      End With
      Windows(UBound(Split(ar(j), "\"))).Visible = True 'Getobject wil de bestanden wel eens onzichtbaar maken. Kan je hier mee oplossen.
    Next j 'op naar het volgende bestand.
   Else
    MsgBox "geen bestanden gekozen"
 End If
End Sub
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan