01. september 2010 - 16:49Der er
13 kommentarer og 1 løsning
Tjekke med VBA om mappe exsisterer.
Hej!
Jeg har et excelark med en hel masse VBA-kode, og denne kode slutter med og kopierer mit excelark, oprette et dokumentnavn og herefter gemme det ned i en mappe som er oprettet dertil.
Spørgsmål 1: Er der nogen som kan hjælpe med lidt kode som kan tjekke om den mappe som excelarket gemmes i er oprettet/eksisterer på computeren før arket gemmes.
Spørgsmål 2: Hvis excelarket tidligere er gemt anmoder Excel automatisk om den tidligere gemte fil skal overskrives, og hvis der svares ja til dette bliver den overskrevet, men hvis der svares nej eller annuller melder VBA-fejl og den kopierede excelfil er nu på skærmen uden at blive gemt. Er der nogen som f.eks har et forslag til en VBA-fejlbehandler som ved denne fejl kan slette det kopierede excelark.
Den mappe hvor jeg har mit excelark med VBA-koden hedder f.eks. "Projekt", i denne mappe er der oprettet en undermappe f.eks. "Færdigt Projekt" og det er denne mappe som jeg gerne vil have at VBA-koden tjekker om den er oprettet. Håber det gav lidt mening.
Public Function CheckFolderExists(fname As String) As Boolean Dim fs As Object Set fs = CreateObject("Scripting.FileSystemObject") CheckFolderExists = fs.FolderExists(fname) End Function
I min VBA-kode er der en string variabel med navnet sStiTilGem som indeholder stien til mappen J:\ ... \Færdigt Projekt, og det er den sti med mappenavnet "Færdigt Projekt som skal tjekkes om det existerer. Kan du hjælpe mig på vej hvorledes jeg får din funktion til og virke?
Mht. spm. 2 har jeg nok behov for lidt ekstra info. Vil du gerne undgå at den spørger om filen skal overskrives, eller vil du kunne håndtere at man siger nej til det? Og hvad skal den så gøre, hvis man siger nej? Du må også gerne lige angive den kode du bruger til at gemme filen med.
Hej Jeg skal kort forklare hvad mit projekt går ud på. Mit excelark henter en kommasepareret Txt-fil ind når det åbnes, Textfilen formateres og tilrettes, der kan via en Userform slettes kolonner og byttes om på grupperede rækker, og sideopsætning tilrettes. Til slut oprettes der ud fra celler på excelaket et dokumentnavn. Arket kopieres og gemmes nu ned i en dertil opretttet mappe med det nye dokumentnavn, og lukkes herefter. Hele processen kan nu gentages hvis det ønskes, og det er faktisk her det går galt når makroen gemmer det kopierede ark, og opdager at der lige er lagt et tidligere med samme dok.navn, så spørger excel om der skal overskrives, hvis der svares ja er det ok, men hvis der svares nej eller annuller så melder makroen fejl, og der kopierede ark som nu er på skærmen er ikke blevet lukket, og skal derfor slettes.
Herunder kan du lige se den sidste del af koden hvor det går galt, og hvor der evt. skal vare en "fejlbehandler"
If CheckFolderExists(sStiTilGem) = True Then 'MsgBox ("Mappen er oprettet") sStiTilGem = txtStiTilGem Else 'MsgBox ("Mappe er ikke oprettet") sStiTilGem = Application.ActiveWorkbook.Path & "\" & sDokNavn End If
Mulighed 1: Hvis du altid vil gemme filen uden at brugeren bliver spurgt om han/hun ønsker at overskrive kan du bruge Application.DisplayAlerts:
---- kode start Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:=sStiTilGem & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False Application.DisplayAlerts = True ---- kode slut
(Du kan overveje om du også vil lukke vinduet inden du sætter DisplayAlerts = True igen)
Mulighed 2: Hvis du gerne vil spørge brugeren og bare vil lukke vinduet i tilfælde af at "SaveAs"-fejler, hvilket jo typisk vil være når brugeren siger nej til at overskrive filen, er en mulig løsning at benytte "On Error Resume Next" - du skal så blot angive at filen ikke skal gemmes i ActiveWindow.Close
---- kode start On Error Resume Next ActiveWorkbook.SaveAs Filename:=sStiTilGem & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False ActiveWindow.Close SaveChanges:=false ---- kode slut
Ulempen er at hvis saveas fejler af en anden grund, bliver dette ikke håndteret. Hvis du ikke kan leve med det kræver det noget yderligere fejlhåndtering.
Tak for dit forslag. Jeg vil gerne forsøge mig med begge forslag, idet mit projekt skal bredes ud til flere brugere. Lige nu skal jeg noget privat hele week-enden, men jeg forsøger mig lidt frem hvis jeg kan få et par øjeblik ved PC'en, men ellers vil jeg vende tilbage igen mandag, måske før - undskyld. Jeg vil nok satse på forslag 2. Vender tildage hurtigst muligt.
Jeg fik ikke din kode i "Mulighed 2" til og virke, måske du kan hjælpe igen. Jeg lægger lige hele koden, som starter med og og tjekke om gemmemappen existerer og herefter bliver arket kopieret og til slut gemt, og det er lige her fejlen opstår hvis arket har været gemt en gang før, så kommer feltet hvor man bliver spurgt om man vil overskrive den eksisterende fil, hvis man så svarer nej eller annuller opstår fejlen og linien ActiveWorkbook.SaveAs Filename.......... bliver fejl(farvet gul) Håber du lige kan hjælpe med hvorledes fejlen Kan/skal behandles På forhånd tak
If CheckFolderExists(sStiTilGem) = True Then ''MsgBox ("Mappen er oprettet") sStiTilGem = txtStiTilGem Else ''MsgBox ("Mappe er ikke oprettet") sStiTilGem = Application.ActiveWorkbook.Path & "\" & sDokNavn End If
Hvad sker der hvis du indsætter linjen "On Error Resume Next" før dit kald af ActiveWorkbook.SaveAs? Dvs. bare vælger at ignorere fejl i kaldet (og efterfølgende fejl i proceduren)?
Hej Igen Som du skriver, så har jeg sat "On error Resume Next" ind før ActiveWorkbook.SaveAS....... og nu fungerer det tilfredsstillende, brugeren bliver nu spurgt en ekstra gang om han vil gemme, og det virker fint nok, ingen fejl længere.
Jeg har ikke tidligere beskæftiget mig med fejlbehandling, og satte din kode ind efter fejlen opstod, og derfor virkede det ikke. Jeg må nok hellere få sat mig lidt mere ind i fejlbehandling og har fundet ud af at det jo kan gøres på flere måder, men lige nu klarer jeg mig fint med den måde det er blevet løst på.
Tak for hjælpen, selv om det trak lidt ud. Point går til dig.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.