[VBA] Inhoud sjablonendirectory uitlezen

Pagina: 1
Acties:

  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Voor mijn werkgever hebben we inmiddels verschillende dingen geautomatiseerd, om de geautomatiseerde processen efficiënter te laten werken heeft Microsoft Word er een extra menu-optie bij gekregen. Naast [Bestand], [Bewerken] etc. hebben we nu ook een knop met onze bedrijfsnaam.

Het maken van een knop en een statisch menu is niet zo moeilijk, maar voor het onderhoud zou het makkelijker zijn als het menu dynamisch wordt. Dit willen wij bereiken door de bestandsnamen uit te lezen en deze in het menu te stoppen. Het maken van een menu is het probleem niet, het probleem zit hem in het uit kunnen lezen van een directory.

Is het mogelijk en hoe kan ik met Visual Basic de inhoud van een directory uitlezen? Voor zover ik heb kunnen vinden bevat de Visual Basic-help geen informatie hierover...

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23-03 10:29

NetForce1

(inspiratie == 0) -> true

als je op http://msdn.microsoft.com naar filesystemobject zoekt kom je denk ik al een heel eind verder

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Even een klein schopje, het is immers hetzelfde onderwerp.

Het inleven van de direcory gaat nu perfect, en wel met de volgende code;

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'ga in de sjablonenmap op zoek naar bestanden voor het menu
Set fs = Application.FileSearch
With fs
    
    'defineer zoekmap
    .LookIn = "G:\Sjablonen"
    'defineer filemask
    .FileName = "*.dot"
    'Zoeken in submappen?
    .SearchSubFolders = False
    
    'voer zoekactie uit en sorteer alfabetisch
    If .Execute(SortBy:=msoSortByFileName, _
    SortOrder:=msoSortOrderAscending) > 0 Then


Het script is nu zover dat de gegevens in het menu worden gezet. Het toevoegen van een menu-item ziet er als volgt uit:

code:
1
2
3
4
5
6
            With mnuSubmenu
              .Caption = Naam
              .Style = msoButtonCaption
              .Tag = TagID
              .OnAction = MaakVanTemplate(BestPadNaam)
            End With


Bij de OnAction is een functie gedefineerd, bij het klikken op het menu-item moet hij een nieuw Word-document maken op basis van een template (.dot). Hiervoor is kleine functie geschreven:

code:
1
2
3
4
Function MaakVanTemplate(BestPadNaam)
    Documents.Add Template:=BestPadNaam, NewTemplate:= _
        False, DocumentType:=0
End Function


De functie werkt perfect, daar is niets mis mee. Maar het script voert op de één of andere manier bij het aanmaken van het menu-item automatisch de functie MaakVanTemplate() uit. Mijn collega en ik komen er ook niet uit, we hebben al van alles geprobeerd.

Het niet gebruiken van een functie voor het maken van een nieuw bestand op basis van een template heeft ook geen zin.

Mijn vraag: waarom voert VBA MaakVanTemplate al uit bij de initialisatie?

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Als ik een sub aanroep met de OnAction wordt deze wél pas uitgevoerd bij het klikken op het object. Maar goed, een sub kan ik geen parameters meegeven...

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Property OnAction As String
Met deze eigenschap wordt de naam als resultaat gegeven of ingesteld van de Visual Basic-macro die wordt uitgevoerd als de gebruiker op een besturingselement op een opdrachtbalk klikt of de waarde ervan wijzigt. String, Lezen-schrijven.
code:
1
 .OnAction = MaakVanTemplate(BestPadNaam)
Wat jij doet is onaction instellen op het resultaat van de functie maakvantemplate(). Resultaat: de functie wordt aangeroepen en de knop zelf doet niets.

Maak een macro zonder parameters en lees van de actieve knop de tag/parameter uit. (google eens op actioncontrol :) )

[ Voor 87% gewijzigd door Lustucru op 06-07-2004 01:25 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Niesje schreef op 06 juli 2004 @ 00:19:
[...]


Wat jij doet is onaction instellen op het resultaat van de functie maakvantemplate(). Resultaat: de functie wordt aangeroepen en de knop zelf doet niets.

Maak een macro zonder parameters en lees van de actieve knop de tag/parameter uit. (google eens op actioncontrol :) )
Hoe bedoel je dat? een macro zonder parameters? (Ben nog maar een vba beginner ;))

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Fruitdanmaar ;)
code:
1
2
    .onaction="MaakBestand"
    .parameter=BestPadNaam


code:
1
2
3
sub MaakBestand
      call MaakVanTemplate(commandbars.actioncontrol.parameter)
end sub


zelf even checks en foutafhandeling toevoegen...

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Hmm, ik snap de bedoeling maar krijg het niet aan het werk. Mijn huidige source:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
                'maak nieuw submenu aan
                Set zz = Application.CommandBars("Menu Bar").Controls("&Salix")
        
                With zz.Controls
                 Set mnuSubmenu = .Add(Type:=msoControlButton)
                End With
                
                'defineer info submenu
                With mnuSubmenu
                    .Caption = Naam
                    .Style = msoButtonCaption
                    .Tag = TagID
                    .OnAction = "TestHet"
                    .Parameter = BestPadNaam
                   ' .OnAction = MaakVanTemplate(BestPadNaam)
                End With
                
                'gooi dingen leeg
                Set z = Nothing
                Set zz = Nothing

            Next i
            Else
                MsgBox "Er zijn geen bestanden gevonden voor het menu. Het menu is mogelijk onvolledig opgebouwd."
            End If
    End With

End Sub

Sub TestHet()
    MsgBox (CommandBars.ActionControl.Parameter)
End Sub

'Function MaakVanTemplate(Bestand)
'   Documents.Add Template:=Bestand, NewTemplate:= _
'        False, DocumentType:=0
'End Function



Op de regel van de MsgBox krijg ik de foutmelding: "Objectvariabele of blokvariabele With is niet ingesteld". Ik krijg de fout niet onderdrukt/opgelost. Het probleem zit hetm dus in het feit dat de ActionControl van de CommandBars de ingevoerde parameter niet terug wil geven.

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

:? Code aangevuld en geplakt en werkt fantastisch. Je bent toch niet zo slim om testhet() buiten het klikken op een menuitem om uit te proberen, wel?

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Niesje schreef op 06 juli 2004 @ 23:22:
:? Code aangevuld en geplakt en werkt fantastisch. Je bent toch niet zo slim om testhet() buiten het klikken op een menuitem om uit te proberen, wel?
Problem solved, stond ergens een punt die er niet hoorde :/

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Nieuw probleem, krijg de fout ook niet ondervangen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
MySettings = GetAllSettings(appname:="MagicMenu", Section:="MenuItems")
  
 
 If MySettings Is Not Leeg Then
        For intSettings = LBound(MySettings, 1) To UBound(MySettings, 1)
             MenuNaam = MySettings(intSettings, 0)
            
                Set MyMenu = CommandBars.FindControl _
                    (Type:=msoControlPopup, Tag:=DelSpaces(MenuNaam))
                 
                 MyMenu.Delete
                 DeleteSetting appname:="MagicMenu", Section:="MenuItems", Key:=MenuNaam
                 
            Next intSettings
End If


Ik kijk dus of een registersleutel bestaat, zo ja moet hij het menu verwijderen, zo nee moet hij niets doen. Maar hij blijft hangen op

code:
1
2
 If MySettings Is Not Leeg Then
        For intSettings = LBound(MySettings, 1) To UBound(MySettings, 1)


Iemand enig idee?

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Verwacht je nu dat ik (wij) hier jouw code gaan debuggen? :( Dan zou het op zijn minst handig zijn als je de foutmelding erbij vermeldt. Meer tips in: P&W Beleid. (aanrader :) )

Anyway als IsLeeg een eigengebreide functie is, dan is Is Not Leeg kwadderiedatch; Is veronderstelt sowieso een object.

[ Voor 6% gewijzigd door Lustucru op 14-07-2004 17:58 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Niesje schreef op 14 juli 2004 @ 17:31:
Verwacht je nu dat ik (wij) hier jouw code gaan debuggen? :( Dan zou het op zijn minst handig zijn als je de foutmelding erbij vermeldt. Meer tips in: P&W Beleid. (aanrader :) )

Anyway als IsLeeg een eigengebreide functie is, dan is Is Not Leeg kwadderiedatch; Is veronderstelt sowieso een object.
Je hebt helemaal gelijk dat een foutmelding wel handig zou zijn, heb het snel gepost vanaf kantoor en was beetje druk :).

Nee, ik verwacht niet van jullie dat jullie mijn code gaan debuggen, in tegendeel zelfs, het zou alleen maar handig zijn als jullie aan zetje in de goede richting konden geven (note: ben nog maar sinds een week of 6 bezig met vba, gemiddeld 4 uur per week, dus echt ervaring heb ik nog niet).

code:
1
 If MySettings Is Not Leeg Then


Geeft als resultaat: object vereist. Beetje vreemd mijn insziens.


Toevoeging: eerst werkte de code wél correct, het lijkt erop dat iets met het register niet lekker loopt.

[ Voor 6% gewijzigd door DynamicDreams op 14-07-2004 18:40 ]

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

DynamicDreams schreef op 14 juli 2004 @ 18:21:
[...]


Je hebt helemaal gelijk dat een foutmelding wel handig zou zijn, heb het snel gepost vanaf kantoor en was beetje druk :).
OK :). En lees je ook de faq's als het wat rustiger wordt? O-)
Nee, ik verwacht niet van jullie dat jullie mijn code gaan debuggen, in tegendeel zelfs, het zou alleen maar handig zijn als jullie aan zetje in de goede richting konden geven (note: ben nog maar sinds een week of 6 bezig met vba, gemiddeld 4 uur per week, dus echt ervaring heb ik nog niet).
24 uur vba is idd niet veel, dus neem eens zo'n leuke pil ter hand. Leer je ook meer dan van kant en klaar antwoorden. >:) Wat je nu vraagt zou je zelf direct zien als je iets wist van verschillende soorten variabelen en voor basic vragen schijnt GOT niet bedoeld te zijn. :)

Debug: wat is mysettings?
wat is Is?
wat is Leeg?
wat betekent dan 'mysettings Is Leeg'? [= Opgaand lichtje]
code:
1
 If MySettings Is Not Leeg Then


Geeft als resultaat: object vereist. Beetje vreemd mijn insziens.
Zie boven. 'Is' is voor objecten wat '=' is voor de overige variabelen. Mysettings is een variant die een array bevat en is dus geen object. Ping en ho.

Tip van de week: in je editor op een sleutelwoord gaan staan en dan op F1 drukken. Er gaat een wereld aan informatie open. Dan vind je meteen allerhande andere functies waarmee je een variabele kunt testen (IsEmpty, IsNumeric, IsNull etc. etc.)
Toevoeging: eerst werkte de code wél correct, het lijkt erop dat iets met het register niet lekker loopt.
Daar geloof ik dus helemaal niets van. Dit kan nooit goed gewerkt hebben. Zodra een array aan mysettings is toegwezen knalt er op 'IS' een foutmelding uit. Het register heeft er iig niets mee van doen. En tot slot: wat is in vredesnaam Leeg? :? voor een ding?

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Niesje schreef op 14 juli 2004 @ 19:46:
[...]

OK :). En lees je ook de faq's als het wat rustiger wordt? O-)
Ik heb op andere fora gezeten waar ik knettergek werd van mensen die faqs niet lazen, ik heb dus de faq van GoT al gelezen en ken de regels, ik weet óók dat verzoeken om debuggen niet gewaardeerd worden. Kan ik ook zéér zeker begrijpen, maar ik vraag om een helpende hand, niet om een stukje debuggen :).
Niesje schreef op 14 juli 2004 @ 19:46:
[...]
24 uur vba is idd niet veel, dus neem eens zo'n leuke pil ter hand. Leer je ook meer dan van kant en klaar antwoorden. >:) Wat je nu vraagt zou je zelf direct zien als je iets wist van verschillende soorten variabelen en voor basic vragen schijnt GOT niet bedoeld te zijn. :)
True, moet ik je inderdaad gelijk in geven :).
Niesje schreef op 14 juli 2004 @ 19:46:
Debug: wat is mysettings?
wat is Is?
wat is Leeg?
wat betekent dan 'mysettings Is Leeg'? [= Opgaand lichtje]
Afbeeldingslocatie: http://www.lbl.gov/friendsofscience/images/berkeley-lamp.jpg ;)
Niesje schreef op 14 juli 2004 @ 19:46:
[...]

Zie boven. 'Is' is voor objecten wat '=' is voor de overige variabelen. Mysettings is een variant die een array bevat en is dus geen object. Ping en ho.
Kijk, hier kan ik wat mee _/-\o_
Niesje schreef op 14 juli 2004 @ 19:46:Tip van de week: in je editor op een sleutelwoord gaan staan en dan op F1 drukken. Er gaat een wereld aan informatie open. Dan vind je meteen allerhande andere functies waarmee je een variabele kunt testen (IsEmpty, IsNumeric, IsNull etc. etc.)
De help-functie weet ik óók te vinden, maar had al van alles geprobeerd en ik bleef iets fout doen :7


Bedankt voor je nuttige tip een paar alinea's terug, daar ga ik zeker verder mee komen :)

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Nu ik de boel aan de gang heb gekregen, wil ik het ook mogelijk maken om met sub-menu-items te werken. De werkwijze is redelijk eenvoudig en de code ziet er makkelijk uit. Het maken van een hoofdmenu, met daaronder een submenu werkt. Maar ik krijg het niet voor elkaar om in het submenu een submenu-item aan te maken.

OK, laat ik de boel even benoemen:
A:= Hoofdmenu-knop
B:= Submenu-knop
C:= Item in submenu

Even een grafische voorstelling ervan zoals Word het zelf al in zich heeft:
Afbeeldingslocatie: http://got.dynamicdreams.nl/einddoel.jpg

Ziet er mooi uit, als ik er nu mijn kunsten op los laat wordt het dit:
Afbeeldingslocatie: http://got.dynamicdreams.nl/foutding.jpg
Zoals je ziet wordt het menu-item in het submenu niet goed opgebouwd. Vreemd, want de code voor het toevoegen van een menu-item aan een submenu is identiek aan het toevoegen van een menu-item aan het hoofdmenu. De settings zijn hetzelfde, je geeft alleen een ander doel op.

code:
1
2
3
4
5
6
7
8
'SUBMENU
With Application.CommandBars("Menu Bar").Controls("Hoofdmenu").Controls
     Set mnuSub = .Add(Type:=msoControlPopup)
End With
With mnuSub
    .Caption = "Sub"
    .Tag = "Subgeval"
End With

Zoals je ziet voeg ik met deze code een submenu toe aan het hoofdmenu (zie attribuut controls). Dit gaat perfect, een tag en caption geef ik ook mee, want die heb ik nodig voor het toe kunnen voegen van een sub-menu-item:

code:
1
2
3
4
5
6
7
8
9
'MENU ITEM IN SUBMENU
With Application.CommandBars("Menu Bar").Controls("Sub").Controls
    Set mnuSubmenu = .Add(Type:=msoControlButton)
End With
With mnuSubmenu
    .Caption = "Menu-item in SUBmenu"
    .Style = msoButtonCaption
    .Tag = "Subsubmenu1"
End With

Zoals ik met de vorige code een submenu aanmaakte, maak ik met deze code een menu-item aan. De vars staan goed ingesteld, de functie is identiek, maar toch pakt VBA het op de een of andere manier niet. Ik heb de complete helpfunctie over commandbars doorgelezen, me rot gezocht op Google maar kan nergens ontdekken wát ik fout doe, want volgens mij doe ik niets fout :s. (Já, ik weet dat jullie hier niet zijn om mij te helpen debuggen, dat hoeft ook niet, maar als iemand kan vertellen wáár het fout gaat zou ik al heel erg geholpen zijn)

[ Voor 4% gewijzigd door DynamicDreams op 16-07-2004 21:21 ]

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS


  • Lister
  • Registratie: September 2001
  • Laatst online: 15-02-2022
Ik heb ff wat getest, maar heb je je foutafhandeling uit staan of zo want volgens mij moet je bij
code:
1
With Application.CommandBars("Menu Bar").Controls("Sub").Controls
een foutmelding krijgen.

Als je een submenu aan je hoofdmenu hangt dan moet je natuurlijk je submenu via je hoofdmenu benaderen en niet direct via de Menu Bar.
Het moet dus zoiets worden:
code:
1
With Application.CommandBars("Menu Bar").Controls("Hoofdmenu").Controls("Sub").Controls

  • DynamicDreams
  • Registratie: Juni 2004
  • Laatst online: 24-04 10:57
Lister schreef op 16 juli 2004 @ 22:20:
Ik heb ff wat getest, maar heb je je foutafhandeling uit staan of zo want volgens mij moet je bij
code:
1
With Application.CommandBars("Menu Bar").Controls("Sub").Controls
een foutmelding krijgen.
Daar kreeg ik inderdaad een fout, had ik eigenlijk wel moeten vermelden natuurlijk :P
Lister schreef op 16 juli 2004 @ 22:20:
Als je een submenu aan je hoofdmenu hangt dan moet je natuurlijk je submenu via je hoofdmenu benaderen en niet direct via de Menu Bar.
Het moet dus zoiets worden:
code:
1
With Application.CommandBars("Menu Bar").Controls("Hoofdmenu").Controls("Sub").Controls
Dit lijkt er meer op, de eerste keer dat ik dit stukje draaide deed hij het goed, nu pakt hij hem weer verkeerd. Ik zal wel iets fout doen, zal morgen onderweg in de auto wel verder proggen, in ieder geval superbedankt :)

12x JA Solar 375 Wp op oost-west met Goodwe GW3600D-NS

Pagina: 1