ich möchte in einem Tabellenblatt die Positionsnummern dynamisch aktualisieren lassen. Im Anhang ein Beispiel wie das ganze aussehen kann:
Im Beispiel sind die Pos 1; 2; 2.1; 2.2; 2.3; und 3 Gliederungspositionen. Das heißt diese Positionen haben keine Artickelnummer. Unter den Gliederungspositionen befinden sich dann die Artickel-Nr., welche dann Unterpositionen darstellen. Es können in meinem Fall aber nur max. zwei Gliederungspositionen direkt untereinander stehen. (siehe Beispiel Pos.Nr. 2)
Mit einem aufgezeichneten (relative Aufzeichnung) Makro füge ich nun oberhalb einer beliebigen Zeile eine neue Zeile ein. Diese Zeile kann eine Gliederungsposition (ohne Artickelnummer) oder auch eine Unterposition (mit Artickelnummer) sein.
Unter einer neu hinzugefügten Gliederungsposition können auch viele neue Unterpositionen eingefügt werden. In jedem Falle müssen dann die Positionsnummern dynamisch angepasst werden.
Aktuell gar nicht. Denn woher soll die Routine erkennen, warum es von '2.2.2' auf '2.3' hochzählen soll, im nächsten Schritt dann aber von '2.3.3' auf '3'?
Da musst Du Dein Konzept noch einmal durchdenken, da fehlt noch etwas bei der Zusammenstellung. Helfen kann Dir keiner so richtig, da niemand Deine Vorgänge kennt.
03.05.2017, 20:02 (Dieser Beitrag wurde zuletzt bearbeitet: 03.05.2017, 20:02 von lupo1.)
Das ist vom Ergebnis her eindeutig, DbSam. Schau noch mal genau hin!
Problem ist nur, dass beim Einfügen die Artikel-Nr. im Moment des Einfügens noch nicht drin steht. Ein Change-Ereignis muss also auf das Eintragen oder Löschen der Artikel-Nr hin reagieren und dann die Nummerierung aufbauen. Das Einfügen der Zeile kann dies nur vorläufig tun (Selection_Change), muss es aber auch tun, weil die Art-Nr. ja auch leer bleiben könnte, und somit eine Zwischenüberschrift (höhere Hierarchie) entstünde.
Ich weiß auch nicht was schon vorhanden ist und was dynamisch sein soll. Und woher vielleicht die ersten Nummern kommen sollen, per Hand, per Zauberei. Das Konzept klingt nicht richtig gesund.
Ansonsten, soll doch das Makro nachschauen und nach unten korrigieren ... So ohne Beispieldatei mit vorher, nachher und dem Makro ist alles Murks. :)
@DbSam: Du hast Recht! So ist das totaler Murks! Ich habe die Sache nicht ganz zu Ende gedacht, Sorry!
Ich habe die Anforderungen jetzt geändert: Es gibt jetzt keiner 3er Gliederung mehr, sondern nur noch 2-er Gliederungen (siehe neue xlsx-Datei im Anhang).
Vorhanden sind die Artickelnummern in Spalte B. Die Spalte A mit den Positionsnummern soll vollständig neu dynamisch generiert werden. Es können allerdings auch mehrere Gliederungspositionen untereinander stehen. (siehe Zeile 6 und 7). Wenn das der Fall ist, soll nur die Gliederungsposition eine Positionsnummer bekommen, unter welcher auch direkt Artickelnummern vorhanden sind.
Dann möchte ich im nachhinein weitere Artickel-nr. und Gliederungspositionen an beliebiger Stelle einfügen können. (relativ aufgezeichnetes Makro==> STRG+V) Wenn man dieses Makro ausführt steht natürlich in der entsprechenden Zelle in Spalte B keine Artickelnummer. Dann ist diese Position ein Gliederungsbaustein. Trage ich jetzt manuell in die selbe Zelle eine Artickelnummer ein, verwandelt sich diese Position in eine Artickel-position und die Positionsnummern müssen sich anpassen.
04.05.2017, 20:43 (Dieser Beitrag wurde zuletzt bearbeitet: 04.05.2017, 20:46 von DbSam.)
Hallo Daniel,
gut, dieser Wunsch ist logisch lösbar. Vorher konnte der Wechsel auf logischer Basis nicht erkannt werden.
Da Du sowieso schon Makros im Einsatz hast, habe ich ebenfalls eine Makrolösung gebaut. Bitte diesen Code hinter Dein Sheet legen:
Code:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo Er Dim lastRow As Long
'geprüft wird Spalte B mit den Artikelnummern 'wenn diese nicht in Spalte B sind, dann bitte entsprechend anpassen lastRow = IIf(IsEmpty(Cells(Rows.Count, 2)), Cells(Rows.Count, 2).End(xlUp).Row, Rows.Count) If Not Intersect(Range("B2:B" & lastRow), Target) Is Nothing Then Application.EnableEvents = False CreateMyItemNumbers End If
Ex: Application.EnableEvents = True Exit Sub Er: Application.EnableEvents = True MsgBox Err.Description, vbCritical, "Sub: Worksheet_Change in Tabelle1" Resume Ex 'For debug: Resume End Sub
Private Sub CreateMyItemNumbers() Dim irow As Long, icol As Long, firstRow As Long, currentNumber As String
icol = 1 'die Spalte für Deine Nummern firstRow = 2 'die erste mögliche Zeile für Deine Nummer
For irow = firstRow To IIf(IsEmpty(Cells(Rows.Count, icol + 1)), Cells(Rows.Count, icol + 1).End(xlUp).Row, Rows.Count) currentNumber = CheckEntries(irow, icol, currentNumber) Next irow End Sub
Private Function CheckEntries(ByVal irow As Long, ByVal icol As Long, ByVal currentNumber As String) As String 'es wird davon ausgegangen, dass die Spalte mit den Artikelnummern 'rechts neben der Nummernspalte ist. 'Falls nicht, dann bitte iCol+1 dementsprechend anpassen If Cells(irow, icol + 1) = vbNullString Then If Cells(irow + 1, icol + 1) = vbNullString Then Cells(irow, icol) = vbNullString Else currentNumber = GetNextNumber(currentNumber, True) Cells(irow, icol) = currentNumber End If Else currentNumber = GetNextNumber(currentNumber, False) Cells(irow, icol) = currentNumber End If CheckEntries = currentNumber End Function
Private Function GetNextNumber(ByVal currentNumber As String, ByVal isNewNumber As Boolean) As String Dim s() As String If currentNumber = vbNullString Then GetNextNumber = "1" Else s = Split(currentNumber, ".") If isNewNumber Then GetNextNumber = CStr(CInt(s(0)) + 1) Else If UBound(s) = 0 Then GetNextNumber = s(0) & ".1" Else GetNextNumber = s(0) & "." & CStr(CInt(s(1)) + 1) End If End If End If End Function
Dieser Code wird immer ausgelöst, wenn sich in Deiner Artikelspalte etwas ändert.
Geht vielleicht auch kürzer, aber so solltest Du es noch lesen und ohne weitere Hilfe für Deine Bedürfnisse anpassen können.
Gruß Carsten
Edit: Lasse bitte mal die Rechtschreibprüfung über Deine 'Artickel' laufen. ;) Also wenigstens im Excelsheet.
Folgende(r) 1 Nutzer sagt Danke an DbSam für diesen Beitrag:1 Nutzer sagt Danke an DbSam für diesen Beitrag 28 • dantri81
Wenn ich schon Deine erste Aufgabenstellung mit den gegebenen Bedingungen (richtigerweise) als unlösbar und öffentlich als 'Murks' bezeichnet habe, dann war ich doch nun regelrecht dazu verpflichtet Dir eine Lösung zu liefern. ;)
ja, dachte ich auch erst. Dann müsste aber sein Makro beim Einfügen von Zeilen gleichzeitig auch die Formeln anpassen, um die Bezugsfehler zu vermeiden. Oder sehe ich das falsch?