• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Knop alleen zichtbaar terwijl macro runt (met For Each) + voorrang

Status
Niet open voor verdere reacties.

MarijeO

Gebruiker
Lid geworden
7 mrt 2011
Berichten
17
Allen,

Ik heb een totaalsheet waar de data van meerdere andere werkboeken in wordt geïmporteerd. Dit gebeurd door middel van een macro met een For Each statement.

Dit werkt prima.
Alleen kan het zijn dat de macro er lang over doet. Dus ik wil een melding laten zien in de tussentijd. Ik dacht dit op te lossen met een knop (zonder achterliggende macro) die ik zichtbaar maak aan het begin van de macro en weer verberg aan het einde. De knop staat vooraf goed gepositioneerd op de sheet.

Wanneer ik de volgende statement met True / False gebruik, gaat dit goed als ik ALLEEN die actie wil uitvoeren.
Code:
ActiveSheet.Shapes("Button 1").Visible = True
ActiveSheet.Shapes("Button 1").Visible = False

Wanneer ik de uit te voeren macro ertussen plaats gaat het goed bij de 'simpele' opdrachten, zoals een naam in een cel plaatsen.
ECHTER, wanneer ik een For Each statement in de macro zet, dan voert hij eerst deze For Each uit, en daarna schakelt hij de knop (mijn melding) aan en uit.
(trouwens, als ik via F8 de macro naloop, dan gaat het wel goed! Maar dus niet als je het in één keer afspeelt...)

Waarom krijgt de For Each voorrang terwijl deze chronologisch later in de macro voorkomt?

Omdat ik er een voorbeeld bij wilde plaatsen en ik niet de echte data mag publiceren, heb ik een test bestand gebouwd. Let dus aub niet op het nut van wat hij doet, want dat is er niet.
Maar doordat in mijn test de verwerktijd wel snel is, gebeurd alles in een flits.
Aangezien ik de volgorde van uitvoeren wilde zien, dacht ik een messagebox in te voeren, zodat ik steeds op OK moest klikken om naar de volgende actie in For Each te gaan. Dat zou zorgen voor een pauze, waardoor ik kon checken of de melding eerst verscheen.
Nu blijkt dat eerst 10x de messagebox wordt uitgevoerd en daarna de For Each waardoor de waarde in een flits worden geplaatst. Wanneer de melding plaatsvind kan ik nog steeds niet zien.

Waarom krijgt de msgbox binnen de For Each voorrang op de andere actie binnen dezelfde For Each?

Helaas mag ik geen voorbeeld uploaden, maar ik kan wel de macro posten.
Het gaat om 1 tabblad (buttons), waar de melding een vlak is ter grootte van cellen G3-J12, en de data in kolommen L1-P1 en L4-L13 komt.

Code:
Sub Import()

ActiveSheet.Shapes("Button 1").Visible = True

Application.ScreenUpdating = False

'Verwijderen van de huidige data.
    Columns("L:P").Select
    Selection.Delete Shift:=xlToLeft
    Range("L1").Select


'Invoegen van de kolomkoppen en opmaak.
    Range("L1") = "Kop1"
    Range("M1") = "Kop2"
    Range("N1") = "Kop3"
    Range("O1") = "Kop4"
    Range("P1") = "Kop5"

    Rows("1:1").Font.Bold = True
    Columns("L:P").ColumnWidth = 14

    Range("L3").Select

'Overzetten van data.
    Dim gebied() As Variant
    Dim cijfer As Variant
    Dim teller As Long

    gebied = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    teller = 1

    For Each cijfer In gebied
        ActiveCell.Offset(teller, 0) = cijfer
        MsgBox "volgende cijfer?"
        teller = teller + 1
    Next cijfer

Application.ScreenUpdating = True

ActiveSheet.Shapes("Button 1").Visible = False

End Sub


Hopelijk kan iemand mij helpen?
Bij voorbaat dank!
Marije
 
Laatst bewerkt:
Aanvulling:
Zelfs als ik 3 aparte subs maak en die in 1 macro uitvoer, dan nog voert hij eerst de import uit en is de melding een flits....

Sub Uitvoeren()
Application.Run "MeldingAan"
Application.Run "Import"
Application.Run "MeldingUit"
End Sub
 
Geef uw button een andere naam (of de default)

Code:
Sub Import()

ActiveSheet.[COLOR="red"][B]CommandButton1[/B][/COLOR].Visible = True

Application.ScreenUpdating = False

'Verwijderen van de huidige data.
    Columns("L:P").Select
    Selection.Delete Shift:=xlToLeft
    Range("L1").Select


