Opdrachtknop verbergen

Status
Niet open voor verdere reacties.

Henk Benter

Gebruiker
Lid geworden
13 mei 2010
Berichten
158
Met behulp van een opdrachtknop maak ik voor ieder project een bijbehorende directory aan op de C schijf. Dit is per project een eenmalige actie. Nadat deze actie goed is uitgevoerd zou ik graag de knop blijvend willen verbergen voor dit project. Is dit mogelijk m.b.v. VBA?

Reden: In de aangemaakte directory kopieer ik een aantal standaard excel bladen. Wanneer deze bladen worden gevuld en men drukt bij toeval nog eens op de knop aanmaken directory, dan worden de aanwezige documenten overschreven. Dit wil ik voorkomen. Wellicht is er ook een oplossing die controleert of de directory al bestaat en dit op het scherm meldt. Ben benieuwd naar de reactie.
 
Ik doe iets vergelijkbaars, maar zonder knop, en al helemaal zonder ingrijpen van gebruikers, want die maken alleen maar fouten. En je kunt het proces helemaal automatiseren. Zelf doe ik het bij de gebeurtenis <Bij aanwijzen> van het formulier, en daarnaast bij het toevoegen van een project. Mijn code ziet er dan zo uit:
Code:
Private Sub Form_Current()
    If Me.DossierPad_d & "" = "" Then
        .AllowEdits = True
        .DossierPad_d.Value = fPadMaken(Stam_Pad & "\Personen\" & Me.persoon_id & "\" & .DossierID & "\")
        .Dirty = False
        .AllowEdits = False
    Else
End Sub

Code:
Public Function fPadMaken(sFolder As String) As String
On Error GoTo ErrorHandler
Dim sF As String
    sF = GetPathOnly(sFolder)
    If Dir(sF, vbDirectory) = "" Then
      sF = fPadMaken(sF)
      MkDir sF
    End If
    fPadMaken = sFolder
    Exit Function
    
ErrorHandler:
    Exit Function
End Function

Code:
Public Function GetPathOnly(sPath As String) As String
    GetPathOnly = Left(sPath, InStrRev(sPath, "\", Len(sPath)) - 1)
End Function

Die bestanden kun je in dezelfde routine uiteraard simpel mee kopieëren.
 
Dag Octafish,

Jou reactie ben ik gaan vertalen naar mijn toepassing. Ik ben het namelijk helemaal met je eens dat gebruikers alleen maar fouten maken. Zonder dat
ze het in de gaten hebben maakt jou code netjes een directory aan. Perfect. Ik zou dus ook graag mijn knop verlaten. Hetgeen ik omschreef in mijn
bericht is iets wat ook daadwerkelijk zal gebeuren. Men drukt 2maal op de knop en het kwaad is geschied. De structuur van de Directory blijft best wel
overeind, maar het kwaad zorgt er wel voor dat de documenten die reeds verder zijn verrijkt met informatie worden overschreven. Maar goed, even terug
naar jou reactie.

Ik heb jou public functions netjes in een module geplaatst. Hoef ik niet veel aan te wijzigen volgens mij. De andere code heb ik omgebouwd als volgt:

Code:
Private Sub Form_Current()
Const sBron = "C:\Users\pietje\OneDrive\Documenten\" 'Locatie waar de directory moet worden aangemaakt
    If sBron & Me.Projectnummer & " - " & Me.Omschrijving & " " & Me.Plaats & "\" = "" Then 'Als er nog geen directory is aangemaakt dan aanmaken toestaan.
        AllowEdits = True
        DossierPad_d.Value = fPadMaken(sBron & Me.Projectnummer & " - " & Me.Omschrijving & " " & Me.Plaats & "\")
        Dirty = False
        AllowEdits = False
        Else
    End If
End Sub

In jou voorbeeld stonden er puntjes voor allowedits. Hierop kreeg ik een foutmelding en verzoek de puntjes te verwijderen. Heb ik gedaan. Verder een verzoek gehad End If toe te voegen. Ook gedaan. Hierop
ben ik een project gaan toevoegen en ben ik gaan controleren of de directory ook daadwerkelijk was aangemaakt. Ik kreeg geen foutmelding op de bovenstaande code. Helaas, geen directory aangemaakt op
locatie c:\users\pietje\onedrive\documenten\. Ik vermoed dat ik nog iets moet gaan doen. Jou opmerking "en daarnaast bij het toevoegen van een project" begrijp ik niet geheel. Wellicht dat het daar mis
gaat, of, er zit toch nog iets niet goed in de aanpassingen die ik gedaan heb. Al vast dank voor je reactie.
 
Wij werken met kandidaten en dossiers. Als er een nieuwe kandidaat wordt aangemaakt, is er een bronmap nodig voor de algemene documenten. Elk dossier dat aan een kandidaat wordt gehangen, krijgt een eigen map, en die hangen dus onder de kandidaat. Je krijgt dus regelmatig nieuwe extra mappen.
Dat de code even niet werkte, kan wel kloppen; ik had niet alles gekopieerd. De .AllowEdits hoort niet bij Me.DossierPad_d, maar bij Me.; het formulier dus. Ofwel weghalen, ofwel Me ervoor zetten. Persoonlijk zou ik het laatste hebben gedaan zodat je altijd weet op welk deel van het formulier de code wordt uitgevoerd. Deze regel
Code:
    If sBron & Me.Projectnummer & " - " & Me.Omschrijving & " " & Me.Plaats & "\" = "" Then
gaat nooit werken, want je checkt op een lege string, die van zijn levensdagen nooit leeg kan zijn. Om te beginnen is sBron een constante die niet leeg is, daarnaast gebruik je " - " dat dus óók niet leeg is. Wil je checken of een map bestaat, gebruik dan DIR. Maar ik gebruik 'm dus toch al anders, want ik kijk of er in de tabel iets is ingevuld of niet: het veld dus waar het pad wordt opgeslagen. Dat bevat een pad, of niet. En op basis daarvan bepaal je of er een map wordt gemaakt.
 
Hallo Octafish,

Ik heb jou opmerkingen meegenomen in mijn overwegingen. De opdrachtknop is toch blijven bestaan. Ik heb DIR gebruikt in de code. Hiermee doe ik nu de check of de directory al dan niet bestaat. Heb getest en werkt wat mij betreft perfect. Enige minpunt dat ik nu nog heb is het navolgende. Wanneer een gebruiker een al bestaande omschrijving of plaats wijzigt, de directory was al bestaand, dan zal er een nieuwe directory worden aangemaakt naast de bestaande directory. Dit is niet correct. Alleen de naam van de hoofddirectory van het project moet worden aangepast. Wellicht is dit een kleine aanpassing, ik heb hem nog niet.

Oh ja, de complete code in mijn toepassing is als volgt geworden:

Code:
Private Sub Knop70_Click()
Const aBron = "C:\Users\pietje\OneDrive\Standaard Documenten\"
Const sBron = "C:\Users\pietje\OneDrive\Projectdocumenten\"
Dim Pad As String
Dim nPad As String
If Len(dir(sBron & Me.Projectnummer & " - " & Me.Omschrijving & " " & Me.Plaats & "\", vbDirectory)) = 0 Then 'Controle of de directory al bestaat.
    MsgBox ("Deze Directory bestaat nog niet, we gaan deze nu aanmaken. Even geduld s.v.p.."), vbOKOnly
        Pad = sBron & Me.Projectnummer & " - " & Me.Omschrijving & " " & Me.Plaats & "\"
             CreateFolders Pad & "Algemeen\Financieel-Afrekening\"
                  nPad = Pad & "Algemeen\"
                       CreateFolders nPad
                       FileCopy aBron & "Financieel.xlsm", nPad & "Financieel.xlsm"
                  nPad = Pad & "Algemeen\"
                       CreateFolders nPad
                       FileCopy aBron & "Werkbegroting.xlsx", nPad & "Werkbegroting (nu nog leeg).xlsx"
                  nPad = Pad & "Algemeen\"
                       CreateFolders nPad
                       FileCopy aBron & "Projectplanning.xlsm", nPad & "Projectplanning.xlsm"
             CreateFolders Pad & "Algemeen\KAM Formulieren\"
                  nPad = Pad & "Algemeen\KAM Formulieren\"
                       CreateFolders nPad
                       FileCopy aBron & "F-016 - Projectevaluatie.pdf", nPad & "F-016 - Projectevaluatie.pdf"
                       FileCopy aBron & "F-022 - Aanvraag formulier AC-werkplan.pdf", nPad & "F-022 - Aanvraag formulier AC-werkplan.pdf"
                       FileCopy aBron & "F-023 - Opleveringsrapport.pdf", nPad & "F-023 - Opleveringsrapport.pdf"
             CreateFolders Pad & "Algemeen\Klicmelding-Graafmelding\"
             CreateFolders Pad & "Algemeen\Revisiegegevens\"
    MsgBox ("De Directory is aangemaakt."), vbOKOnly
Else
    MsgBox ("Deze Directory bestaat al. Er zal geen nieuwe directory worden aangemaakt."), vbOKOnly
End If
End Sub

Mocht je nog tips hebben. Ik hoor ze graag. Stukje bij beetje begint het kwartje voor wat betreft VBA ook te vallen. Je komt me nog wel eens tegen op helpmij.nl met een vraag. Het kost soms veel tijd om zaken zelf uit te zoeken. Toch is het ook iedere keer weer een overwinning als iets weer lukt. Dank je voor je hulp.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan