27. oktober 2003 - 10:42Der er
14 kommentarer og 1 løsning
Loop gennem worksheets igen
Hej igen
Har lige fundet ud af at løsningen ikke umiddelbar løser mit problem.
Det ser ud til at der loopes det antal gange der er worksheets i min fil. Det jeg ønsker at at der skal skiftes til næste worksheet når min kode har kørt for et ark, osv.
Jeg kan selvfølgelig ikke udelukke at jeg gør noget forkert ;-)
jkons -> må nok indrømme at chrira har ret - har lige testet forslagene i ovennævnte spm. og der er ikke nogen af dem der kører koden i hvert enkelt af arkene! Dit forlsag får jeg i hvertfald ikke til at køre på alle arkene, det samme gælder Bak's første forslag. Bak's andet forslag virker efter hensigten, dog ikke i en situation, hvor ark 2 er aktiveret og det skal være på alle arkene (1,2,3)! Endelig er der kabbak's forslag som jeg ikke umiddelbart kan få til at virke! Så hvis chrira, skal have noget kode kørt på hvert enkelt ark, så er mit forslag (vidst nok) det eneste der virker...
Godt at stewens forslag virker. Om jkrons og mit forslag (som er stort set ens) virker, afhænger af den kode du selv sætter ind.
hvis vi tager jkrons's som eksempel og skal skrive noget til en celle, skal man referere til arket med s foran
For Each s in ActiveWorkbook.Sheets s.Range("A4")=123 Next s
I dette tilfælde behøver man ikke aktivere arket (hvilket gør koden langsommere)
I stewens aktiveres arket, men så behøver man ikke referere til det i de underliggende kodelinier For j = 1 To Worksheets.Count Sheets(j).Activate Range("A4")=123 Next
Enig med bak. Hvis du kan udføre en handling ved at manipulere med et objekts egenskaber, fx en celles værdi eller dens format eller lignende, eller et akrs egenskaber eller metoder uden at vælge det først, er koden mere effektiv end hvis du først vælger objektet.
ok - det var det der var forkert! s.Range.. ikke bare range..
og så har du absolut ret at det ved større ark vil være en kæmpe fordel at bruge både dit og jkrons forslag! samtidig behøver du ikke at bruge Application.ScreenUpdating = False/True hvis man vil slippe for at se alle arkene flyve forbi!
Beklager at jeg drog den forkerte konklusion - jeg var bare ikke klogere! ;-)
Det har så også været grunden til atchrira ikke kunne få det til at virke - for ingen af jer havde rent faktisk nævnt at man i den underliggende kode skulle referere til hhv "s" og worksheet - så i det tilfælde hvor man ikke ved bedre, så virker jeres formler ikke! Omvendt når de virker, så er de markant hurtigere end mit forslag!!!!!!!!!!
Ja, det var nok en fejl ikke at nævne at der skal refereres til variablen i forbindelse med udførelsen af koden. Jeg havde nok opfattet det oprindelige spørgsmål som, det bare var For Each...Next sætningen chrira ikke kunne få til at virke.
Det er helt ok. det kan også være noget forvirrende. en anden ting der kan forvirre i disse koder er forskellen på Sheets og Worksheets. Sheets er ALLE arkfaner incl. diagrammer, dialogark, XL4 makroark mm. og Worksheets er kun de alm. regneark. Derfor kan begge de to ovennævnte koder fejle, hvis der er diagramark i mappen. Denne vil fejle, fordi den vil forsøge at indsætte en værdi i celle A4 i diagramarket.
For Each s in ActiveWorkbook.Sheets s.Range("A4")=123 Next s
Denne vil (måske) fejle da den først tæller antallet af "rigtige" regneark, men derefter aktiveres Sheet-nummeret Hvis det fx er 6 ark (regne, dia, regne, dia,regne, dia) vil worksheets.count give tallet 3. Sheets(j) vil så aktivere (regne, dia, regne)
For j = 1 To Worksheets.Count Sheets(j).Activate Range("A4")=123 Next
hvis koden kun skal køre i regneark så brug kun Worksheets
For j = 1 To Worksheets.Count workssheets(j).Activate Range("A4")=123 Next
eller
For Each s in ActiveWorkbook.Worksheets s.Range("A4")=123 Next s
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.