Avatar billede zjat Nybegynder
17. november 2010 - 15:46 Der er 18 kommentarer og
1 løsning

VBA: gem seperat fil uden VBA

Hej Alle

Så er der igen en udfordring i VBA.

Jeg vil gerne lave en "gem som" funktion i VBA, som gemmer en excel fil UDEN VBA!

Dvs. har en original fil, som har en gem knap. Når man trykker på den, så skal den gemme en ny excel fil uden det VBA kode, som findes i originalfilen (dvs. informationerne, der findes i originalfilen bliver "låst" i den nye fil)

(ja, svært at forklare på en let måde - men håber det giver mening:))

Jeg kan sagtens finde ud af at navngive filer og gemme - men kan ikke finde en løsning til dette.

Har fundet dette link:

http://www.rondebruin.nl/saveas.htm

Men synes ikke umiddelbart det er løsningen, da der sagtens kan være VBA kode i en alm XLS fil.

Grunden til jeg vil lave dette trick er at min original fil henter nogle data via VBA. Disse data vil jeg så gerne for evige i en anden fil, så de ikke bliver ændret af VBA når man åbner excel filen.

Håber den lange beskrivelse var uddybende nok :)
Avatar billede anlu Nybegynder
17. november 2010 - 16:00 #1
Alternativ tilgang: Hvad med bare at lave en ny workbook og så kopiere data over i den?
Avatar billede zjat Nybegynder
17. november 2010 - 16:13 #2
Ja, det er jo lige det jeg gerne vil - men den eneste måde jeg kender, er hvor man gemmer nuværende excelfil.

Kan du en hurtig kodning til din alternative løsning?

Ville så blive et problem ved meget store datamængder - men den alternative løsning, ville virke lige nu og her :)

(hvis andre har en løsning er de stadig velkommen med input!)
Avatar billede anlu Nybegynder
17. november 2010 - 16:27 #3
Vender lige tilbage senere i aften...
Avatar billede gafi Nybegynder
17. november 2010 - 18:12 #4
Hvad med at gemme det som XML-regneark 2003, så kommer dine VBA koder ikke med i den ny fil.
----------------------------------------------
HELP:
Excel-formatering og -funktioner, som ikke overføres til andre filformater:

XML-regneark 2003 Filformatet til dette XML-regneark 2003 (.xml) bevarer ikke følgende funktioner:
**Visual Basic for Application-projekter.
  Revisionspile
  Diagrammer og andre grafikobjekter
  Diagramark, makroark, dialogark
  Brugerdefinerede visninger
  Henvisninger til datakonsolidering
  Tegneobjektlag
  Dispositions- og grupperingsfunktioner
  Regnearkdata beskyttet med adgangskode
  Scenarier
  Brugerdefinerede funktionskategorier.
Avatar billede anlu Nybegynder
17. november 2010 - 19:15 #5
God ide, synes jeg - hvis du kan bruge denne løsning, vil jeg ikke gøre mere ved den alternative løsning.
Avatar billede zjat Nybegynder
18. november 2010 - 08:09 #6
Hej igen :)

Desværre så har jeg diagrammer og andet grafisk, som skal med over i den nye fil :(

Så hvis nogen kan give en hurtig metode til at lave et nyt xls dokument uden VBA koden ville jeg være henrykt :)
Avatar billede zjat Nybegynder
18. november 2010 - 08:24 #7
Nu har jeg lige googlet lidt mere og fandt denne "løsning"

http://www.vbaexpress.com/kb/getarticle.php?kb_id=359

Den fungerer helt efter hensigten!!! MEN når jeg åbner den nye fil siger den:

"the file you are trying to open, is in a different format than specified by the file extension. Verify that the file is not corrupted...."

Kan nogen evt. hjælpe med at undgå denne fejlbesked?
Avatar billede finb Ekspert
18. november 2010 - 09:24 #8
følger blot tråden...
Avatar billede zjat Nybegynder
18. november 2010 - 10:44 #9
Tror jeg har fundet løsningen nu :)

Det virker i hvert fald her :) Men kan ikke lige overskue og forbedre koden til at blive mindre rodet - måske nogen kan hjælpe her :)

Private Sub cmdka_Click()
Application.DisplayAlerts = False 'don't show alerts when startup
    Dim NewName As String
    Dim nm As Name
    Dim ws As Worksheet
   
    If MsgBox("Copy specific sheets to a new workbook" & vbCr & _
    "New sheets will be pasted as values, named ranges removed" _
    , vbYesNo, "NewCopy") = vbNo Then Exit Sub
   
    With Application
        .ScreenUpdating = False
       
        '      Copy specific sheets
        '      *SET THE SHEET NAMES TO COPY BELOW*
        '      Array("Sheet Name", "Another sheet name", "And Another"))
        '      Sheet names go inside quotes, seperated by commas
        On Error GoTo ErrCatcher
        Sheets(Array("Sheet1")).Copy
        On Error GoTo 0
       
        '      Paste sheets as values
        '      Remove External Links, Hperlinks and hard-code formulas
        '      Make sure A1 is selected on all sheets
        For Each ws In ActiveWorkbook.Worksheets
            ws.Cells.Copy
            ws.[A1].PasteSpecial Paste:=xlValues
            ws.Cells.Hyperlinks.Delete
            Application.CutCopyMode = False
            Cells(1, 1).Select
            ws.Activate
        Next ws
        Cells(1, 1).Select
       
        '      Remove named ranges
        For Each nm In ActiveWorkbook.Names
            nm.Delete
        Next nm
        .ScreenUpdating = True
        End With
            Dim Filnavn As String
  Dim Svar As Integer
 
  Filnavn = "tobias2"
 
  'Spørger om vil gemme med pågældende filnavn
  Svar = MsgBox("Vil du gemme med følgende filnavn" & vbNewLine & Filnavn, vbYesNo)
 
  'Hvis svaret er ja gemmes filen, og data overføres til databasen
  If Svar = 6 Then
 
        'Gemmer filen
        ActiveWorkbook.SaveAs Filename:="\\test\" & Filnavn & ".xls", FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
        Windows("tobias2.xls").Close
        'Application.ThisWorkbook.Close
        MsgBox "filen er gemt i mappen" & vbNewLine & "J:\test"

        End If
       
    Windows("test.xls").Activate
   
    Exit Sub
   
ErrCatcher:
    MsgBox "Specified sheets do not exist within this workbook"



End Sub
Avatar billede zjat Nybegynder
18. november 2010 - 10:56 #10
Her er den uden promts og hvor den henter filnavnet fra en celle:

Private Sub cmdka_Click()
Application.DisplayAlerts = False 'don't show alerts when startup
   
    Dim nm As Name
    Dim ws As Worksheet
    Dim Filnavn As String

   
    'If MsgBox("Copy specific sheets to a new workbook" & vbCr & _
    '"New sheets will be pasted as values, named ranges removed" _
    ', vbYesNo, "NewCopy") = vbNo Then Exit Sub
   
  With Application
        .ScreenUpdating = False
       
        '      Copy specific sheets
        '      *SET THE SHEET NAMES TO COPY BELOW*
        '      Array("Sheet Name", "Another sheet name", "And Another"))
        '      Sheet names go inside quotes, seperated by commas
        On Error GoTo ErrCatcher
        Sheets(Array("Sheet1")).Copy
        On Error GoTo 0
       
        '      Paste sheets as values
        '      Remove External Links, Hperlinks and hard-code formulas
        '      Make sure A1 is selected on all sheets
        For Each ws In ActiveWorkbook.Worksheets
            ws.Cells.Copy
            ws.[A1].PasteSpecial Paste:=xlValues
            ws.Cells.Hyperlinks.Delete
            Application.CutCopyMode = False
            Cells(1, 1).Select
            ws.Activate
        Next ws
        Cells(1, 1).Select

        '      Remove named ranges
        For Each nm In ActiveWorkbook.Names
            nm.Delete
        Next nm
        .ScreenUpdating = True
        End With

 
  Filnavn = ActiveWorkbook.Sheets("Sheet1").Range("A18").Value
 
        'Gemmer filen
        ActiveWorkbook.SaveAs Filename:="\\test\" & Filnavn & ".xls", FileFormat:=xlNormal, _
        Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
        CreateBackup:=False
        Windows(Filnavn & ".xls").Close

    Windows("test.xls").Activate
    Application.DisplayAlerts = True 'show alerts
    Exit Sub
   
ErrCatcher:
    MsgBox "Specified sheets do not exist within this workbook"

End Sub
Avatar billede zjat Nybegynder
18. november 2010 - 15:20 #11
hmmm...Den fjerner ikke VBA kode :(

Troede lige jeg var nået målet - dog så fjerner den userforms og makroer :)
Avatar billede anlu Nybegynder
18. november 2010 - 19:04 #12
Check denne side (specielt "DeleteAllVBACode" kunne være interessant for dig).

Husk at læse instruktionerne i toppen.
Avatar billede zjat Nybegynder
23. november 2010 - 10:46 #13
Hej Anlu

Hvilken side? Tror der mangler et link :)
Avatar billede anlu Nybegynder
23. november 2010 - 10:58 #14
Avatar billede zjat Nybegynder
16. januar 2011 - 15:38 #15
Hej Anlu

Jeg fandt aldrig den helt rigtige løsning. Men synes du skal have point for din store hjælp.

Smid besked og du vil få point
Avatar billede anlu Nybegynder
16. januar 2011 - 15:47 #16
ok - hermed et svar. Ærgerligt at du ikke fandt en løsning. Var der et bestemt issue med cpearson's metode?
Avatar billede zjat Nybegynder
16. januar 2011 - 16:08 #17
Det var simpelthen fordi jeg ikke rigtig forstår løsningen. Jeg har ikke kunne få det til at virke. Tror måske jeg havde behov for en konkret løsning i stedet.
Avatar billede anlu Nybegynder
16. januar 2011 - 16:30 #18
Jeg tror du ville være tæt på hvis du i din kode åbnede den kopi du har lavet og så bruger hans kode i "DeleteAllVBACode".

Noget i stil med:


Dim wbKopi as Workbook
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule

Set wbKopi = Workbooks.Open(<sti>)
       
Set VBProj = wbKopi.VBProject
       
For Each VBComp In VBProj.VBComponents
    If VBComp.Type = vbext_ct_Document Then
    Set CodeMod = VBComp.CodeModule       
    With CodeMod
            .DeleteLines 1, .CountOfLines
        End With
    Else
        VBProj.VBComponents.Remove VBComp
    End If
Next VBComp


Men der er nogle sikkerhedsindstillinger der skal sættes for at det kan bruges - se hans indledende tekst.
Avatar billede zjat Nybegynder
18. marts 2011 - 09:56 #19
Jeg vil prøve at gøre det - så må vi se :)

Men du skal have mange mange tak for din hjælp :)
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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