Avatar billede svla Mester
01. september 2010 - 16:49 Der 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.

Håber lige nogen kan hjælpe ??
Avatar billede 220661 Ekspert
01. september 2010 - 17:00 #1
Hvor mange mapper arbejder du i da?
Hvad med en gem som makro der henviser til en bestemt mappe efter nogle bestemte kriterier.
Avatar billede svla Mester
01. september 2010 - 17:18 #2
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.
Avatar billede anlu Nybegynder
01. september 2010 - 19:35 #3
Til dit spm. 1:

Public Function CheckFolderExists(fname As String) As Boolean
    Dim fs As Object
    Set fs = CreateObject("Scripting.FileSystemObject")
    CheckFolderExists = fs.FolderExists(fname)
End Function
Avatar billede svla Mester
01. september 2010 - 21:11 #4
Tak for dit forslag.
Jeg arbejder lige lidt med det, jeg skal lige finde ud af hvorledes din funktion skal bruges
Vender tilbage
Avatar billede svla Mester
01. september 2010 - 22:01 #5
Til anlu
Jeg kan ikke rigtig få det til og virke.

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?
Avatar billede svla Mester
01. september 2010 - 22:38 #6
Hej igen !

Har fået det til og virke, din funktion var bare perfekt, jeg fik det til og virke via denne IF:

If CheckFolderExists(sStiTilGem) = True Then
MsgBox ("Mappen er oprettet")
Else
MsgBox ("Mappe er ikke oprettet")
End If

Kan du hjælpe med Spørgsmål 2 ??
Avatar billede anlu Nybegynder
02. september 2010 - 18:43 #7
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.
Avatar billede svla Mester
02. september 2010 - 21:56 #8
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
 
  Application.ScreenUpdating = False

  Sheets("FormaterArk").Select
  Sheets("FormaterArk").Copy

  ActiveWorkbook.SaveAs Filename:=sStiTilGem & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

  Rem Det er lige her det går galt!!!!!!

  ActiveWindow.Close
  Range("A8").Select
 
  SletTilNy
 
  Application.ScreenUpdating = True
  End
Avatar billede anlu Nybegynder
03. september 2010 - 19:41 #9
Tja, hermed et par forslag

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.
Avatar billede svla Mester
03. september 2010 - 22:12 #10
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.
Avatar billede svla Mester
06. september 2010 - 13:31 #11
Til anlu

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

Private Sub cmdFortsæt_Click()

  sStiTilGem = Application.ActiveWorkbook.Path & "\" & sMappeNavn
 
  If CheckFolderExists(sStiTilGem) = True Then
    ''MsgBox ("Mappen er oprettet")
    sStiTilGem = txtStiTilGem
  Else
    ''MsgBox ("Mappe er ikke oprettet")
    sStiTilGem = Application.ActiveWorkbook.Path & "\" & sDokNavn
  End If
 
  Application.ScreenUpdating = False

  Sheets("FormaterArk").Select
  Sheets("FormaterArk").Copy

  ActiveWorkbook.SaveAs Filename:=sStiTilGem & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
 
  Range("A8").Select
 
  SletTilNy ' Sletter formateret ark og starter forfra med ny.
 
  Application.ScreenUpdating = True
  End
End Sub
Avatar billede anlu Nybegynder
06. september 2010 - 18:42 #12
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)?
Avatar billede svla Mester
06. september 2010 - 21:24 #13
Hej det prøver jeg lige og vender tilbage, er lige på arbejde nu.
Avatar billede svla Mester
06. september 2010 - 23:12 #14
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester