dynamische Positionsnummern
#1
Hallo zusammen,

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.
 
Wie könnte so etwas funktionieren?


viele Grüße
Daniel


Angehängte Dateien
.xlsx   dynamische Positionsnummern.xlsx (Größe: 9,46 KB / Downloads: 12)
Top
#2
Hallo Daniel,

wie das funktionieren könnte?

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.


Gruß Carsten
Top
#3
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.
Top
#4
Hallo return,

ich habe hingeschaut, ich sehe nichts.

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. :)


Gruß Carsten
Top
#5
Sad 
Hallo nochmal,

@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.

Würde das so gehen?

vg
Daniel


Angehängte Dateien
.xlsx   dynamische Positionsnummern-040517.xlsx (Größe: 9,44 KB / Downloads: 11)
Top
#6
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:
  • dantri81
Top
#7
Thumbs Up 
Hallo Carsten,

PERFEKT[img]
Dateiupload bitte im Forum! So geht es: Klick mich!
]

Genau so soll es sein!

Vielen Dank für deine kompetente Hilfe!!!


Gruß
Daniel
Top
#8
Hallo Daniel,

Danke. Blush

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. ;)


Bis denne,
Gruß Carsten
Top
#9
Hi,

das ginge auch mit Formeln:

Arbeitsblatt mit dem Namen 'Tabelle1'
 AB
1Pos.Nr.Artikel-Nr.
21 
31.1AS 230
41.2WE 589
51.3RT 236
6  
72 
82.1MN 789
92.2WE 236
102.3KJ 987
113 
123.1FD 683
133.2OU 836
144 
154.1PO 098
164.2QW 197
174.3RE 654
185 
195.1TZ 836
205.2GH 367
215.3PV 963

ZelleFormel
A2=WENN(B2="";WENN(B3="";"";MAX($A$1:A1)+1);MAX($A$1:A1)&"."&ZEILE()-VERWEIS(9;1/($B$1:B1="");ZEILE($A$1:A1)))
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Top
#10
Hallo Edgar,

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?


Gruß Carsten
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste