Automatisch opslaan in juiste map

Status
Niet open voor verdere reacties.

kees2612

Gebruiker
Lid geworden
23 jan 2014
Berichten
8
Ik ben een amateur VBA gerbuiker en heb voor mijn werk een formulier in elkaar gesleuteld waarin heel veel is geautomatiseerd.
Omdat in eerste instantie mijn document nog wel eens werd overschreven met een ingevuld formulier heb ik ook het opslaan geautomatiseerd.
Hierdoor krijgt het bestand na openen en invullen van twee userforms meteen een naam gebaseerd op info uit de userforms.

Wij werken met projecten en op het netwerk is voor ieder project een map aangemaakt waarvan de naam begint met een 9-cijferig projectnummer met daarna de projectnaam.

Nu zou ik graag willen dat het ingevulde formulier wordt opgeslagen in de juiste projectmap.
Is er een manier waarop de juiste map kan worden geselecteerd op basis van de eerste negen karakters (cijfers van het projectnummer)?
Het projectnummer wordt ingevuld in het tweede userform en is op te roepen met tekst1.Value

Het stukje code dat zorgt voor o.a. het opslaan met de juiste documentnaam staat hieronder;

Private Sub CommandButton2_Click()
st = Split("|projectnummer|projectnaam|opdrachtgever|projectcoordinator|aanvullend|datum2|datum3|datum4|datum5|datum6|datum7|rve|fase|", "|")
For j = 1 To 13
c0 = Me.Controls("tekst" & j).Value
ActiveDocument.Variables(st(j)) = IIf(c0 = "", " ", c0)
Next

UserForm2.Hide
UserForm1.Hide

With ActiveDocument
.Fields.Update
End With

Dim StrPath As String
StrPath = "P:\B&O\OHW\ORDERS B&O\~WVB formulieren\"
ActiveDocument.SaveAs FileName:=StrPath & tekst1.Value & " " & tekst2.Value & " " & Format(Now(), "YYYYMMDD")

End Sub
 
Laatst bewerkt:
Eerste 9 posities van het projectnummer:
Left(Text2.Value, 9)
 
Nice

Hey Edmoor,

Bedankt, dit is al een goed begin.
Nu ben ik al weer een tijdje aan het spelen met deze verwijzing maar krijg het nog niet voor elkaar.
Zou jij eens naar de StrPath regel willen kijken en eventueel aanpassen zodat de juiste map gevonden wordt?
Zou wel fantastisch zijn.
 
Als je op ed wilt wachten is dat prima, maar zou je voor de rest die meeleest willen uitleggen wat je bedoelt met
... eventueel aanpassen zodat de juiste map gevonden wordt?
 
Ed zit midden in een verhuizing dus voorlopig even geen tijd helaas.
 
Dan hoop ik maar dat TS zich wil laten helpen door het 2e garnituur :). Lijkt er nog niet op...
 
Yooooh, istie weer...

Hee hallo Octafish en iedere andere lezer voor de zekerheid :-)

Ik heb een document gemaakt die we bij de voorbereiding van een klus (project) altijd invullen zodat de monteurs alle basisinformatie overzichtelijk en uniform meekrijgen.
Ieder project heeft op het netwerk op een vaste locatie een eigen map.
Deze map begint altijd met het projectnummer van 9 cijfers gevolgd door een korte omschrijving van het werk.

Ik wil graag dat het document automatisch wordt opgeslagen in de betreffende projectmap.
Daarvoor moet ik dus bij de SaveAs opdracht een pad creëren met op het einde de betreffende projectmap.

In het formulier wordt het projectnummer ingevuld en is terug te halen met tekst1.Value

Met de huidige code komen alle ingevulde formulieren in de map ~WVB formulieren en dat wil ik ombouwen naar de projectmap.

Dus als ik een formulier invul voor project 100024111 dan moet deze opgeslagen worden in de map P:\B&O\OHW\ORDERS B&O\100024111 vervangen tandwielkast\

Hoop dat ik zo duidelijk ben en anders hoor ik het graag!
 
Je gebruikt veel tekst en slaagt er dan ook nog in om niet helemaal antwoord te geven op mijn vraag :). Maar ik heb een licht vermoeden gekregen:
Daarvoor moet ik dus bij de SaveAs opdracht een pad creëren met op het einde de betreffende projectmap.
Ik denk nu namelijk dat je pad nog niet bestaat, en dat je dus met SaveAs tegen het probleem aanloopt dat je het document pas kunt opslaan als de map is aangemaakt. En dat je dat proces graag wilt automatiseren. Maar corrigeer me met alle genoegen als ik er naast zit :)
 
iets korter dan :-)

Oké, in korte stappen

Er bestaat een projectmap voor ieder project.
Bijvoorbeeld: P:\B&O\OHW\ORDERS B&O\100024111 vervangen tandwielkast

Ik wil het document automatisch laten opslaan in deze map maar de macro moet de map vinden aan de hand van het nummer 100024111.
 
Die code heb je al gekregen:
Code:
StrPath = "P:\B&O\OHW\ORDERS B&O\"
ActiveDocument.SaveAs FileName:=StrPath & Left(tekst1.Value,9) & " " & tekst2.Value & " " & Format(Date(), "YYYYMMDD")
 
Klopt, die code had ik al van Ed.

Maar hoe ik deze code ook in mijn pad invoegde, het ging niet werken.
Ik heb jouw regel gekopieerd in mijn macro en bij toeval het volgende ontdekt.

Ik had voor proef een extra map aangemaakt; P:\B&O\OHW\ORDERS B&O\100024111
maar de oorspronkelijke map is; P:\B&O\OHW\ORDERS B&O\100024111 vervangen tandwielkast

De macro kan wel het bestand opslaan in de eerste map maar haal ik die weg dan vind hij de map "100024111 vervangen tandwielkast" niet.

Fout 5152 tijdens uitvoering

Dit is een ongeldige bestandsnaam.
Doe een van de volgende dingen:
* Controleer of het pad juist is opgegeven.
* Selecteer een bestand uit de lijst met bestanden en mappen.

onderstaande regel laat het bestand opslaan in de map P:\B&O\OHW\ORDERS B&O
ActiveDocument.SaveAs FileName:=StrPath & Left(tekst1.Value, 9) & " " & tekst2.Value & " " & Format(Date, "YYYYMMDD") & ".dotm"

Klopt denk ik dan want er mist nog een backslash..

Onderstaande regel geeft foutmelding als hierboven:
ActiveDocument.SaveAs FileName:=StrPath & Left(tekst1.Value, 9) & "\" & " " & tekst2.Value & " " & Format(Date, "YYYYMMDD") & ".dotm"
 
Laatst bewerkt:
Tussendoor even het verzoek of je code wilt opmaken met de CODE knop, want dat is toch een stuk leesbaarder :).
Ik snap niet waarom je een spatie achter de backslash zet:
Code:
StrPath = "P:\B&O\OHW\ORDERS B&O\"
ActiveDocument.SaveAs FileName:=StrPath & Left(tekst1.Value,9) & "\" & tekst2.Value & " " & Format(Date(), "YYYYMMDD")
Overigens is dit een heel ander concept dan opslaan in de map:
P:\B&O\OHW\ORDERS B&O\100024111 vervangen tandwielkast\.
 
Hmmm, die spatie staat daar niet goed omdat er een deel is vergeten/weggevallen.
hieronder vind je wat ik eigenlijk bedoelde:
Code:
        StrPath = "P:\B&O\OHW\ORDERS B&O\"
        ActiveDocument.SaveAs FileName:=StrPath & Left(tekst1.Value, 9) & "\" & tekst1.Value & " " & tekst2.Value & " " & Format(Date, "YYYYMMDD") & ".dotm"

Maar begrijp ik nu dat ik nu niet op de goede weg ben?
 
Laatst bewerkt:
Ik begrijp nog steeds niet wat je nu eigenlijk wilt. Je vaste pad is geen probleem, dat werkt wel. Maar ik snap je vervolg paden niet. En dat baseer ik dan op:
Ik had voor proef een extra map aangemaakt; P:\B&O\OHW\ORDERS B&O\100024111
maar de oorspronkelijke map is: P:\B&O\OHW\ORDERS B&O\100024111 vervangen tandwielkast
In de map <P:\B&O\OHW\ORDERS B&O\100024111 vervangen tandwielkast> mis ik het datumdeel dat je in je code genereert met Format(Date, "YYYYMMDD").
Ik zou de mapstructuur zo verwachten:

<P:\B&O\OHW\ORDERS B&O\100024111\vervangen tandwielkast>
<P:\B&O\OHW\ORDERS B&O\100024111\vervangen rolschoofnippel>
<P:\B&O\OHW\ORDERS B&O\100024111\monteren hurklangsfliebel>
etc.

Dus één map voor het project, en submappen daaronder.
Jouw opzet kan natuurlijk ook, dan krijg je dit:
<P:\B&O\OHW\ORDERS B&O\100024111 vervangen tandwielkast>
<P:\B&O\OHW\ORDERS B&O\100024111 vervangen rolschoofnippel>
<P:\B&O\OHW\ORDERS B&O\100024111 monteren hurklangsfliebel>

Maar dat lijkt mij een stuk lastiger omdat je dan niet zo makkelijk meer alle documenten per project uit elkaar kunt halen.
Je laatste bericht duidt nu overigens wel op de projectmap structuur:
Code:
    ActiveDocument.SaveAs FileName:=StrPath & Left(tekst1.Value, 9) & "\" & tekst1.Value & " " & tekst2.Value & " " & Format(Date, "YYYYMMDD") & ".dotm"

Dus laten we er vanuit gaan dat de projectmap uit 9 cijfers bestaat, die je met Left(tekst1.Value, 9) uit tekst1 haalt. En dat tekst2 dan de tekst "vervangen tandwielkast" bevat.
Dan is de vraag: bestaat map <100024111> al, of moet die nog worden aangemaakt? Want een document opslaan in een bestaande map is uiteraard geen probleem, dat kun je prima doen met SaveAs. Al vraag ik mij wel af waarom je de documenten opslaat als sjabloon met macro...
Hierdoor krijgt het bestand na openen en invullen van twee userforms meteen een naam gebaseerd op info uit de userforms.
...
Nu zou ik graag willen dat het ingevulde formulier wordt opgeslagen in de juiste projectmap.
Een ingevuld formulier is wellicht gebaseerd op een sjabloon, maar van dat ingevulde formulier ga je natuurlijk niet een nieuw sjabloon maken. Dus ik zou & ".dotm" vervangen door & ".docx".
 
Het is toch gelukt!

Na heeeeel lang zoeken in jullie database stuite ik op een item waarbij iemand m.b.v. een deel van de directorynaam de directory in de verkenner wilde openen.
Ik zag jouw naam daar ook langs komen :-)

De code is geworden als hieronder:
Code:
MyPath = "P:\B&O\OHW\ORDERS B&O\"
MyName = Dir(MyPath, vbDirectory)

Do While MyName <> ""
    If MyName <> "." And MyName <> ".." Then
        If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory And Left(MyName, 9) = tekst1.Value Then
        ActiveDocument.SaveAs FileName:=MyPath & MyName & "\" & tekst1.Value & " " & tekst2.Value & " " & Format(Date, "YYYYMMDD") & ".docx"
        End If
    End If
    
        MyName = Dir
Loop

En dit doet precies wat ik graag wil.
Aan de hand van het projectnummer (tekst1.Value) vind het de map die hiermee begint.
bijvoorbeeld:
projectnummer is 100024111
het bestand wordt opgeslagen in P:\B&O\OHW\ORDERS B&O\100024111 vervangen tandwielkast
Het projectnummer is namelijk uniek en de tekst er achter volkomen onvoorspelbaar.

Bedankt voor jullie tijd, inzet en hulp!
 
Volgens mij een nodeloos ingewikkelde constructie, want je geeft steeds aan dat de map al bestaat. Er is dus weinig noodzaak om te controleren of hij bestaat. Hooguit wil je dat doen als de map niet bestaat, en dan wil je hem eerst aanmaken. Maar dát mis ik dan weer in je huidige code...
 
Nee, wat het doet is alle mappen na lopen tot hij de map vindt die begint met het ingegeven projectnummer. Eens gevonden, slaat het mijn document op in deze map.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan