Avatar billede allenb Nybegynder
01. november 2001 - 15:33 Der er 21 kommentarer og
1 løsning

Kopiering af ark i kode....

Når jeg bruger følgende kode til at oprette en kopi af et master ark forårsager det at excel på et tidpunkt løber tør for hukommelse og kommer med fejlen \"1004 Copy metoden for klassen worksheet mislykkedes\"
   
    \'Sheets(t.Name).Select
    \'Sheets(t.Name).Copy Before:=Sheets(Ark7.Name)

Når jeg bruger denne kode, kommer den ikke med fejl, men problemet her er at den ikke for kopieret den kode der ligger på arket eks.
\"Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)\"

    Worksheets(t.Name).Select
    Sheets(t.Name).Cells.Copy
    Sheets.Add Before:=Sheets(Ark7.Name)
    ActiveSheet.Name = \"Ark1\"
    ActiveSheet.Paste

Det skal siges at der godt kan forekomme at der skal kopieres mange sheets ind i workbook\'en - kan nogen hjælpe?
Kan nogen hjælpe
Avatar billede allenb Nybegynder
01. november 2001 - 15:38 #1
Har tjekket på MSDN, her siger de at man skal gemme og lukke regnearket engang imellem, men det er desværre ikke muligt, da der samtidig kører en forespørgsel mod en database der opdaterer data på de ark der bliver oprettet.

Så spørgsmålet er hvorfor virker den ene kode men ikke den anden???
01. november 2001 - 15:55 #2
Kan du bruge noget af det, som jeg har lavet her ?

http://www.eksperten.dk/spm/127325
http://www.eksperten.dk/spm/128050

Hvis den Private Sub worksh..... ligger på ark7, hvor den køres fra, så kan jeg godt forstå det, for jeg mener at have læst, at du ikke kan kopiere en kode der kører!
Avatar billede janvogt Praktikant
01. november 2001 - 15:57 #3
Det lyder mystisk.
Måske skal der noget kode til, som separat kopierer koden til det tilhørende ark.

Har du mulighed for at sende dit ark til mig?

jan_vogt_hansen@hotmail.com
Avatar billede allenb Nybegynder
01. november 2001 - 16:06 #4
Kan desværre ikke sende arket...Koden ligger på et masterark som jeg skal kopiere en del gange, så den er ikke aktiv når jeg kopierer.

Kender i til, hvordan man kopierer kode i \"koden\" det virker bare bagvendt, da metoden .Copy tager hele arket med kode og kopiere det.
Avatar billede janvogt Praktikant
01. november 2001 - 16:31 #5
Ja, jeg har nogle eksempler liggende et eller andet sted, som behandler problemet. Jeg prøver at finde det .....
Avatar billede janvogt Praktikant
01. november 2001 - 16:41 #6
Her var det. Det er taget fra Erlandsens hjemmeside på http://edc.bizhosting.com/english/

Insert a new module from a file
With the macro below you can easily insert new modules with contents in a workbook. This requires that you have created the new module previously in another (temporary) workbook. Export the finished module to a text file by rightclicking the module name and select Export file... in the shortcut menu.

Sub InsertVBComponent(ByVal wb As Workbook, ByVal CompFileName As String)
\' inserts the contents of CompFileName as a new component in wb
\' CompFileName must be a valid VBA component suited for import (an exported VBA component)
    If Dir(CompFileName) <> \"\" Then \' source file exist
        On Error Resume Next \' ignores any errors if the project is protected
        wb.VBProject.VBComponents.Import CompFileName \' inserts component from file
        On Error GoTo 0
    End If
    Set wb = Nothing
End Sub

Example:

InsertVBComponent ActiveWorkbook, \"C:\\FolderName\\Filename.bas\"



Og hvis det er nødvendigt først at lave et nyt modul skal denne bruges:

Create a new module
With the macro below you can create a new module in a workbook:

Sub CreateNewModule(ByVal wb As Workbook, ByVal ModuleTypeIndex As Integer, ByVal NewModuleName As String)
\' creates a new module of ModuleTypeIndex (1=standard module, 2=userform, 3=class module) in wb
\' renames the new module to NewModuleName (if possible)
Dim VBC As VBComponent, mti As Integer
    Set VBC = Nothing
    mti = 0
    Select Case ModuleTypeIndex
        Case 1: mti = vbext_ct_StdModule \' standard module
        Case 2: mti = vbext_ct_MSForm \' userform
        Case 3: mti = vbext_ct_ClassModule \' class module
    End Select
    If mti <> 0 Then
        On Error Resume Next
        Set VBC = wb.VBProject.VBComponents.Add(mti)
        If Not VBC Is Nothing Then
            If NewModuleName <> \"\" Then
                VBC.Name = NewModuleName
            End If
        End If
        On Error GoTo 0
        Set VBC = Nothing
    End If
End Sub

Example:

CreateNewModule ActiveWorkbook, 1, \"TestModule\"

Utrolig, at der skal så meget til, men det er åbenbart nødvendigt.
Avatar billede janvogt Praktikant
01. november 2001 - 16:45 #7
For at få det til at fungere, skal du lige være opmærksom på følgende:

The examples in this document requires a reference to the Microsoft Visual Basic for Applications Extensibility Library. To add this reference to your VB Project you open the Visual Basic Editor (VBE) and activate the VB Project. Then you select Tools, References... and check the option Microsoft Visual Basic for Applications Extensibility x.x
Avatar billede allenb Nybegynder
02. november 2001 - 10:58 #8
Er det mig der misforstår din hjælp eller er dette ikke til at kopiere et modul til et andet modul....jeg vil jo gerne kopiere den kode der ligger på arket (master model) til de efterfølgende ark - i princippet det som metoden .Copy gør....
02. november 2001 - 11:19 #9
jo, koden fra Jan er til kopiering af et modul til et andet.

Din sætning
Sheets(t.Name).Copy Before:=Sheets(Ark7.Name)
burde være nok i sig selv også uden sætningen med select.
Har du ændret navnet \"Ark1\" til \"t\" inde i VBA for det ark, som du ønsker at kopiere fra eller er t blot en variabel ?

Som jeg (ved nærlæsning) læser dit spørgsmål, så virker koden også, men grundet \"hukommelses overflow\" stopper det på et tidspunkt.

Der er ikke andet at gøre, en som MS skriver - gem, luk og åben igen, med mindre der findes en løsning til at ryde op i hukommelsen via VBA.

Jeg mener altså, at der skal findes frem til en løsning på at ryde op i hukommelsen evt. via VBA - ikke noget med .Copy eller andet, for det er blot årsagen til \"overflow\"



Avatar billede janvogt Praktikant
02. november 2001 - 11:33 #10
Koden ligger jo i moduler, så umiddelbart mener jeg da nok, at min (Erlandsens) kode er relevant, medmindre man selvfølgelig kan kopiere alt (incl. kode) på anden måde.
02. november 2001 - 11:49 #11
Koden ligger i Arkets eget modul (sådan som jeg læser det). Arkets eget modul er ikke det samme som et VBProject.VBComponents, som (din Erlandsens) kode tager hånd om.

Koden til arket bliver normalt kopieret med, når sætning
Sheets(t.Name).Copy Before:=Sheets(Ark7.Name)
som allanb også skriver flere gange.

Problemet er \"overflow\" efter gentagende kopieringer.
Avatar billede janvogt Praktikant
02. november 2001 - 12:43 #12
>>>allenb

Sheets(\"Sheet1\").Copy Before:=Sheets(3) fungerer fint hos mig.

Fejlen \"1004 Copy metoden for klassen worksheet mislykkedes\" har heller ikke umiddelbart noget med hukommelses-overflow at gøre.
Er du sikker på, at det ikke er et sted i din kode den er gal?

Du bruger Excel 97, ikke?
Avatar billede janvogt Praktikant
02. november 2001 - 12:53 #13
Hvis du prøver at indsætte dit ark før det sidste regneark, får du problemer, hvis det sidste ark er skjult.

Så kan evt. bruge følgende workaround:
Sheets(\"Sheetname\").Copy After:=Sheets(Sheets.Count)
Avatar billede allenb Nybegynder
02. november 2001 - 12:59 #14
Jeg bruger XL2000, problemet er en slags overflow.
Jeg har dette ark der skal opdateres mod en database, arket opretter således et ark for hver sag den finder i databasen, på hver sag skal der så opdateres med andre data i databasen.
Problemet er opstået på ark med mange sager, jeg har prøvet at slette nogen sager, og så kører det fint....
Mht. metoden .Copy, så fungerer den også fint, lige indtil man når grænsen for maskinens kapacitet(har fulgt med i task managerne under processen) - det er ligesom den ikke frigiver de ark den har oprettet - når jeg bruger den anden metode som jeg har beskrevet i starten, gå det fint, her kommer koden på arket bare ikke med....
Så man skal finde en metode hvor man får frigivet hukommelsen undervejs...hvis det er muligt!?!?!
Avatar billede bak Forsker
02. november 2001 - 18:32 #15
Jeg har lige prøvet din copy-metode af af lavet 259 ark indeholdende kode, samt samt 15 udfyldte celler på hvert ark. Min ledige hukommelse faldt kun fra 26mb til 22mb. Ingen problemer overhovedet. Du må have en væsentlig større fil.
Er det ikke muligt at sætte størrelsen på din swap-fil / pagefile op, så du ikke oplever det her igen ???
Jeg var forøvrigt ikke klar over at man kunne lave mere end 256 ark.
02. november 2001 - 22:19 #16
De data som du henter ind fra din database - henter du dem ind i en PivotTabel ? Hvis det er tilfældet, så har en PivotTabel har et max for antal kolonner - kunne det have noget med det at gøre ?
Avatar billede allenb Nybegynder
06. november 2001 - 13:15 #17
Jeg bruger ikke Pivottabeller....det er sgu lidt mystisk!
06. november 2001 - 14:29 #18
ja
Avatar billede bak Forsker
10. november 2001 - 01:29 #19
Hvis det stadig er et problem, så kan denne makro oprette et nyt ark og bagefter kopiere koden ind i arkets eget modul:Sub Indsaetsub()
Dim nWB As Workbook
Dim mdlWB As Object
Sheets(t.Name).Select
Sheets(t.Name).Cells.Copy
Sheets.Add Before:=Sheets(Ark2.Name)
ActiveSheet.Paste
n = ActiveSheet.Name
Set nWB = ActiveWorkbook
Set mdlWB = nWB.VBProject.VBComponents(n)
With mdlWB.CodeModule
.InsertLines 3, \"Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)\"
.InsertLines 4, \" Msgbox \"\"Har været her!!\"\"\"
.InsertLines 5, \"End Sub\"
End With
End Sub

Avatar billede bak Forsker
10. november 2001 - 01:31 #20
Du skal bare ændre til din egen kode ved .insertlines 4
Avatar billede bak Forsker
10. november 2001 - 09:01 #21
Efter activesheet.paste kan med fordel indsættes:
Application.CutCopyMode = False
Avatar billede allenb Nybegynder
12. november 2001 - 12:30 #22
Jeg har omgået problemet ved at indlægge pauser i opdateringen....dvs. den stopper efter eks 15 ark og så kan man gemme og på den måde frigive hukommelsen.....men stadig synes jeg at det virker bagvendt!?!?!?
->Bak: Tak for tippet!!! - umiddelbart virker det også....
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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