Avatar billede KingMedia Novice
18. februar 2006 - 16:00 Der er 38 kommentarer og
1 løsning

VBA: Udskriv og gem på server.

Hej drenge og piger.

Jeg har på mit arbejde et excel ark som bruges til indrapportering af produktion for hvert holdskifte.

Det jeg søger er:

1: At efter udskrift (ctrl + p) eller "udskriv" via menuen, at en makro opfanger det, og bagefter automatisk gemmer filen på serveren et bestemt sted + bestemt filnavn udfra kriterier.

eller

2: Hvis ikke det kan lade sig gøre med ovenstående, så lave en funktion der "overruler" den alm "Gem" funktion i excel, og så gemmer den et bestemt sted på serveren som beskrevet ovenover.

Kriterierne, if,then,else løkker kan jeg sagtens selv klare, men selve "Gem" delen er jeg ike så skarp til.

Kan dette lade sig gøre ?

I kan til eks. bruge følgende streng til "Gem" stien.

\\Server01\Bruger\MGH\QF25_EDR\40\HOLD1\
Avatar billede bak Forsker
18. februar 2006 - 16:07 #1
Indsæt denne kode i modulet ThisWorkBook


Private Sub Workbook_BeforePrint(Cancel As Boolean)
  ThisWorkbook.SaveAs "\\Server01\Bruger\MGH\QF25_EDR\40\HOLD1\" & ditfilnavn & ".xls"
End Sub
Avatar billede KingMedia Novice
18. februar 2006 - 16:29 #2
Det var sgu hurtigt klaret.. tak :)    smid et svar.
Avatar billede bak Forsker
18. februar 2006 - 16:33 #3
ok :-)
Avatar billede KingMedia Novice
18. februar 2006 - 17:02 #4
et lille tillægsspørgsmål hvis det er ok .. 

Jeg er ikke vant til VBA i excel, har udelukkende brugt VBscript i forbindelse med ASP.

kan du finde nogen fejl i denne her ?

If Sheets("QF25").[L2].Text = "1" Then
    strShift = "\HOLD_1\"
ElseIf Sheets("QF25").[L2].Text = "2" Then
    strShift = "\HOLD_2\"
ElseIf Sheets("QF25").[L2].Text = "3" Then
    strShift = "\HOLD_3\"
End If
Avatar billede KingMedia Novice
18. februar 2006 - 17:03 #5
Det skal siges at det er en af de flere if-then-else sætninger jeg har, for at kunne definere den korrekte sti til serveren.
Avatar billede kabbak Professor
18. februar 2006 - 17:14 #6
Select Case Sheets("QF25").[L2].Text
    Case "1"
        strShift = "\HOLD_1\"
    Case "2"
        strShift = "\HOLD_2\"
    Case "3"
        strShift = "\HOLD_3\"
    Case Else
        MsgBox " ingen valgt"
        Exit Sub
    End Select
Avatar billede KingMedia Novice
18. februar 2006 - 17:19 #7
Hmmm den gir fejl hver gang... 
Det skal siges at L2 er nogle sammenflettede celler, men i cellemarkøren viser den L2 Kan det være pga de er flettede ?
Avatar billede KingMedia Novice
18. februar 2006 - 17:20 #8
det er L2-L7 der er flettet til en celle
Avatar billede KingMedia Novice
18. februar 2006 - 17:29 #9
Hmmmm    det var bare mig der fårkede noget op der.

det eneste problem jeg nu har tilbage er, at den ikke vil tage den korrekte værdi af en celle...

Jeg har cellen R2 som indeholder datoen idag formateret åååmmdd (20060218)

Men når den gemmer filen så bliver den gemt som #######.xls 

jeg har følgende..

strDate = Sheets("QF25").[R2].Text

og den endelige savestring.

strSaveQF25 = strSrv & strLine & strShift & strDate & ".xls"

ThisWorkbook.SaveAs strSaveQF25

Hvad går der galt ? ...

Sorry for alle de mange spørgsmål, skal nok sende points efter dig bagefter :)
Avatar billede kabbak Professor
18. februar 2006 - 18:04 #10
strDate = Format(Sheets("QF25").[R2].Value, "YYYYMMDD", vbMonday, vbFirstFourDays)
Avatar billede KingMedia Novice
18. februar 2006 - 18:18 #11
christ... nu gir den mig en fejl 400..  Selvom jeg har oprettet alle biblioteker på mit drev.

lad mig prøve at paste hele min save del her..


---------------------
Sub FileSave()

Dim strSrv As String
Dim strLine As String
Dim strShift As String
Dim strYear As String
Dim strMonth As String
Dim strDate As String
Dim strSaveQF25 As String


'sti til QF25 på serveren
strSrv = "C:\Test"


' Hvilken Linie køres der på
Select Case Sheets("QF25").[G2].Text
    Case "40"
        strLine = "\40"
    Case "36"
        strLine = "\36"
    Case Else
        MsgBox Sheets("QF25").[G2].Text
        Exit Sub
    End Select


' Hvilket skiftehold arbejdes på
Select Case Sheets("QF25").[L2].Text
    Case "1"
        strShift = "\HOLD_1"
    Case "2"
        strShift = "\HOLD_2"
    Case "3"
        strShift = "\HOLD_3"
    Case Else
        MsgBox Sheets("QF25").[L2].Text
        Exit Sub
    End Select


' Henter årstallet ud fra datoen ex. 20060218
strYear = "\" & Left(Sheets("QF25").[R2].Text, 4)

' Henter måneden ud fra datoen
strMonth = "\" & Mid(Sheets("QF25").[R2].Text, 4, 2)


strDate = "\" & Format(Sheets("QF25").[R2].Value, "YYYYMMDD", vbMonday, vbFirstFourDays)

' Her gemmes dokumentet på serveren udfra vores
' forespørgsler på linie, hold og dato.

strSaveQF25 = strSrv & strLine & strYear & strMonth & strShift & strDate & ".xls"

ThisWorkbook.SaveAs strSaveQF25

End Sub

--------------------------------------------

Hvis du kan hjælpe mig med det her så ville det være genialt. 

Er der iøvrigt en måde, hvorpå den ikke melder fejl hvis biblioteket ikke eksisterer, men bare opretter det selv ?
Hvis det er alt for krævende så er det ligemeget, ellers kan vi selv oprette dem manuelt på serveren. :)
Avatar billede kabbak Professor
18. februar 2006 - 18:21 #12
strYear = "\" & Year(Sheets("QF25").[R2].value)
strMonth = "\" & Month(Sheets("QF25").[R2].value)
Avatar billede KingMedia Novice
18. februar 2006 - 18:22 #13
Filen skulle til sidst gerne gemmes ex. således:

C:\Test\40\2006\HOLD_2\20060218.xls
Avatar billede kabbak Professor
18. februar 2006 - 18:23 #14
>> Jeg har cellen R2 som indeholder datoen idag formateret åååmmdd (20060218)

Det er forhåbentlig en datoværdi, som bare er formateret sådan, hvis det kun er tal, går det galt
Avatar billede Slettet bruger
18. februar 2006 - 18:24 #15
Til første spørgsmål:
Kan man ikke "bare" lave en makro, der udskriver og gemmer arket? Evt med en knap? Jeg har aldrig taget mig tid til at lære vba ordentligt, men har et hav af finurlige makros.
Avatar billede KingMedia Novice
18. februar 2006 - 18:26 #16
kabbak >>  Har lige prøvet, men jeg får stadig en fejl 400 :/
Avatar billede KingMedia Novice
18. februar 2006 - 18:27 #17
kabbak >>>  Jeg tænkte det måske også kunne være det... R2 indeholder en henvisning til en anden celle med datoen formateret som dato.  men R2 er med Brugerdefineret formatering(åååmmdd) ...    selvom jeg prøvede at sætte den til P2 som indeholder datoen 18-02-2006 ...
Avatar billede KingMedia Novice
18. februar 2006 - 18:29 #18
hans-jensen >> Meningen med galskaben er, at der ikke skal være nogle knapper.  Med min sub der overruler den excels almindelige "Gem" funktion ved Ctrl+s og bruger min sub i stedet. 
Dog kunne jeg rigtig godt tænke mig at få deaktiveret "Gem" funktionen i menuen "filer" HELT, så jeg er sikker på der ikke gemmes udenom min funktion.
Avatar billede KingMedia Novice
18. februar 2006 - 18:30 #19
kabbak  >> men uanset om cellen er formateret som dato eller ej, så giver den mig stadig en fejl.
Avatar billede kabbak Professor
18. februar 2006 - 18:33 #20
Sub FileSave()

    Dim strSrv As String
    Dim strLine As String
    Dim strShift As String
    Dim strYear As String
    Dim strMonth As String
    Dim strDate As String
    Dim strSaveQF25 As String


    'sti til QF25 på serveren
    strSrv = "C:\Test"


    ' Hvilken Linie køres der på
    Select Case Sheets("QF25").[G2].Text
    Case "40"
        strLine = "\40"
    Case "36"
        strLine = "\36"
    Case Else
        MsgBox Sheets("QF25").[G2].Text
        Exit Sub
    End Select


    ' Hvilket skiftehold arbejdes på
    Select Case Sheets("QF25").[L2].Text
    Case "1"
        strShift = "\HOLD_1"
    Case "2"
        strShift = "\HOLD_2"
    Case "3"
        strShift = "\HOLD_3"
    Case Else
        MsgBox Sheets("QF25").[L2].Text
        Exit Sub
    End Select


    ' Henter årstallet ud fra datoen ex. 20060218
    strYear = "\" & Year(Sheets("QF25").[R2].Value)


    ' Henter måneden ud fra datoen
    strMonth = "\" & Month(Sheets("QF25").[R2].Value)


    strDate = "\" & Format(Sheets("QF25").[R2].Value, "YYYYMMDD", vbMonday, vbFirstFourDays)

    ' Her gemmes dokumentet på serveren udfra vores
    ' forespørgsler på linie, hold og dato.

    strSaveQF25 = strSrv & strLine & strYear & strMonth & strShift & strDate & ".xls"

    ThisWorkbook.SaveAs strSaveQF25

End Sub

jeg får ingen fejl på denne, men jeg har aldrig foet en fejl 400, jeg ved ikke hvorfor
Avatar billede KingMedia Novice
18. februar 2006 - 18:59 #21
Hmmm og den gemmer filen korrekt hos dig ?
Avatar billede kabbak Professor
18. februar 2006 - 19:00 #22
jeg har ikke prøvet at gemme den, men strengen strSaveQF25, så rigtig ud
Avatar billede KingMedia Novice
18. februar 2006 - 19:17 #23
Fejlen kommer ikke når man compiler det. 
Fejlen kommer hvis du udfører den makro .
Avatar billede kabbak Professor
18. februar 2006 - 19:28 #24
Har liget testet, gemmer fint, men husk at stien skal være oprettet inden
Avatar billede kabbak Professor
18. februar 2006 - 19:46 #25
Sub FileSave()

    Dim strSrv As String
    Dim strLine As String
    Dim strShift As String
    Dim strYear As String
    Dim strMonth As String
    Dim strDate As String
    Dim strSaveQF25 As String
    Dim strDirQF25 As String
    Dim StiTjek As String

    'sti til QF25 på serveren
    strSrv = "C:\Test"

    ' Hvilken Linie køres der på
    Select Case Sheets("QF25").[G2].Text
    Case "40"
        strLine = "\40"
    Case "36"
        strLine = "\36"
    Case Else
        MsgBox Sheets("QF25").[G2].Text
        Exit Sub
    End Select


    ' Hvilket skiftehold arbejdes på
    Select Case Sheets("QF25").[L2].Text
    Case "1"
        strShift = "\HOLD_1"
    Case "2"
        strShift = "\HOLD_2"
    Case "3"
        strShift = "\HOLD_3"
    Case Else
        MsgBox Sheets("QF25").[L2].Text
        Exit Sub
    End Select

    ' Henter årstallet ud fra datoen ex. 20060218
    strYear = "\" & Year(Sheets("QF25").[R2].Value)


    ' Henter måneden ud fra datoen
    strMonth = "\" & Month(Sheets("QF25").[R2].Value)


    strDate = "\" & Format(Sheets("QF25").[R2].Value, "YYYYMMDD", vbMonday, vbFirstFourDays)
   
    strDirQF25 = strSrv & strLine & strYear & strMonth & strShift ' stien hentes ind i en variabel
    StiTjek = Dir(strDirQF25, vbDirectory) ' stien tjekkes om den er der
    If StiTjek = "" Then
      MkDir strDirQF25 ' hvis ikke laves den
    End If

    ' Her gemmes dokumentet på serveren udfra vores
    ' forespørgsler på linie, hold og dato.
    strSaveQF25 = strSrv & strLine & strYear & strMonth & strShift & strDate & ".xls"
    ThisWorkbook.SaveAs strSaveQF25

End Sub
Avatar billede KingMedia Novice
18. februar 2006 - 20:07 #26
Det burde jo virke... men næ..

Når jeg prøver den af kommer der en boks frem og siger "Path not found"
Avatar billede KingMedia Novice
18. februar 2006 - 20:16 #27
Jeg har prøvet at kigge lidt på det.
Fejlen med "Path not found"  kommer i denne linie.

MkDir strDirQF25 ' hvis ikke laves den

Jeg prøvede at sætte dette ind.

    If StiTjek = "" Then
        MsgBox strDirQF25
      MkDir strDirQF25 ' hvis ikke laves den
    End If

og fik stien C:\Test\40\2006\2\HOLD_2

Den eksisterer ikke, og den vil ikke oprette den.

Men den skulle ha heddet C:\Test\40\2006\02\HOLD_2

Hvordan sørger jeg for at månederne bliver skrevet 01,02,03,04,05,06,07,08,09,10,11,12 ?  og ikke bare 1,2,3 osv.

den linie du gav mig var denne.

strMonth = "\" & Month(Sheets("QF25").[R2].Value)
Avatar billede kabbak Professor
18. februar 2006 - 20:20 #28
ok, prøv denne


Sub FileSave()

    Dim strSrv As String
    Dim strLine As String
    Dim strShift As String
    Dim strYear As String
    Dim strMonth As String
    Dim strDate As String
    Dim strSaveQF25 As String
    Dim strDirQF25 As String
    Dim StiTjek As String

    'sti til QF25 på serveren
    strSrv = "C:\Test"

    ' Hvilken Linie køres der på
    Select Case Sheets("QF25").[G2].Text
    Case "40"
        strLine = "\40"
    Case "36"
        strLine = "\36"
    Case Else
        MsgBox Sheets("QF25").[G2].Text
        Exit Sub
    End Select


    ' Hvilket skiftehold arbejdes på
    Select Case Sheets("QF25").[L2].Text
    Case "1"
        strShift = "\HOLD_1"
    Case "2"
        strShift = "\HOLD_2"
    Case "3"
        strShift = "\HOLD_3"
    Case Else
        MsgBox Sheets("QF25").[L2].Text
        Exit Sub
    End Select

    StiTjek = Dir(strDirQF25, vbDirectory)    ' stien tjekkes om den er der
    ' Henter årstallet ud fra datoen ex. 20060218
    strYear = "\" & Year(Sheets("QF25").[R2].Value)


    ' Henter måneden ud fra datoen
    strMonth = "\" & Month(Sheets("QF25").[R2].Value)

    ' Tjekker stierne
    LavSti strSrv
    LavSti strSrv & strLine
    LavSti strSrv & strLine & strYear
    LavSti strSrv & strLine & strYear & strMonth
    LavSti strSrv & strLine & strYear & strMonth & strShift    '
    ' tjekning færdig

    strDate = "\" & Format(Sheets("QF25").[R2].Value, "YYYYMMDD", vbMonday, vbFirstFourDays)

    ' Her gemmes dokumentet på serveren udfra vores
    ' forespørgsler på linie, hold og dato.
    strSaveQF25 = strSrv & strLine & strYear & strMonth & strShift & strDate & ".xls"
    ThisWorkbook.SaveAs strSaveQF25

