Avatar billede Filholm Seniormester
08. juni 2017 - 19:29 Der er 13 kommentarer og
1 løsning

Automatisk sortering af værdier fra flere kolonner

Jeg har brug for hjælp.
I kolonne A+B+C har jeg skrevet mine værdier (personer på forskellige hold).

  A            B            C
Hold1    Hold2    Hold3
Heidi    Jens      Peter
Inga      Mette    Klaus
Søren  Åge        Niels
OSV.

Der er lavet en programkode således at nye indtastninger automatisk bliver sorteret alfabetisk i hver enkelt kolonne. Hvis der i kolonne A bliver skrevet Asbjørn, retter Excel det til således at Asbjørn kommer til at stå øverst.

Følgende kode er benyttet:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Range("A:A").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
          xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End If
   
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        Range("B:B").Sort Key1:=Range("B2"), Order1:=xlAscending, Header:= _
          xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End If
   
    If Not Intersect(Target, Range("C:C")) Is Nothing Then
        Range("C:C").Sort Key1:=Range("C2"), Order1:=xlAscending, Header:= _
          xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End If
 
End Sub


MIT PROBLEM.....
Jeg vil meget gerne hvis excel automatisk kunne sortere alle navnene fra kolonne A+B+C i en ny kolonne (D)

Er dette muligt?
Avatar billede Jan Hansen Ekspert
08. juni 2017 - 20:37 #1
Hos mig virker din kode ikke hvis navnet begynder med et bogstav før "H"

denne kode gør


Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Lrow As Long
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Lrow = LastRow(Range("A2"))
        Range("A2", Cells(Lrow, 1)).Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _
          xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End If
   
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        Lrow = LastRow(Range("B2"))
        Range("A2", Cells(Lrow, 2)).Sort Key1:=Range("B2"), Order1:=xlAscending, Header:= _
          xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End If
   
    If Not Intersect(Target, Range("C:C")) Is Nothing Then
        Lrow = LastRow(Range("C2"))
        Range("A2", Cells(Lrow, 3)).Sort Key1:=Range("C2"), Order1:=xlAscending, Header:= _
          xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
        DataOption1:=xlSortNormal
    End If
 
End Sub
Private Function LastRow(rRow As Range) As Long
    Dim Lrow As Long
    Lrow = rRow.End(xlDown).Row
    LastRow = Lrow
End Function


ang dit andet problem vender jeg tilbage

Jan
Avatar billede Jan Hansen Ekspert
08. juni 2017 - 22:20 #2
denne kode til sort af kolonne A til C virker

Option Explicit
Dim Lrow As Long
Private Sub Worksheet_Change(ByVal Target As Range)
   
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Call AllSort(Range("A2"))
    End If
   
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        Call AllSort(Range("B2"))
    End If
   
    If Not Intersect(Target, Range("C:C")) Is Nothing Then
        Call AllSort(Range("C2"))
    End If
 
End Sub
Sub AllSort(rCell As Range)
    Dim rCells As Range
        Lrow = LastRow(rCell)
        Set rCells = Range(rCell, Cells(Lrow, rCell.Column))
        With rCells
            .Sort Key1:=rCell, Order1:=xlAscending, _
                  Header:=xlNo, _
                  OrderCustom:=1, _
                  MatchCase:=False, _
                  Orientation:=xlTopToBottom, _
                  DataOption1:=xlSortNormal
        End With
        Lrow = 0
End Sub
Private Function LastRow(rCell As Range) As Long
    Dim Lrow As Long
    Lrow = rCell.End(xlDown).Row
    LastRow = Lrow
End Function


tænker du at alle navne i kolonne A til C skal kopieres over i D og derefter sorteres

Jan
Avatar billede Jan Hansen Ekspert
08. juni 2017 - 22:54 #3
Det fulde forslag fra mig


Option Explicit
Dim Lrow As Long
Private Sub Worksheet_Change(ByVal Target As Range)
   
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Call AllSort(Range("A2"))
        Call CopyABC
    End If
   
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        Call AllSort(Range("B2"))
        Call CopyABC
    End If
   
    If Not Intersect(Target, Range("C:C")) Is Nothing Then
        Call AllSort(Range("C2"))
        Call CopyABC
    End If
 
End Sub
Sub AllSort(rCell As Range)
    Dim rCells As Range
        Lrow = LastRow(rCell)
        Set rCells = Range(rCell, Cells(Lrow, rCell.Column))
        With rCells
            .Sort Key1:=rCell, Order1:=xlAscending, _
                  Header:=xlNo, _
                  OrderCustom:=1, _
                  MatchCase:=False, _
                  Orientation:=xlTopToBottom, _
                  DataOption1:=xlSortNormal
        End With
        Lrow = 0
       
End Sub
Private Function LastRow(rCell As Range) As Long
    Dim Lrow As Long
    Lrow = rCell.End(xlDown).Row
    LastRow = Lrow
End Function
Sub CopyABC()
    Dim rColA As Range
    Dim rColB As Range
    Dim rColC As Range
    Dim rColD As Range
    Dim rCellA As Range
    Dim rCel As Range
    Dim Lrow As Long
    Dim Count As Integer
   
    Set rCellA = Range("A2")
    Lrow = LastRow(rCellA)
    Set rColA = Range(rCellA, Cells(Lrow, rCellA.Column))
   
    Set rCellA = Range("B2")
    Lrow = LastRow(rCellA)
    Set rColB = Range(rCellA, Cells(Lrow, rCellA.Column))
   
    Set rCellA = Range("C2")
    Lrow = LastRow(rCellA)
    Set rColC = Range(rCellA, Cells(Lrow, rCellA.Column))
   
    Set rCellA = Range("D2")
    If Not rCellA.Value = "" Then
        Lrow = LastRow(rCellA)
        Set rColD = Range(rCellA, Cells(Lrow, rCellA.Column))
        rColD.Clear
    End If

    Count = 1
    For Each rCel In rColA
        Count = Count + 1
        Cells(Count, 4) = rCel
    Next
    For Each rCel In rColB
        Count = Count + 1
        Cells(Count, 4) = rCel
    Next
    For Each rCel In rColC
        Count = Count + 1
        Cells(Count, 4) = rCel
    Next
    Call AllSort(rCellA)
End Sub


Jan
Avatar billede Filholm Seniormester
08. juni 2017 - 23:28 #4
Ja, alle navne fra kolonne ABC skal sorteres i kolonne D.
Avatar billede Filholm Seniormester
08. juni 2017 - 23:40 #5
Ok, det virker....men hvis jeg sletter et navn igen, så efterlader regnearket cellen tom. Det gør det ikke hvis man benytter den "oprindelige" kode fra mit første indlæg, der rykker det automatisk navnene op og efterlader ikke nogen tomme celler.

Ellers virker det.
Avatar billede Filholm Seniormester
08. juni 2017 - 23:52 #6
Lige en sidste ting....
Hvad skal jeg ændre i koden hvis jeg gerne vil udvide det fra kolonne ABC til kolonne ABCDEFGH der så skal sorteres i kolonne I
Avatar billede Jan Hansen Ekspert
08. juni 2017 - 23:59 #7
Ang. oprindelig kode så sorterede den her holdet med .
ser lige på koderne og vender tilbage, måske først i morgen
Avatar billede Filholm Seniormester
09. juni 2017 - 00:37 #8
Ja, men det kunne "omgås" ved at kalde holdene - 1.hold, 2.hold osv - for tallet kommer før A i sorteringen.

Jeg har forsøgt at rode med det sidste kode eksempel, for at udvide det til kolonne A-H og en samlet sortering i kolonne I, men må bare indrømme - BAMBI PÅ GLAT IS....:-)

Ellers MANGE tak for hjælpen og jeg kan sagtens vente.

Jon
Avatar billede Jan Hansen Ekspert
09. juni 2017 - 00:43 #9
Her er et system som ikke sorterer 1 række og som kan udvides



Option Explicit
Dim Lrow As Long
Private Sub Worksheet_Change(ByVal Target As Range)
  Vis (False)
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Call AllSort(Range("A2"))
        Call CopyABC
    End If
   
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        Call AllSort(Range("B2"))
        Call CopyABC
    End If
   
    If Not Intersect(Target, Range("C:C")) Is Nothing Then
        Call AllSort(Range("C2"))
        Call CopyABC
    End If
  Vis (True)
End Sub
Sub AllSort(rCell As Range)
    Dim rCells As Range
        Lrow = LastRow(rCell) + 20
        Set rCells = Range(rCell, Cells(Lrow, rCell.Column))
        With rCells
            .Sort Key1:=rCell, Order1:=xlAscending, _
                  Header:=xlNo, _
                  OrderCustom:=1, _
                  MatchCase:=False, _
                  Orientation:=xlTopToBottom, _
                  DataOption1:=xlSortNormal
        End With
        Lrow = 0
       
End Sub
Private Function LastRow(rCell As Range) As Long
    Dim Lrow As Long
    Lrow = rCell.End(xlDown).Row
    LastRow = Lrow
End Function
Sub CopyABC()
    Dim rCol As Range, rSum As Range
    Dim rCellA As Range, rCel As Range
    Dim Lrow As Long
    Dim Count As Integer, iCol As Integer
    ' her under sættes sidste kolonne med holddata
    Const LastCol As String = "C2"
   
    ' her under renses sammenflettet kolonne
    Set rCellA = Range(LastCol)
    Set rCellA = rCellA.Offset(0, 1)
    Set rSum = rCellA
    If Not rCellA.Value = "" Then
        Lrow = LastRow(rCellA)
        Set rCol = Range(rCellA, Cells(Lrow, rCellA.Column))
        rCol.Clear
    End If

    ' her under overføres navne
    Count = 1
    For iCol = 1 To Range(LastCol).Column
        Set rCellA = Cells(2, iCol)
        Lrow = LastRow(rCellA)
        Set rCol = Range(rCellA, Cells(Lrow, rCellA.Column))
       
        For Each rCel In rCol
            Count = Count + 1
            Cells(Count, 4) = rCel
        Next
    Next iCol
   
    Call AllSort(rSum)
End Sub
Sub Vis(bVis As Boolean)
    Application.ScreenUpdating = bVis
End Sub
Avatar billede Filholm Seniormester
09. juni 2017 - 01:51 #10
Kan simpelthen ikke få det til at virke.
Har ændret til følgende.

Option Explicit
Dim Lrow As Long
Private Sub Worksheet_Change(ByVal Target As Range)
  Vis (False)
    If Not Intersect(Target, Range("A:A")) Is Nothing Then
        Call AllSort(Range("A2"))
        Call CopyABCDEFGH
    End If
   
    If Not Intersect(Target, Range("B:B")) Is Nothing Then
        Call AllSort(Range("B2"))
        Call CopyABCDEFGH
    End If
   
    If Not Intersect(Target, Range("C:C")) Is Nothing Then
        Call AllSort(Range("C2"))
        Call CopyABCDEFGH
    End If
   
    If Not Intersect(Target, Range("D:D")) Is Nothing Then
        Call AllSort(Range("D2"))
        Call CopyABCDEFGH
    End If
   
    If Not Intersect(Target, Range("E:E")) Is Nothing Then
        Call AllSort(Range("E2"))
        Call CopyABCDEFGH
    End If
   
    If Not Intersect(Target, Range("F:F")) Is Nothing Then
        Call AllSort(Range("F2"))
        Call CopyABCDEFGH
    End If
   
    If Not Intersect(Target, Range("G:G")) Is Nothing Then
        Call AllSort(Range("G2"))
        Call CopyABCDEFGH
    End If
   
    If Not Intersect(Target, Range("H:H")) Is Nothing Then
        Call AllSort(Range("H2"))
        Call CopyABCDEFGH
    End If
   
  Vis (True)
End Sub
Sub AllSort(rCell As Range)
    Dim rCells As Range
        Lrow = LastRow(rCell) + 20
        Set rCells = Range(rCell, Cells(Lrow, rCell.Column))
        With rCells
            .Sort Key1:=rCell, Order1:=xlAscending, _
                  Header:=xlNo, _
                  OrderCustom:=1, _
                  MatchCase:=False, _
                  Orientation:=xlTopToBottom, _
                  DataOption1:=xlSortNormal
        End With
        Lrow = 0
       
End Sub
Private Function LastRow(rCell As Range) As Long
    Dim Lrow As Long
    Lrow = rCell.End(xlDown).Row
    LastRow = Lrow
End Function
Sub CopyABCDEFGH()
    Dim rCol As Range, rSum As Range
    Dim rCellA As Range, rCel As Range
    Dim Lrow As Long
    Dim Count As Integer, iCol As Integer
    ' her under sættes sidste kolonne med holddata
    Const LastCol As String = "H2"
   
    ' her under renses sammenflettet kolonne
    Set rCellA = Range(LastCol)
    Set rCellA = rCellA.Offset(0, 1)
    Set rSum = rCellA
    If Not rCellA.Value = "" Then
        Lrow = LastRow(rCellA)
        Set rCol = Range(rCellA, Cells(Lrow, rCellA.Column))
        rCol.Clear
    End If

    ' her under overføres navne
    Count = 1
    For iCol = 1 To Range(LastCol).Column
        Set rCellA = Cells(2, iCol)
        Lrow = LastRow(rCellA)
        Set rCol = Range(rCellA, Cells(Lrow, rCellA.Column))
       
        For Each rCel In rCol
            Count = Count + 1
            Cells(Count, 4) = rCel
        Next
    Next iCol
   
    Call AllSort(rSum)
End Sub
Sub Vis(bVis As Boolean)
    Application.ScreenUpdating = bVis
End Sub



DEBUGGEREN SIGER FEJL VED:
            .Sort Key1:=rCell, Order1:=xlAscending, _
                  Header:=xlNo, _
                  OrderCustom:=1, _
                  MatchCase:=False, _
                  Orientation:=xlTopToBottom, _
                  DataOption1:=xlSortNormal
Avatar billede Filholm Seniormester
09. juni 2017 - 02:06 #11
Regnearket ligger her, hvis det er nogen hjælp

http://www.filedropper.com/test_338

Jon
Avatar billede Jan Hansen Ekspert
09. juni 2017 - 05:49 #12
Ny Ver.



Option Explicit
Dim Lrow As Long
' her under sættes sidste kolonne med holddata
Const LastCol As String = "H2"

Private Sub Worksheet_Change(ByVal Target As Range)
    Vis (False)
        'Tjekker om der sker noget i A til LastCol under række 1
        If Not Intersect(Target, Range("A:" & Left(LastCol, 1))) Is Nothing Then
            If Target.Row > 1 Then
                Call AllSort(Cells(2, Target.Column))
                Call CopyABC
            End If
        End If
    Vis (True)
End Sub
Sub AllSort(rCell As Range)
    Dim rCells As Range
        Lrow = LastRow(rCell) + 20
        Set rCells = Range(rCell, Cells(Lrow, rCell.Column))
        With rCells
            .Sort Key1:=rCell, Order1:=xlAscending, _
                  Header:=xlNo, _
                  OrderCustom:=1, _
                  MatchCase:=False, _
                  Orientation:=xlTopToBottom, _
                  DataOption1:=xlSortNormal
        End With
        Lrow = 0
       
End Sub
Private Function LastRow(rCell As Range) As Long
    Dim Lrow As Long
    Lrow = rCell.End(xlDown).Row
    LastRow = Lrow
End Function
Sub CopyABC()
    Dim rCol As Range, rSum As Range
    Dim rCellA As Range, rCel As Range
    Dim lrCell As Range
    Dim Lrow As Long
    Dim Count As Integer, iCol As Integer
   
    ' her under renses sammenflettet kolonne
    Set rCellA = Range(LastCol)
    Set rCellA = rCellA.Offset(0, 1)
    Set rSum = rCellA
    If Not rCellA.Value = "" Then
        Lrow = LastRow(rCellA)
        Set rCol = Range(rCellA, Cells(Lrow + 100, rCellA.Column))
        rCol.Clear
    End If

    ' her under overføres navne
    Count = 1
    For iCol = 1 To Range(LastCol).Column
        Set rCellA = Cells(2, iCol)
        Lrow = LastRow(rCellA)
        Set rCol = Range(rCellA, Cells(Lrow, rCellA.Column))
       
        For Each rCel In rCol
            Count = Count + 1
            Set lrCell = Cells(Count, Range(LastCol).Column + 1)
            lrCell = rCel
            With lrCell.Borders
                .LineStyle = xlContinuous
            End With
        Next
    Next iCol
   
    Call AllSort(rSum)
End Sub
Sub Vis(bVis As Boolean)
    Application.ScreenUpdating = bVis
End Sub



Mvh Jan
Avatar billede Filholm Seniormester
09. juni 2017 - 12:46 #13
BINGO !!!!!!

Det virker.

MEGA mange tak...

Jon
Avatar billede Jan Hansen Ekspert
09. juni 2017 - 12:48 #14
Velbekomme
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

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