Avatar billede hoineg Nybegynder
16. oktober 2002 - 00:41 Der er 22 kommentarer og
1 løsning

VBA-kode på at splitte en tabel til flere.

Jeg håber en kan hjælpe mig - jeg har et tabel med fondskode, papir og papirtype. Jeg skal have lavet 3 nye tabeller separeret på  papirtyper. Det hele skal programmeres i VBA. Har nogle et godt forslag

EKS. på tabel
991996 6Stat11 Stat
974072 6Nyk32  Realkredit
926205 4RD04  Flex
991783 7Stat04 Stat
925799 6RD29  Realkredit
926140 4RD05  Flex
Disse skal ud i tre nye tabeller fordelt på Stat,Real, Flex. Jdg skal have det programmeret i VBA - da tabellen er væsentligt større end beskrevet.
Avatar billede Slettet bruger
16. oktober 2002 - 01:11 #1
1. Er der kun 3 kolonner i arket ?
2. Må de separerede tabellerne gerne ligge i hver deres faneblad ?
3. Ligger værdierne altid i samme kolonne ?
Avatar billede hoineg Nybegynder
16. oktober 2002 - 01:16 #2
Tak for hurtig respons!

Nej der er flere kolonner men de er mere eksemplet i det! Det ville være en fordel med kun et faneblad (er stort i forvejen) men ingen betingelse.
Og ja værdierne ligger altid i samme kolonne og skal altid flyttes til samme kolonne.
Avatar billede xelor Nybegynder
16. oktober 2002 - 07:21 #3
Har du overvejet at benytte en Pivottabel ?

Eller funktionen Sorter? Sortering kan tage visse dele af en matrix og lægge ud et andet sted, baseret på kriterier...

Der findes mange muligheder, og med mindre dette er en gentagende hændelse, så kan det måske være overkill at begynder at programmere sig ud af problemerne.
Men ellers kunne dit program se ud som følger :

Sub SplitUpTable()

dim STAT as range
dim REAL as range
dim FLEX as range
dim DATA as range

set STAT =SHEET("STAT").Cells(1,1)
set REAL =SHEET("REAL").Cells(1,1)
set FLEX =SHEET("FLEX").Cells(1,1)

cells(1,1).select
set DATA = range(selection,selection.end(xlDown))

for each cell in DATA
    if cell.offset(0,3)="Stat" then
        for x=0 to data.columns.count-1
        STAT.end(xldown).offset(1,x)= cell.offset(0,x)
        next
    end if

    if cell.offset(0,3)="REAL" then
        for x=0 to data.columns.count-1
        REAL.end(xldown).offset(1,x)= cell.offset(0,x)
        next
    end if
    if cell.offset(0,3)="FLEX" then
        for x=0 to data.columns.count-1
        FLEX.end(xldown).offset(1,x)= cell.offset(0,x)
        next
    end if
next cell

End sub

Jeg skal starte med at sige, at dette ikke er testet, det var bare en ide til, hvordan dette kunne gøres.

Umiddelbart ville jeg bruge funktion Sorter - Kopier til nyt område, men det er selvfølgelig bare mig.

Held og lykke med det.
Avatar billede hoineg Nybegynder
16. oktober 2002 - 08:54 #4
Sorter vil langt fra være tilstrækkeligt, da det er en del af et stort regneark og der anvendes meget hyppigt!

Men jeg tester din koder og vender tilbage!
Avatar billede bak Forsker
16. oktober 2002 - 11:02 #5
Prøv evt. også lige at hente http://tommy.bak.homepage.dk/filterogkopier.xls

Koden til dette ark kan også splitte en tabel ud i flere (hvert sit ark)
17. oktober 2002 - 09:33 #6
hoineg>> Hvis du sætter din makro-båndoptager igang og laver sorteringen som du gerne hvil have den, så får du en stump kode, som næsten ingen tilretning kræver, for at du kan bruge den i din makro. Vil gætte på at det er den hurtigste løsning i run-time.
Avatar billede hoineg Nybegynder
18. oktober 2002 - 00:00 #7
Tak for input omkring sortering men det er ikke problemet - eksemplet er dog kraftigt simplificeret og kun en del af et større regneark. Sortering er derfor først aktuelt når uddeling er sket. Men "Xelor" har givet mig lidt input jeg arbejder med - selv om der skal udbygges en del. Tak foreløbig for alle input.
18. oktober 2002 - 20:18 #8
Denne splitter forudsætter følgende:
Du har oprettet 3 ark, som er navngivet "STAT", "REAL og "FLEX".
Den kolonne som skal evalueres for Stat,Real og Flex er den sidste kolonne i den tabel du evaluerer på.

Sub SplitUpTable()
    Dim rCell As Range
    Dim rCurReg As Range
    Dim sWks As String
    Dim lRow As Long
    Dim X As Long
   
    Set rCurReg = ActiveSheet.Range("A1").CurrentRegion
   
    For Each rCell In rCurReg.Columns(1).Cells
        With rCell
            sWks = UCase$(Left(.Offset(0, rCurReg.Columns.Count).Value, 4))
            lRow = Sheets(sWks).Range("A65536").End(xlUp).Row + 1
            For X = 1 To rCurReg.Columns.Count
                Sheets(sWks).Cells(lRow, X).Value = .Offset(0, X).Value
            Next X
        End With
    Next rCell
   
    Set rCell = Nothing
    Set rCurReg = Nothing
End Sub
21. oktober 2002 - 15:24 #9
hoineg> hjalp det dig ?
Avatar billede hoineg Nybegynder
21. oktober 2002 - 16:52 #10
Hej Flemming! tak for input men jeg lå desværre med PC-virus er først lige kommet op at køre - er forhåbentligt klogere i aften eller morgen!
Avatar billede hoineg Nybegynder
22. oktober 2002 - 23:16 #11
Desværre Flemming, jeg modtager en out of range fejlkode! Og jeg kan ikke spore hvor den går galt!
22. oktober 2002 - 23:18 #12
Du er velkommen til at sende mig arket fd@win-consult.com
Avatar billede hoineg Nybegynder
22. oktober 2002 - 23:19 #13
Til Xelor! Din kode var desværre heller ikke særlig nyttefuld! Men jeg knokler videre - da der må være en løsning!
22. oktober 2002 - 23:21 #14
ovenstående har virket fint hos mig...
Avatar billede hoineg Nybegynder
22. oktober 2002 - 23:26 #15
Så må jeg lave noget galt! Navngiver du også aktivt sheet?
22. oktober 2002 - 23:28 #16
Nej - har du celler, hvor der står andet end Stat,Flex eller Real ?
Findes disse ark ? hvilken linie stopper makro'en i når du trykker Debug ?
Sker der overhovedet noget ? Har du data i celle A1 ? Send mig arket.
Avatar billede hoineg Nybegynder
22. oktober 2002 - 23:41 #17
Intet sker - jeg får ikke mulighed for en debug.
Der er tre kolonner i eksemplet (se spgm.) sidste kolonne indeholder fordelingsnøgle.
De tre ark er oprettet. og der er header i A1,B1 og C1.Data er i efterfølgende rækker -  med fordelingsnøgle i kolonne C.
Jeg kan desværre ikke sende dig andet end eksempelarket, da oprindeligt ark desværre indeholder interne oplysninger, som ikke må videreformidles.
22. oktober 2002 - 23:43 #18
fair nok - eksempelarket er fint nok.
Avatar billede hoineg Nybegynder
22. oktober 2002 - 23:46 #19
Er på vej- og tak!
22. oktober 2002 - 23:54 #20
*ss* det er oz den forkerte version af makro'en du har fået LOL - prøv denne her :-)

Sub SplitUpTable()
    Dim rCell As Range
    Dim rCurReg As Range
    Dim sWks As String
    Dim lRow As Long
    Dim X As Long
   
    Set rCurReg = ActiveSheet.Range("A1").CurrentRegion
    Set rCurReg = rCurReg.Offset(1, 0).Resize(rCurReg.Rows.Count - 1, rCurReg.Columns.Count)
   
    For Each rCell In rCurReg.Columns(1).Cells
        With rCell
            sWks = UCase$(Left(.Offset(0, rCurReg.Columns.Count - 1).Value, 4))
            lRow = Sheets(sWks).Range("A65536").End(xlUp).Row + 1
            For X = 0 To rCurReg.Columns.Count - 1
                Sheets(sWks).Cells(lRow, X + 1).Value = .Offset(0, X).Value
            Next X
        End With
    Next rCell
   
    Set rCell = Nothing
    Set rCurReg = Nothing
End Sub
22. oktober 2002 - 23:56 #21
For X = 0 To rCurReg.Columns.Count - 1
    Sheets(sWks).Cells(lRow, X + 1).Value = .Offset(0, X).Value

kan oz se således ud:           
For X = 1 To rCurReg.Columns.Count
    Sheets(sWks).Cells(lRow, X).Value = .Offset(0, X - 1).Value
Avatar billede hoineg Nybegynder
22. oktober 2002 - 23:57 #22
Fantastisk! Tusinde tak for hjælpen! 150p til dig
23. oktober 2002 - 00:00 #23
:-) ingen årsag :-)
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