'Invoegen van de kolomkoppen en opmaak.
    Range("L1") = "Kop1"
    Range("M1") = "Kop2"
    Range("N1") = "Kop3"
    Range("O1") = "Kop4"
    Range("P1") = "Kop5"

    Rows("1:1").Font.Bold = True
    Columns("L:P").ColumnWidth = 14

    Range("L3").Select

'Overzetten van data.
    Dim gebied() As Variant
    Dim cijfer As Variant
    Dim teller As Long

    gebied = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    teller = 1

    For Each cijfer In gebied
        ActiveCell.Offset(teller, 0) = cijfer
        MsgBox "volgende cijfer?"
        teller = teller + 1
    Next cijfer

Application.ScreenUpdating = True

ActiveSheet.[B][COLOR="red"]CommandButton1[/COLOR][/B].Visible = False

End Sub

Succes, Cobbe
 
Bedankt voor de snelle reactie!

Ik heb de code letterlijk veranderd, maar dan geeft VBA een foutmelding.
Moet ik ook nog iets veranderen in de eigenschappen van de button zelf?
Zo ja, hoe doe ik dat?
 
Als je de Button getekend hebt uit de werkbalk Werkset Besturingselementen moet dit werken.
Heb wel nog een test tussengevoegd om de knop eerst zeker te verbergen bij het begin van de macro. Dit kan weggelaten worden als je de knop eerst verbergt.

Succes, Cobbe
 

Bijlagen

Ok, dat is de verwarring. Ik heb een knop gemaakt vanuit de werkbalk Formulieren.
De opdrachtknop via Besturingselementen kan niet worden gebruikt op een grafiekblad. Dat had ik erbij moeten vermelden; mijn excuses.

Heeft u ook een opdracht voor deze knop?


Aanvulling:
Wanneer ik de waarschuwing erin verwerk met Shapes("Button 1"), dan nog speelt hij eerst 10x de msgbox en daarna de rest....
 
Laatst bewerkt:
maak er een userform van, dan kan je hem overal aanroepen, of maak gebruik van de statusbar om daar info naar toe te schrijven.
 
Waarom zou je geen button uit de werkset... kunnen gebruiken in een grafiekblad?

Zie voorbeeld.
Shape is een teken-commando en wordt pas op het einde uitgevoerd.

Cobbe
 

Bijlagen

@ Cow18:
Userform gemaakt. Maar deze verwacht van mij een actie (eerst OK of sluiten) voordat hij de rest van de macro afspeelt.
Kan het ook dat hij alleen de form laat zien terwijl de macro wordt afgespeeld en daarna automatisch verdwijnt?


@ Cobbe:
Ik bedoel een tabblad waar alleen de grafiek op staat, gebaseerd op een draaitabel, waarbij je ook geen cellen ziet/kunt aanklikken oid. Ik zie op dat tabblad alleen een grafiek en daaromheen grijs. Dus normaal heet het een werkblad en dit is een grafiekblad (tenminste, zo heet het als je een nieuwe wil invoegen).
Ik heb een pivot waar ik een flexibele grafiek op wil baseren. Ik heb door excel automatisch een draaigrafiek laten aanmaken en dat heeft hij neergezet op zo'n grafiekblad.
Zou ik mijn draaigrafiek anders ook op een 'normale' werkblad kunnen overzetten?

Als shapes altijd op het laatste worden uitgevoerd, dan moet ik sowieso een andere optie bedenken.
 
Laatst bewerkt:
maak juist dat er een userform1 is
nu mag je van overal die macro opstarten
je ziet tellen in de statusblak en in de userform
Code:
Sub Import()
  With UserForm1
    .Caption = "even geduld"
    .Show vbModeless
  End With

  Application.ScreenUpdating = False
  With Sheets("blad1")
    'Verwijderen van de huidige data.
    .Columns("L:P").Delete Shift:=xlToLeft

    'Invoegen van de kolomkoppen en opmaak.
    .Range("L1") = "Kop1"
    .Range("M1") = "Kop2"
    .Range("N1") = "Kop3"
    .Range("O1") = "Kop4"
    .Range("P1") = "Kop5"

    .Rows("1:1").Font.Bold = True
    .Columns("L:P").ColumnWidth = 14

    'Overzetten van data.
    Dim gebied() As Variant
    Dim cijfer As Variant
    Dim teller As Long

    gebied = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    teller = 1

    For cijfer = 1 To 10000 ' Each cijfer In gebied
      .Range("L3").Offset(teller, 0) = cijfer
      Application.StatusBar = Space(20) & "volgende cijfer " & cijfer
      UserForm1.Caption = "even geduld " & cijfer
      teller = teller + 1
    Next cijfer

    Application.ScreenUpdating = True
    Unload UserForm1
    Application.StatusBar = ""
  End With
End Sub
 
Het werkt perfect!
Zowel op het testbestand, als geïntegreerd in het eigenlijke bestand.

Heel hartelijk bedankt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan