DVD-Liste automatisch sortieren lassen

  • #1
J

Jad31

Mitglied
Themenersteller
Dabei seit
16.04.2013
Beiträge
8
Reaktionspunkte
0
Hallo erstmals zusammen

Ich habe folgendes Anliegen: Habe selber im Excel eine DVD-Liste erstellt, um meine Sammlung auf Papier (oder eben digital :) ) zu haben. Wenn ich nun einen neuen Titel (oder halt mehrere neue Titel) eingebe, möchte ich, dass es automatisch zu diesem Buchstaben springt wo es gehört und auch automatisch eine neue Nummer zugeordnet bekommt. Wie kann ich das machen? Müssen da Makros eingesetzt werden? Oder funktioniert es auch ohne?

Danke im Voraus für die Antwort.

Liebe Grüsse aus der Schweiz
Jad31
 
  • #2
Ich habe mal ein Makro aufgenommen. Klappt schon sehr gut, aber ein Punkt ist noch nicht geknackt: Ich möchte auch, dass es automatisch eine neue Nummer zugewiesen bekommt. Beispiel: Ich habe einen neuen Film das mi G anfängt. Ich schreibe ihn in einer leeren Zeile die keine Nummer hat. Nun sortiert er mir den Namen und sollte aber auch gleich eine neue Nummer zugewiesen erhalten. Wie mache ich das?
Hier noch den Code:
Sub Sortierung_nach_Nummern()
'
' Sortierung_nach_Nummern Makro
'
' Tastenkombination: Strg+s
'
Columns(B:B).Select
ActiveWorkbook.Worksheets(Tabelle2).ListObjects(Tabelle1).Sort.SortFields. _
Clear
ActiveWorkbook.Worksheets(Tabelle2).ListObjects(Tabelle1).Sort.SortFields. _
Add Key:=Range(Tabelle1[[#All],[Film]]), SortOn:=xlSortOnValues, Order _
:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets(Tabelle2).ListObjects(Tabelle1).Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Range(A3:A5).Select
Selection.AutoFill Destination:=Range(A3:A331), Type:=xlFillDefault
Range(A3:A331).Select
End Sub
 
  • #3
Hallo Jad31,

kannst Du mal ein Probe-Exemplar deiner Datei zur Verfügung stellen ? Vielleicht mit 3-4 Einträgen.

Die Angabe der Excel-Version wäre auch von Vorteil ;)

Die Eingabe im Blatt kann man mit dem Ereignis Worksheet_Change überwachen. Das wird ausgelöst, wenn auf dem Blatt die Eingabe-Taste gedrückt wird. Das Makro müßte dann auf die Spalte(Namen-Spalte) filtern, die das Kriterium für die Einsortierung vorgibt. Wenn also eine Zelle der zu überwachenden Spalte geändert ist, muß das Makro dann zunächst prüfen, ob für diese Zeile bereits eine Nummer vergeben ist. Wenn ja -> nix machen. Wenn nein, stellt es die letzte vergeben Nummer fest, erhöht sie um 1 und trägt sie in die Zeile als neue Nummer ein. Anschließend sortiert das Makro die gesamte Tabelle nach der Namen-Spalte und markiert in der neuen Zeile die Nummer.

Mit gleichzeitiger Eingabe von mehreren Zeilen wird's komplizierter.

Gruß Matjes :)
 
  • #4
  • #5
Hallo Jad31,

ich hab mir die Datei mal angeschaut. Das Besondere daran ist, daß du eine vorgefertigte Liste auf einem Excel-Blatt benutzt. Das bedeutet auch für das Makro Besonderheiten.

Für diese Liste hab ich dir ein Makro geschrieben. (Funktion siehe Kommentare)
Diesen Code müßtest du in einem Modul speichern.
Code:
Sub LfdNrVergeben()

 Const c_BLATTNAME = Tabelle2
 Const c_TAB_NAME = Tabelle1
 Const c_TAB_RANGE_NR = Tabelle1[[#All],[Nr.]]
 Const c_TAB_RANGE_FILM = Tabelle1[[#All],[Film]]
 Const c_SP_NR = 1->SpaltenNr für Nr.
 Const c_SP_FILM = 2->SpaltenNr für Film
 
 Dim ws As Worksheet, tb As Object
 Dim zLetzte_Nr As Long, zLetzte_Film As Long, z_tb_letzte As Long, z_tb_header As Long
 Dim lfdNr As Long, z As Long, zStart As Long
 Dim bErr As Boolean
 
->Blatt setzen
 Set ws = ThisWorkbook.Worksheets(c_BLATTNAME)
->Tabelle setzen
 Set tb = ws.ListObjects(c_TAB_NAME)
->Alle Tab-Filter zurücksetzen
 tb.Sort.SortFields.Clear
 
->letzte Tabellenzeile feststellen
 z_tb_letzte = tb.Range.Row + tb.ListRows.Count
->HeaderzeileNr feststellen
 z_tb_header = tb.HeaderRowRange.Row
 
->Tabelle nach Nummer sortieren, sekundär nach Film sortieren, damit ggf Leerzeilen nach unten verschoben werden
 With tb.Sort
  .SortFields.Clear
  .SortFields.Add _
    Key:=Range(c_TAB_RANGE_NR), _
    SortOn:=xlSortOnValues, _
    Order:=xlAscending, _
    DataOption:=xlSortNormal
  .SortFields.Add _
    Key:=Range(c_TAB_RANGE_FILM), _
    SortOn:=xlSortOnValues, _
    Order:=xlAscending, _
    DataOption:=xlSortNormal
  .Header = xlYes
  .MatchCase = False
  .Orientation = xlTopToBottom
  .Apply
 End With
  
->letzte Zeile in Spalte Film feststellen
 If ws.Cells(z_tb_letzte, c_SP_FILM) <>  Then
  zLetzte_Film = z_tb_letzte
 Else
  zLetzte_Film = ws.Cells(z_tb_letzte, c_SP_FILM).End(xlUp).Row
 End If
->prüfen, ob keine Daten in Spalte Film vorhandnen sind. Ggf. Abbruch
 If z_tb_header >= zLetzte_Film Then MsgBox (Spalte -Film- enhält keine Daten): GoTo AUFRAEUMEN
 
->letzte Zeile in Spalte Nr. feststellen
 If ws.Cells(z_tb_letzte, c_SP_NR).Value <>  Then
  zLetzte_Nr = z_tb_letzte
 Else
  zLetzte_Nr = ws.Cells(z_tb_letzte, c_SP_NR).End(xlUp).Row
 End If
 
->Wenn alle Zeilen in Spalte Film bereits eine Nummer besitzen -> Abbrechen
 If zLetzte_Nr < zLetzte_Film Then
 ->letzte verwendete laufend Nummer feststellen. Bei Fehler erfolgt Meldung und Abbruch.
  If z_tb_header >= zLetzte_Nr Then
   lfdNr = 0
  Else
   On Error Resume Next
   lfdNr = ws.Cells(zLetzte_Nr, c_SP_NR).Value
   If Err.Number <> 0 Then bErr = True
   On Error GoTo 0
   If bErr Then
    ws.Cells(zLetzte_Nr, c_SP_NR).Select
    MsgBox (Fehler: letzte laufende Nr. kann nicht gelesen werden)
    GoTo AUFRAEUMEN
   End If
  End If
  
 ->laufend Nummern eintragen
  zStart = zLetzte_Nr + 1
  For z = zStart To zLetzte_Film
   zLetzte_Nr = zLetzte_Nr + 1
   lfdNr = lfdNr + 1
   ws.Cells(zLetzte_Nr, c_SP_NR).Value = lfdNr
  Next
  
 ->Tabelle nach Film sortieren
  With tb.Sort
   .SortFields.Clear
   .SortFields.Add _
     Key:=Range(c_TAB_RANGE_FILM), _
     SortOn:=xlSortOnValues, _
     Order:=xlAscending, _
     DataOption:=xlSortNormal
   .Header = xlYes
   .MatchCase = False
   .Orientation = xlTopToBottom
   .Apply
  End With
 
 ->letze eingetragene laufende Nummer selektieren
  If ((z_tb_header + 1) <> zLetzte_Nr) Then
   ws.Range(ws.Cells(z_tb_header + 1, c_SP_NR), _
        ws.Cells(zLetzte_Nr, c_SP_NR)).Find(What:=lfdNr, LookAt:=xlWhole).Activate
  Else
   ws.Cells(zLetzte_Nr, c_SP_NR).Select
  End If
 Else
 ->Tabelle nach Film sortieren
  With tb.Sort
   .SortFields.Clear
   .SortFields.Add _
     Key:=Range(c_TAB_RANGE_FILM), _
     SortOn:=xlSortOnValues, _
     Order:=xlAscending, _
     DataOption:=xlSortNormal
   .Header = xlYes
   .MatchCase = False
   .Orientation = xlTopToBottom
   .Apply
  End With
 End If
 
 
AUFRAEUMEN:
 Set ws = Nothing: Set tb = Nothing
End Sub

Für den Automatismus, dass dieses Makro automatisch ausgeführt wird, wenn auf Tabelle2 in Spalte B eine Änderung stattfindet, müßtest du das folgende Makro in die Code-Seite des Blattes einfügen.
Dort gelangst du am einfachsten hin, indem du die Lasche des Blattes markiertst und dannn mit rechte Maustaste->Code anzeigen diese Seite öffnest.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)

 Dim objRange As Range
 Set objRange = Intersect(Target, Range(B:B))->Bereich anpassen
 If Not objRange Is Nothing Then
  Call LfdNrVergeben
 End If
 Set objRange = Nothing
End Sub

Schau mal ob das so passt.

Gruß Matjes :)
 
  • #6
Wow, danke vielmals Matjes!!!! :Froehlich2: Die Codes funktionieren super. Nur ein kleines Detail ist mir aufgefallen: Wenn ich ein neuer DVD einfüge, übernimmt es die Nummer die es auf dieser Zeile erhält, verschiebt es aber mit der Nummer zur Position. Beispiel: The Dark Knight erhält die Zahl 13. Nun verschiebt er den Film zu nach den Filmen mit T samt der Nummer (13 The dark Knight, 10 Transporter). Weisst du was ich meine? :)

Gruss Jad31
 
  • #7
Hallo Jad31,

meine Annahme war: wenn ein neuer Filmname eingegeben wird
- erhält dieser die nächste laufende Nummer, soweit nicht bereits eine Nummer eingetragen ist
- die Zeile entsprechend dem Filmnamen einsortiert wird

Was soll denn passieren ? Bitte beschreibe nicht was er falsch macht, sondern das Verhalten, das du erwartest.

Gruß Matjes :)
 
  • #8
Hallo Matjes

Ok, werde es mal erklären, was es genau machen soll. :)
Wenn ich ein Film hinzufüge,
- soll die Zeile automatisch entsprechend dem Filmnamen einsortiert werden
- die Reihenfolge der Nummern soll nochmals neu formatiert werden (da der Film ja keine Nummer hat und irgendwo dazwischen hinzugefügt wird, soll eine neue Nummerierung durchgeführt werden)

Ich hatte es vorher anders erklärt, aber habe dann beim Ausführen vom Makro gesehen, das es vielleicht auf diese Weise besser funktionieren könnte. :)

Gruss Jad31
 
  • #9
Hallo Jad31,

also prägnanter formuliert:
bei Änderung und Neueingabe von Filmname,
- Zeile(n) entsprechend Filmname sortieren
- Nummerierung der Zeilen mit Filmname neu erstellen

?
Gruß Matjes :)
 
  • #10
Hallo Matjes

Du hast es auf den Punkt gebracht, genau! :)

Gruss Jad31
 
  • #11
Na denn:

Code fürs Modul:
Code:
Function LfdNrVergeben2(z_ersteAenderungsZeile As Long)

 Const c_BLATTNAME = Tabelle2
 Const c_TAB_NAME = Tabelle1
 Const c_TAB_RANGE_FILM = Tabelle1[[#All],[Film]]
 Const c_TAB_RANGE_NR = Tabelle1[Nr.]
 Const c_SP_NR = 1->SpaltenNr für Nr.
 Const c_SP_FILM = 2->SpaltenNr für Film
 
 Dim ws As Worksheet, tb As Object
 Dim zLetzte_Film As Long, z_tb_letzte As Long, z_tb_header As Long
 Dim z As Long, zStart As Long
 Dim sFilmName As String
 
->Blatt setzen
 Set ws = ThisWorkbook.Worksheets(c_BLATTNAME)
->Tabelle setzen
 Set tb = ws.ListObjects(c_TAB_NAME)
 
->editieren Filmnamen retten
 sFilmName = ws.Cells(z_ersteAenderungsZeile, c_SP_FILM).Value
 
->Alle Tab-Filter zurücksetzen
 tb.Sort.SortFields.Clear
 
->letzte Tabellenzeile feststellen
 z_tb_letzte = tb.Range.Row + tb.ListRows.Count
->HeaderzeileNr feststellen
 z_tb_header = tb.HeaderRowRange.Row
 
->Tabelle nach Film sortieren
 With tb.Sort
  .SortFields.Clear
  .SortFields.Add _
    Key:=Range(c_TAB_RANGE_FILM), _
    SortOn:=xlSortOnValues, _
    Order:=xlAscending, _
    DataOption:=xlSortNormal
  .Header = xlYes
  .MatchCase = False
  .Orientation = xlTopToBottom
  .Apply
 End With
  
->letzte Zeile in Spalte Film feststellen
 If ws.Cells(z_tb_letzte, c_SP_FILM) <>  Then
  zLetzte_Film = z_tb_letzte
 Else
  zLetzte_Film = ws.Cells(z_tb_letzte, c_SP_FILM).End(xlUp).Row
 End If
 
->prüfen, ob keine Daten in Spalte Film vorhandnen sind. Ggf. Abbruch
 If z_tb_header >= zLetzte_Film Then MsgBox (Spalte -Film- enhält keine Daten): GoTo AUFRAEUMEN
 
->erste laufend Nummern eintragen
 ws.Cells(z_tb_header + 1, c_SP_NR).Value = 1
 
 If z_tb_header + 1 < zLetzte_Film Then
 ->Splate Nr. fortlaufend nummerieren
  ws.Cells(z_tb_header + 1, c_SP_NR).AutoFill Destination:=Range(c_TAB_RANGE_NR), Type:=xlFillSeries
 
 ->letzten geänderten Filmnamen selektieren
   ws.Range(ws.Cells(z_tb_header + 1, c_SP_FILM), _
        ws.Cells(zLetzte_Film, c_SP_FILM)).Find(What:=sFilmName, LookAt:=xlWhole).Activate
 End If
 
AUFRAEUMEN:
 Set ws = Nothing: Set tb = Nothing
End Function
Code für die Code-Seite der Tabelle:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim objRange As Range
 Set objRange = Intersect(Target, Range(B:B))->Bereich anpassen
 If Not objRange Is Nothing Then Call LfdNrVergeben2(objRange.Row)
 Set objRange = Nothing
End Sub
Gruß Matjes :)
 
  • #12
Wow!! Super, danke vielmals! Habe echt freude! Nun geht alles einfacher, schneller und es ist alles korrekt sortiert!! :)

Gruss Jad31
 
  • #13
Hallo Jad31

schreibe Dir eine PN.
 
  • #14
Hallo

Ich habe mit Bewilligung von Jad diese DVD-Liste auch angepasst mit den Makros
von Matjes.

Nun habe ich aber folgendes Problem;
Sobald ich das Makro in den VB-Editor kopiert habe und das 2. Makro in die Codeseite,
funktioniert es zwar wunderbar, aber die Makros und die Codeliste sind verschwunden.
Auch mit F11 komme ich keine Makros mehr zu Gesicht.

An was kann das liegen?
 
  • #15
Also in meinem Excel(2007) fügt F11 ein Diagramm ein.
Mit Alt + F11 schalte ich in VB-Editor.

Gruß Matjes :)
 
  • #16
Ich habe das Excel 2013

War nur ein Schreibfehler, ich meinte natürlich Alt+F11

Bei mir kommt da gar nichts.
 
  • #17
Hast du Excel mal komplett geschlossen und wieder geöffnet ?

Gruß Matjes :)
 
  • #18
Ja klar.

Vielleicht sollte ich einmal die Datei hier einstellen.

ich bekomme nur noch den 2. Teil des Makros.
bitte .jpg wieder wegnehmen.
 
  • #19
Also mit Office 2013 respektive dessen VB-Editor hab ich keine Erfahrung.

Aber du könntest Folgendes tun um zu LfdNrVergeben2 zu gelangen.

a) LfdNrVergeben2 markieren
b) dann rechte Maustaste -> Definition

Dann müßte die Ansicht zu LfdNrVergeben2 springen.

Gruß Matjes :)
 
  • #20
Wie meinst Du das?
 
Thema:

DVD-Liste automatisch sortieren lassen

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben