Just nu i M3-nätverket
Gå till innehåll

VBA-makro som sparar fil i undermapp till mydocuments.


Rekommendera Poster

Hej, behöver hjälp med VBA-makro som sparar fil i undermapp till mydocuments.

 

Makrot nedan sparar min fil TLR1.xltm som TLR2021-05-17.xlsm i Mina Dokument förutsatt att jag har skrivit 2021-05-17 i cell E7 och att Path är avstängt i makrot.  

Jag vill att makrot istället ska spara filen under mydocuments\Score\TLRapporter som är undermappar som finns upplagda i datorn.

När jag aktiverar Path i makrot borde detta ske men icke…….

Någon som kan hjälpa mig med det här?

/Bosse K

 

 

Sub filename_cellvalue()

'Dim Path As String

Dim filename As String

'Path = "mydocuments" & "Score\TLRapporter\"

filename = "TLR" & Range("E7")

ActiveWorkbook.SaveAs filename:=Path & filename & ".xlsm", FileFormat:=52

ThisWorkbook.Close

End Sub

Länk till inlägg
Dela på andra webbplatser

Är det sökvägen till "My Documents" du vill ha?

 

Ett tips är att skriva ut (eller "alerta") variabeln för att se om det blir en korrekt och komplett sökväg.

Sub filename_cellvalue()
  Dim Path As String
  Dim filename As String
  Dim filepath As String

  Path = "mydocuments" & "Score\TLRapporter\"
  filename = "TLR" & Range("E7") & ".xlsm"
  filepath = Path & filename
  ' TEST: Visa upp sökvägen för att kunna se om den är korrekt
  MsgBox filepath

  ActiveWorkbook.SaveAs filename:=Path & filename & ".xlsm", FileFormat:=52
  ThisWorkbook.Close
End Sub

Du kommer då se att din kod ej ger en korrekt sökväg eftersom "mydocuments" bara är en vanlig sträng.

 

Hur som helst;

Om din arbetsbok (med vba-koden) ligger i My Documents och du vill spara i undermappen \Score\TLRapporter så kan du köra:

Path = ActiveWorkbook.Path & "\Score\TLRapporter\"

 

Du kan såklart även ha en hårdkodad sökväg, men då fungerar makrot bara för dig/en användare:

Path = "C:\Users\[SKRIV_DITT_ANVÄNDARNAMN_HÄR]\Documents\Score\TLRapporter\"

 

Om det behöver vara dynamiskt så måste du slå upp sökvägen till My Documents för den aktiva användaren.

För det finns lite olika sätt med sina för-/nackdelar. 

T.ex. använda miljövariabler:

Path = Environ$("USERPROFILE") & "\Documents\"

eller skapa en funktion som slår upp och sparar sökvägen i en sträng:

Function mydocs () as string
  Set WshShell = CreateObject("WScript.Shell")
  Mydocs= WshShell.SpecialFolders("MyDocuments")
  Set WshShell = Nothing
End function

Fler exempel:

http://learnexcelmacro.com/wp/2012/12/get-special-folder-path-excel-macro/

 

 

Sub filename_cellvalue()
  Dim Path As String
  Dim filename As String
  Dim filepath As String

  Path = Environ$("USERPROFILE") & "\Documents\"
  filename = "TLR" & Range("E7") & ".xlsm"
  filepath = Path & filename

  ActiveWorkbook.SaveAs filepath, FileFormat:=52
  ThisWorkbook.Close
End Sub

 

Länk till inlägg
Dela på andra webbplatser
Ove Söderlund

Bästa metoden är väl att läsa av systemsökvägen till My documents genom WinShell.

Kodexempel:

Function Mydocs () as string
	Set WshShell = CreateObject("WScript.Shell")
	Mydocs= WshShell.SpecialFolders("MyDocuments")
End function

 

Sedan bygger du om din Path och adderar sub-folders, glöm inte att du behöver \-separatorn mellan strängen Mydocs och den undermapp du vill använda.

Länk till inlägg
Dela på andra webbplatser
7 minuter sedan, skrev Ove Söderlund:

Bästa metoden är väl att läsa av systemsökvägen till My documents genom WinShell.

 

Är det snabbare/säkrare än Environ$("USERPROFILE") & "\Documents\" i mitt inlägg ovan?

Länk till inlägg
Dela på andra webbplatser
Ove Söderlund
14 minuter sedan, skrev Cluster:

 

Är det snabbare/säkrare än Environ$("USERPROFILE") & "\Documents\" i mitt inlägg ovan?

I de allra flesta lägen kommer du att få samma resultat oavsett metod som väljs. Det som kan bli ett problem är om en användare ändrar en miljövariabel och att då Environ$ inte ger det resultat som önskas.

Lite sökning på nätet ger vid handen att det finns de som har problem med Environ$ i olika situationer.

 

 

Länk till inlägg
Dela på andra webbplatser

Hej och tack Cluster & Ove Söderlund för era svar.

Har testat Environ$ och inser nu att det inte är mydocuments som är aktuellt.

 

Det jag försöker göra är att spara min xltm-fil i Den här datorn\Documents\Score\TLRapporter som en .xlsm -fil 

Det kommer att vara olika användare på samma dator så filen ska inte sparas under olika användarnamn.

Min xltm-fil finns i Den här datorn\Documents\Score

Alla filer i denna mapp är kopplade till OneDrive. Är det där jag måste spara?

Det är dock inte säkert att de som ska använda filen är uppkopplade mot OneDrive.

 

Kan jag med ledning av ovanstående få hjälp med att modifiera sökvägen i Clusters makro nedan skulle jag vara tacksam

 

Sub filename_cellvalue()
  Dim Path As String
  Dim filename As String
  Dim filepath As String

  Path = Environ$("USERPROFILE") & "\Documents\"
  filename = "TLR" & Range("E7") & ".xlsm"
  filepath = Path & filename

  ActiveWorkbook.SaveAs filepath, FileFormat:=52
  ThisWorkbook.Close
End Sub

 

Länk till inlägg
Dela på andra webbplatser

Nu verkar det fungera som jag tänkt mig. Så här blev slutresultatet.

 

Sub filename_cellvalue()
Dim Path As String
Dim filename As String
Dim filepath As String

Path = ActiveWorkbook.Path & "\TLRapporter\"
filename = "TLR" & Range("E7") & ".xlsm"
filepath = Path & filename

ActiveWorkbook.SaveAs filepath, FileFormat:=52
ThisWorkbook.Close
End Sub

 

ActiveWorkbook.Path var det som gjorde lösningen.

 

Stort tack Cluster & Ove Söderlund

/ Bosse K

Länk till inlägg
Dela på andra webbplatser

Exakt vad är då den korrekta sökvägen?

 

Windows-mappen "Documents" är normalt användarspecifik så jag förstår inte riktigt hur du tänkt att den ska läggas där men ändå finnas tillgänglig för olika användare.

Länk till inlägg
Dela på andra webbplatser

Din fråga är berättigad.  När jag nu kör makrot ovan blir det stopp. Det fungerade förut, varför vet jag inte. Det fungerar inte nu. Så jag behöver fortfarande hjälp!  / Bosse K

Länk till inlägg
Dela på andra webbplatser

En notering utan att svara på frågan direkt med

 Environ$("USERPROFILE") & "\Documents\"

 

skiter sig om man har sina dokument sparade i OneDrive.

Set WshShell = CreateObject("WScript.Shell")
Mydocs = WshShell.SpecialFolders("MyDocuments")

ger däremot en korrekt sökväg.

 

Sökvägar i office, exempel ThisWorkbook.Path blir även de konstiga om i OneDrive

https://d.docs.live.net/e0802136d47b5502/Skrivbord/excel

är resultatet jag får på nuvarande sökväg på min fil så den bör man akta sig för om användarna kan tänkas spegla sina filer mot OneDrive.

Länk till inlägg
Dela på andra webbplatser

Tack Monshi för din information. Jag fick en liknande konstig sökväg då jag experimenterade med olika makrovarianter så jag kan därmed konstatera att Environ$ inte bör användas. Hoppas nu på en specificerad lösning från Cluster som bygger på 

Set WshShell = CreateObject("WScript.Shell")
Mydocs = WshShell.SpecialFolders("MyDocuments")
Länk till inlägg
Dela på andra webbplatser

Men du har fortfarande inte förklarat hur du tänkt dig med fler användare.

Om du tänker dig att filen ska sparas (i en undermapp till) My Documents så är det ju enbart för en användare medan andra användare ej har tillgång till den. 

 

Du måste först bestämma hur du vill hantera detta, sen välja plats och först därefter skapa kod som sparar på den platsen.

Länk till inlägg
Dela på andra webbplatser

Hänvisar till mitt Word-dokument ovan och första delen där jag kör mitt originalmakro.

Då sparas filen i Den här datorn\Dokument

Vill att den istället sparas i Den här datorn\ Dokument\Score\TLRapporter 

 

Bortse från flera användare.

 

Originalfilen med makrot .xltm är en mall som installeras i Den här datorn\Dokument\Score

 

 

Länk till inlägg
Dela på andra webbplatser
Postad (redigerade)

Ok, men då borde det väl inte vara mer komplicerat än att sätta samman de delar som vi gått igenom ovan. 

Typ:

Sub filename_cellvalue()
  Dim WshShell As Object
  Dim myDocs As String
  Dim path As String
  Dim filename As String
  Dim filepath As String
  
  Set WshShell = CreateObject("WScript.Shell")
  myDocs = WshShell.SpecialFolders("MyDocuments")
  Set WshShell = Nothing  

  path = myDocs & "\Score\TLRapporter\"
  filename = "TLR" & Range("E7") & ".xlsm"
  filepath = path & filename

  ActiveWorkbook.SaveAs filepath, FileFormat:=52
  ThisWorkbook.Close
End Sub

 

Redigerad av Cluster
Fixat slarvfel i koden
Länk till inlägg
Dela på andra webbplatser

Tack Cluster, det funkade perfekt! Hade väl kanske kunnat sy ihop det själv med ledning av ovanstående, men när jag hade chansen att få proffshjälp, ville jag ta den. Hur som helst var det lärorikt att få ta del av era olika förslag till lösningar och jag vill passa på att tacka alla inblandade för ert engagemang. / Bosse K

  • Gilla 1
Länk till inlägg
Dela på andra webbplatser
  • 2 veckor senare...

Jag skrev att det fungerade perfekt och det gjorde det så länge jag kör makrot i min egen dator.

När jag installerade programmet och makrot i en annan dator så funkar det inte längre.

Får följande felmeddelande. Körfel 1004. Det går inte att komma åt filen C:\Users\Användarnamn\Documents\Score\TL-Rapporter\66CEA920.

Vore mycket tacksam om Cluster kan bidra med en lösning

Länk till inlägg
Dela på andra webbplatser

Det gick mycket bättre när jag hade skapat mappen TL-Rapporter i den andra datorn! Mycket att tänka på men problemet löst!!

Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu


×
×
  • Skapa nytt...