End Sub

Public Sub LavSti(Sti)
    Dim StiTjek As String
    StiTjek = Dir(Sti, vbDirectory)    ' stien tjekkes om den er der
    If StiTjek = "" Then
        MkDir Sti    ' hvis ikke laves den
    End If
End Sub
Avatar billede kabbak Professor
18. februar 2006 - 20:23 #29
Sub FileSave()

    Dim strSrv As String
    Dim strLine As String
    Dim strShift As String
    Dim strYear As String
    Dim strMonth As String
    Dim strDate As String
    Dim strSaveQF25 As String
    Dim strDirQF25 As String
    Dim StiTjek As String

    'sti til QF25 på serveren
    strSrv = "C:\Test"

    ' Hvilken Linie køres der på
    Select Case Sheets("QF25").[G2].Text
    Case "40"
        strLine = "\40"
    Case "36"
        strLine = "\36"
    Case Else
        MsgBox Sheets("QF25").[G2].Text
        Exit Sub
    End Select


    ' Hvilket skiftehold arbejdes på
    Select Case Sheets("QF25").[L2].Text
    Case "1"
        strShift = "\HOLD_1"
    Case "2"
        strShift = "\HOLD_2"
    Case "3"
        strShift = "\HOLD_3"
    Case Else
        MsgBox Sheets("QF25").[L2].Text
        Exit Sub
    End Select

    StiTjek = Dir(strDirQF25, vbDirectory)    ' stien tjekkes om den er der
    ' Henter årstallet ud fra datoen ex. 20060218
    strYear = "\" & Year(Sheets("QF25").[R2].Value)


    ' Henter måneden ud fra datoen
    If Len(Month(Sheets("QF25").[R2].Value)) = 2 Then
        strMonth = "\" & Month(Sheets("QF25").[R2].Value)
    Else
        strMonth = "\0" & Month(Sheets("QF25").[R2].Value)
    End If
    ' Tjekker stierne
    LavSti strSrv
    LavSti strSrv & strLine
    LavSti strSrv & strLine & strYear
    LavSti strSrv & strLine & strYear & strMonth
    LavSti strSrv & strLine & strYear & strMonth & strShift    '
    ' tjekning færdig

    strDate = "\" & Format(Sheets("QF25").[R2].Value, "YYYYMMDD", vbMonday, vbFirstFourDays)

    ' Her gemmes dokumentet på serveren udfra vores
    ' forespørgsler på linie, hold og dato.
    strSaveQF25 = strSrv & strLine & strYear & strMonth & strShift & strDate & ".xls"
    ThisWorkbook.SaveAs strSaveQF25

End Sub

Public Sub LavSti(Sti)
    Dim StiTjek As String
    StiTjek = Dir(Sti, vbDirectory)    ' stien tjekkes om den er der
    If StiTjek = "" Then
        MkDir Sti    ' hvis ikke laves den
    End If
End Sub

nu er det med måneden lavet
Avatar billede KingMedia Novice
18. februar 2006 - 20:34 #30
Det der... det er SÅ meget klasse !!! :D

Jeg opretter et nyt spg.  Hvad er sån en fætter værd ? :)
Avatar billede kabbak Professor
18. februar 2006 - 20:36 #31
den er gratis ;-))
Avatar billede KingMedia Novice
18. februar 2006 - 20:37 #32
Iøvrigt..  er der en måde hvorpå man HELT kan disable "Gem"  oppe i menuen "Filer" ? så man KUN kan benytte sig af ctrl+s ?
Avatar billede KingMedia Novice
18. februar 2006 - 20:37 #33
Det tar jeg sgu hatten af for.. det har været en voldsom stor hjælp :D :D
Avatar billede kabbak Professor
18. februar 2006 - 20:47 #34
I ThisWorkbook modulet

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
FileSave
Cancel = True
End Sub


og den anden ser sådan ud, læg mærke til hvad der står på begge sider af gem linien

Når du har sat det ind kan den kun gemmes over din kode




Sub FileSave()

    Dim strSrv As String
    Dim strLine As String
    Dim strShift As String
    Dim strYear As String
    Dim strMonth As String
    Dim strDate As String
    Dim strSaveQF25 As String
    Dim strDirQF25 As String
    Dim StiTjek As String

    'sti til QF25 på serveren
    strSrv = "C:\Test"

    ' Hvilken Linie køres der på
    Select Case Sheets("QF25").[G2].Text
    Case "40"
        strLine = "\40"
    Case "36"
        strLine = "\36"
    Case Else
        MsgBox Sheets("QF25").[G2].Text
        Exit Sub
    End Select


    ' Hvilket skiftehold arbejdes på
    Select Case Sheets("QF25").[L2].Text
    Case "1"
        strShift = "\HOLD_1"
    Case "2"
        strShift = "\HOLD_2"
    Case "3"
        strShift = "\HOLD_3"
    Case Else
        MsgBox Sheets("QF25").[L2].Text
        Exit Sub
    End Select

    StiTjek = Dir(strDirQF25, vbDirectory)    ' stien tjekkes om den er der
    ' Henter årstallet ud fra datoen ex. 20060218
    strYear = "\" & Year(Sheets("QF25").[R2].Value)


    ' Henter måneden ud fra datoen
    If Len(Month(Sheets("QF25").[R2].Value)) = 2 Then
        strMonth = "\" & Month(Sheets("QF25").[R2].Value)
    Else
        strMonth = "\0" & Month(Sheets("QF25").[R2].Value)
    End If
    ' Tjekker stierne
    LavSti strSrv
    LavSti strSrv & strLine
    LavSti strSrv & strLine & strYear
    LavSti strSrv & strLine & strYear & strMonth
    LavSti strSrv & strLine & strYear & strMonth & strShift    '
    ' tjekning færdig

    strDate = "\" & Format(Sheets("QF25").[R2].Value, "YYYYMMDD", vbMonday, vbFirstFourDays)

    ' Her gemmes dokumentet på serveren udfra vores
    ' forespørgsler på linie, hold og dato.
    strSaveQF25 = strSrv & strLine & strYear & strMonth & strShift & strDate & ".xls"
    Application.EnableEvents = False
    ThisWorkbook.SaveAs strSaveQF25
    Application.EnableEvents = True
End Sub

Public Sub LavSti(Sti)
    Dim StiTjek As String
    StiTjek = Dir(Sti, vbDirectory)    ' stien tjekkes om den er der
    If StiTjek = "" Then
        MkDir Sti    ' hvis ikke laves den
    End If
End Sub
Avatar billede KingMedia Novice
18. februar 2006 - 20:57 #35
Coolt.. det er fanme lækkert..

Når jeg så prøver at gemme den igen, så ligger den der jo i forvejen, og kommer op og spørger om man vil overskrive den.

Hvis ikke man vælger ja, så kommer der en fejl.

Er der en måde hvorpå den ikke spørger om at blive overskrevet, men bare gør det ?
Avatar billede kabbak Professor
18. februar 2006 - 21:03 #36
Application.EnableEvents = False
    Application.DisplayAlerts = False
    ThisWorkbook.SaveAs strSaveQF25
    Application.DisplayAlerts = True
    Application.EnableEvents = True
End Sub
Avatar billede KingMedia Novice
18. februar 2006 - 21:38 #37
lækkert.. det virker jo perfekt... nu har jeg bare ET lille problem ..

Jeg kan ikke redigere min VBA som den skal være og så gemme den under det filnavn skabelonen skal ha *G*
Avatar billede KingMedia Novice
18. februar 2006 - 21:44 #38
oh christ nevermind :D    kan jo bare ta det fra et andet sted *G*

100000000 gange tak for hjælpen .. du har sgu reddet min (og sikkert også min driftleders) dag :D
Avatar billede kabbak Professor
18. februar 2006 - 23:59 #39
du kan fjerne disse linier, de bruges ikke

  Dim strDirQF25 As String
    Dim StiTjek As String
    StiTjek = Dir(strDirQF25, vbDirectory)    ' stien tjekkes om den er der
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