Avatar billede richter1 Nybegynder
27. september 2008 - 08:05 Der er 17 kommentarer og
1 løsning

ombyt linier fra top til bund. fortsat

Med udgangspunkt i http://www.eksperten.dk/spm/844374, er mine dataopbygnig blevet lidt mere kompliceret. De er opbygget som følger:

kolonne A:  postnumre
kolonne B:  medlemmer der bor i det pågældende postnummer.
Konne c - G: oplysninger om medlemmer.

I dag står postnumrene sorteret således at det mindste nummer sidst. Jeg vil gerne have vendt mit datasæt, således at det mindste nummer kommer først. Medlemmerne under det enkelte postnummer skal selvfølgelig følge med.
Håber min beskrivelse er tydelig nok -
Hvordan får jeg via vba vendt rundt på mine data?
Avatar billede mugs Novice
27. september 2008 - 08:11 #1
Har ikke så meget forstand på Excel, men hvis du indspiller en makro og kopierer VBA ser det således ud:

Cells.Select
Selection.Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Avatar billede jkrons Professor
27. september 2008 - 11:27 #2
Hvis postnumrene står en gang pr. medlem, kan du bare sortere på almindeklig vis. Hvis hvert postnummer kun står en gang, vil jeg mene, at det hurtigste nok er at udfylde dem alle steder og så sortere.
Avatar billede richter1 Nybegynder
27. september 2008 - 20:45 #3
Postnumrene står kun en gang. Vil helst undgå at indsætte postnumrene, da jeg i givet fald efterfølgende skal fjerne dem igen. Håbede at jeg vha. noget kode kunne løse problemet.
Avatar billede excelent Ekspert
29. september 2008 - 17:52 #4
Husk backup er en go ting :-)

Sub Vend()
Application.ScreenUpdating = False
Set sh1 = Sheets("Ark1")
sh1.Select
Sheets.Add
ActiveSheet.Name = "temp"
Set sh2 = Sheets("temp")
sh1.Select
om:
rk1 = sh1.Cells(5000, "A").End(xlUp).Row
rk2 = sh1.Cells(5000, "B").End(xlUp).Row

tmp1 = sh2.Cells(5000, "B").End(xlUp).Row + 1
sh1.Range("A" & rk1 & ":G" & rk2).Cut sh2.Cells(tmp1, 1)

If rk1 >= 2 Then GoTo om

tmp1 = sh2.Cells(5000, "B").End(xlUp).Row

sh2.Range("A2:G" & tmp1).Cut sh1.Range("A2")
Application.DisplayAlerts = False
Sheets("temp").Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Avatar billede richter1 Nybegynder
01. oktober 2008 - 21:00 #5
Backup er en fin ting - har haft stor glæde af den :O))

Koden bringer mig et godt stykke på vej, men der er små udfordringer. Den første er, at postnummeret placers forkert eks.

nu står det som:

4000  hans Poulsen osv.
      Peter Hansen
      Kirsten Jensen
4500  Jens Hansen
      Ketty Jensen
      osv.

efter koden står teksten:
      hans Poulsen osv.
      Peter Hansen0
4000  Kirsten Jensen
      Jens Hansen
4500  Ketty Jensen

Postnummeret skulle helst stå ved det første navn - her skal 4000 stå ved Hans og 4500 ved Ketty.

Den anden udfordring er, at der er en overskrift, som forklarer hvad der stå i kolonnerne. Den skulle helst blive stående. Overskriften står i række 4.

Kan du indbygge ovennævnte i koden?
Avatar billede excelent Ekspert
19. oktober 2008 - 18:25 #6
Ved ikke hvorfor jeg ikke har fået mail om denne tråd
men prøv denne:

Sub Vend()
Application.ScreenUpdating = False
Set sh1 = Sheets("Ark1")
sh1.Select
Sheets.Add
ActiveSheet.Name = "temp"
Set sh2 = Sheets("temp")
sh1.Select
om:
rk1 = sh1.Cells(5000, "A").End(xlUp).Row
rk2 = sh1.Cells(5000, "B").End(xlUp).Row

If rk1 = 4 Then GoTo slut

tmp1 = sh2.Cells(5000, "B").End(xlUp).Row + 1
sh1.Range("A" & rk1 & ":G" & rk2).Cut sh2.Cells(tmp1, 1)

If rk1 >= 5 Then GoTo om
slut:
tmp1 = sh2.Cells(5000, "B").End(xlUp).Row

sh2.Range("A2:G" & tmp1).Cut sh1.Range("A5")
Application.DisplayAlerts = False
Sheets("temp").Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Avatar billede richter1 Nybegynder
26. oktober 2008 - 15:01 #7
Hejsa - dejligt med respons på denne tråd - havde næsten opgivet det :0)

Din kommentar er næsten perfekt. Der er kun en lille detalje som jeg vil sætte pris på kommer med. I mine data er der en blank linie mellem hvert postnummer. Dsv. en blank linie inden et nyt postnummer begynder.

Hvis jeg ændre din kode i følgende to linier:

rk2 = sh1.Cells(5000, "D").End(xlUp).Row -> rk2 = sh1.Cells(5000, "D").End(xlUp).Row + 1

og
Avatar billede richter1 Nybegynder
26. oktober 2008 - 15:04 #8
fortsat
tmp1 = sh2.Cells(5000, "D").End(xlUp).Row + 1 -> tmp1 = sh2.Cells(5000, "D").End(xlUp).Row + 2

så får jeg en blank linie, men så mister jeg gitterlinierne. Problemet er, at jeg ikke bare efterfølgende kan føje gitterlinierne til, da datasættet kan have en variabel antal kolonner. Hvordan takler jeg dette sidste problem?
Avatar billede richter1 Nybegynder
26. oktober 2008 - 15:09 #9
Jeg har ændret lidt i kolonner og rækker i min kode grundet opbygning af mine data. Her er hele koden som den ser ud nu.

Sub Vend()
Application.ScreenUpdating = False
Set sh1 = Sheets("ark1")
sh1.Select
Sheets.Add
ActiveSheet.Name = "temp"
Set sh2 = Sheets("temp")
sh1.Select
om:
rk1 = sh1.Cells(5000, "B").End(xlUp).Row
rk2 = sh1.Cells(5000, "D").End(xlUp).Row + 1

If rk1 = 4 Then GoTo slut

tmp1 = sh2.Cells(5000, "D").End(xlUp).Row + 2
sh1.Range("A" & rk1 & ":J" & rk2).Cut sh2.Cells(tmp1, 1) ' linien der kopiere

If rk1 >= 5 Then GoTo om
slut:
tmp1 = sh2.Cells(5000, "D").End(xlUp).Row

sh2.Range("B2:J" & tmp1).Cut sh1.Range("B5")
Application.DisplayAlerts = False
Sheets("temp").Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub

Det er et smart trick du bruger til kopiering af et helt postnummer :=))
Avatar billede excelent Ekspert
26. oktober 2008 - 15:54 #10
Gitterlinier kan insættes via vba
er det kun en type rammer du anvender eller.. ?
Avatar billede richter1 Nybegynder
26. oktober 2008 - 18:18 #11
jeg anvender en tynd streg til gitteret og en tyk streg til at indramme hele datasættet.
Avatar billede excelent Ekspert
26. oktober 2008 - 18:52 #12
Start makrooptager og lav de tynde rammer, stop optager
Start makrooptager og lav den tykke ramme, stop optager

indsæt begge koder her, så skal jeg forsøge at lave den dynamisk
Avatar billede richter1 Nybegynder
26. oktober 2008 - 19:50 #13
Sub tyndestreger()
    Range("B4:J20").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    Selection.Borders(xlEdgeTop).LineStyle = xlNone
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
End Sub

Sub tykkestreger()
    Range("B4:J20").Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlMedium
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With
    Range("I23").Select
End Sub
Avatar billede excelent Ekspert
27. oktober 2008 - 21:10 #14
Jeg går ud fra at B4 altid er øverste venstre hjørne
men at nederste højre kan ændres
men er det kun antal rækker eller er det også antal kolonner der ændres?
Avatar billede richter1 Nybegynder
28. oktober 2008 - 06:49 #15
B4 er konstant, mens antallet af rækker og kolonner er variable
Avatar billede excelent Ekspert
28. oktober 2008 - 15:28 #16
Indsæt denne stump i starten af begge koder

kolonne = Cells(4, 255).End(xlToLeft).Column
' - ret evt. 4 til den række med flest kolonner
række = Cells(65000, "B").End(xlUp).Row
' - ret evt "B" til den kolonne med flest rækker
Range(Cells(4, 2), Cells(række, kolonne)).Select

og slet denne i begge koder
Range("B4:J20").Select
Avatar billede richter1 Nybegynder
31. oktober 2008 - 10:35 #17
Tusind tak for hjælpen - virker helt perfekt. :0))
God weekend når du når så langt
Avatar billede excelent Ekspert
31. oktober 2008 - 16:07 #18
velbekom, tak i lige måde :-)
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