Excel alle Versionsnummern eines Teils in einer Zeile aufzählen

T

tnevermind

Gast
Hallo,
ich habe ein Problem, dass ich bei der Arbeit viele ähnliche Bauteile habe welche sich oft nur im Suffix/Version unterscheiden, für bestimmte Prozesse brauche ich nun aber, dass hinter jedem Teil schnell zu erkennen ist, wie viele es davon gibt und welche anderen Versionen vorhanden sind. Das können bis zu 10 stk sein. Geht oft um Datenmengen, wo man längst Datenbank Software benutzen sollte, es aber oft nicht geht (5000+ Teile)

Z.B. so

Bildschirmfoto 2018-02-22 um 18.56.35.png

Die ersten 3 Spalten haben wir immer, die 4. soll erstellt werden. Ich kann zwar einiges in Excel aber das missglückt mir immer. Größtes Problem an der Sache, es muss möglichst OHNE Makro und minimum 10 Versionen handeln können.


Vielen Dank für die Hilfe

Ach zu allem Ärger sind nicht immer die Teile sortiert....
 
Du könntest mit serverweis alle Zellen der ersten Spalte mit je gleichem Inhalt zählen lassen und in die 4 Spalte eintragen lassen. Dafür müsste den die Werte in der ersten Spalte exakt gleich geschrieben sein, inkl. Leerzeichen.
Problem in Excel: Pro Zelle kann es nur einen Wert/Ergebnis geben... Das wäre aber durch die Verkettung der in Text umgewandelten Ergebnisse von Sverweis vielleicht noch umständlich lösbar, aber...
weiteres Problem: Excel kann die Formel zur Verkettung nicht dynamisch in Abhängigkeit der Suffixe erstellen. Und selbst wenn das Ginge, wäre Excel schätzungsweise Stunden mit den Berechnungen beschäftigt, da es nicht parallelisiert und sehr inperformant ist. Ich glaube mich zu erinnern, das Excel solche Berechnungen nach einer gewissen Zeit abbricht.
Das ginge nur mit VBA, aber das beherrsche ich nicht.
Ich kann dir nur vorschlagen, die Excel so zu gestalten, dass du für jede Version/Suffix eine Spalte (also immer 10) vorsieht und entsprechend eng machst. Aber selbst dann kann es an der Rechendauer scheitern.

Edit
Ich schlage dringend die Verwendung von Access vor. Da kann man sich eine Maske basteln, die einem das schön aus gibt.

Edit 2
Man kann in Excel sortieren lassen ;)
 
Zuletzt bearbeitet:
Vielleicht kannst du mit Pivot etwas rumspielen.
Ich habe jetzt für deinen Beispiel so eine Ansicht gemacht.
Pivot.PNG

Wenn da mehr Teile in der liste sind, muss man sich überlegen wie man am besten das ganze Anordnet.
Ansonsten müsste man, wenn man dynamisch die ganze Geschichte realisieren muss, mit verschachtelten Formeln arbeiten was relativ komplex sein dürfte. Ein Macro in VBA wäre, zumindest aus meiner Sicht etwas besser.
 
Notfalls auch mit vba . Wenn das jemand hier kann nehme ich das gerne. Anpassen sollte ich schaffen. Nur brauche ich genau die Form . Ist nicht so einfach mit seit Jahrzehnten eingefahrenen Kollegen....
 
Überall wo hier "Duplikat" steht, soll hinters 1 Original.
Also könntest du alle nicht benötigten Zeilen ausblenden oder ähnliches, wenns in einer Formel geht.

Die gesuchten Infos wären dann aber untereinander, nicht nebeneinander.

Nachtrag:
ich finde das jedenfalls eine Grundidee.
 
Zuletzt bearbeitet:
Wie ging es denn früher? Oder hat sich etwas geändert? Wenn ja, sollte zu erwarten sein, dass sich die Kollegen anpassen. Es soll Leute geben, die sich weigern, bei einem Wechsel der Mailsoftware (z.B. weil die alte keinen Support mehr bietet) diese zu benutzen. Sie hätten nur noch 5 Jahre bis zur Rente und würden jetzt nicht mehr anfangen, was neues zu lernen (Tastenkombination, Anhängen von Makros, Archive,...). Diese Kollegen haben dann doch was neues gelernt. Wie ziehe ich eine Nummer beim Amt.
Ergänzung ()

engine schrieb:
Überall wo hier "Duplikat" steht, soll hinters 1 Original.
Also könntest du alle nicht benötigten Zeilen ausblenden oder ähnliches, wenns in einer Formel geht.

Die gesuchten Infos wären dann aber untereinander, nicht nebeneinander.
Das funktioniert so nicht, da nicht geprüft wird, ab die Kombination aus erster und zweiter Spalte doppelt ist und selbst wenn, weiß er dann wieder nicht, welche Einsen er zusammenzählen muss.
 
scooter010 schrieb:
Wie ging es denn früher? Oder hat sich etwas geändert? Wenn ja, sollte zu erwarten sein, dass sich die Kollegen anpassen. Es soll Leute geben, die sich weigern, bei einem Wechsel der Mailsoftware (z.B. weil die alte keinen Support mehr bietet) diese zu benutzen. Sie hätten nur noch 5 Jahre bis zur Rente und würden jetzt nicht mehr anfangen, was neues zu lernen (Tastenkombination, Anhängen von Makros, Archive,...). Diese Kollegen haben dann doch was neues gelernt. Wie ziehe ich eine Nummer beim Amt.
Ergänzung ()

Das funktioniert so nicht, da nicht geprüft wird, ab die Kombination aus erster und zweiter Spalte doppelt ist und selbst wenn, weiß er dann wieder nicht, welche Einsen er zusammenzählen muss.

Richtig Zaehlenwenn geht nicht.

"Früher" sprich aktuell, geht es so:
-Meeting steht an es sollen Baulisten(80Teile+) für Tests besprochen werden und Teileverfügbarkeit/Nachbestellbedarf geprüft werden.
-Dem Praktikant/Student wird gesagt, wir brauchen bis morgen in der Bauliste ein Feld in dem alle Versionen mit Anzahl von allen Levels aufgeführt sind. Es wird unterschieden in Neuteile und Gebrauchtteile.
-Der Praktikant/Student darf sich durch eine nahezu vollständig gesperrte 5000xBY Liste wühlen, muss alles Filtern und kann dann per Hand alles eintragen.

Ich bin der Praktikant/Student und hab da keinen Bock mehr drauf. Warum man das so seit 10Jahren+ in einem Unternehmen mit 10000+ Mitarbeitern handhabt....keine Ahnung

Aktuell kopiere ich die Tagesaktuelle Monsterliste in eine von mir erstellte "Schablone" welche dann schon kräftig vorsortiert etc etc. Dennoch muss ich am Ende die ganzen Versionen einzeln in jeweils ein Feld eintragen. Wie oben beschrieben halt. Das das Quatsch ist , weiß ich auch, wollen aber die weitaus Ranghöheren Mitarbeiter nicht ändern. Ka Arbeitsplatzerhaltung oder so
 
Zuletzt bearbeitet von einem Moderator:
Letztendlich hast du eine dreidimensionale Tabelle aber nur zweidimensionale Funktionen um sie darauf anzuwenden.
Ich persönlich würde mir die Daten in eine durch Trennzeichen und Zeilenumbruch formatierten Textdatei (quasi eine Datenbank) exportieren und darauf ein fix selbst programmiertes Programm los lassen, welches die Ergebnisse in eine neue Datei schreibt und diese wieder nach Excel importieren.
Ich fürchte, die Optionen/Fähigkeiten besitzt du nicht?

Edit: Ich würde dir ja anbieten, dies zu programmieren und zu kompilieren und zu schicken, aber ich bin auf Dienstreise und habe keinen PC. Außerdem würde ich einen Praktikanten feuern, der eine Software eines unbekannten Foristen auf Firmeninterne/Geheimnisse los lässt, sofern ich davon Wind bekäme.
 
Zuletzt bearbeitet:
Hi, hab dir das Macro geschrieben.
Ist zwar ein erster Entwurf und hat kein Schönheitsanspruch, du kanns es aber weiter ausbauen ;)

Momentan ist da ein Knopf, den du jedes mal neu drücken musst, wenn neuer Artickel reinkommt. Damit wird die gesamte liste neu berechnet.

Man kann, wenns benötigt wird, jedes mal wenn die Excel Datei geladen wird, das ganze beim Start durchlaufen.

Anhang anzeigen Berechnung.zip

Das ist der dahinter liegender VBA-Code
Code:
Sub AbgerundetesRechteck1_Klicken()
    Dim strWert As String
    Dim strVergleichsWert As String
    Dim counter As Integer
    Dim letzterWert As Integer
    
    strVergleichsWert = Range("A" & 2)
    strWert = ""
    counter = 0
    letzterWert = Sheets(1).UsedRange.SpecialCells(xlCellTypeLastCell).Row
    For i = 2 To letzterWert + 1
GoBack:
        With Sheets(1)
            If .Range("A" & i) = strVergleichsWert Then
                strWert = strWert & .Range("C" & i) & " " & .Range("B" & i) & "; "
                counter = counter + 1
            Else
                strVergleichsWert = .Range("A" & i)
                .Range("D" & i - counter & ":D" & i - 1).Value = Left(strWert, Len(strWert) - 2)
                strWert = ""
                counter = 0
                GoTo GoBack
            End If
        End With
    Next i
    
End Sub

P.S.
Natürlich muss die liste auch so sortiert sein, das die Part-Namen in der auf- bzw. absteigenden Reihenfolge hintereinander sind.
 
Zuletzt bearbeitet:
Der Praktikant/Student sollte ein Tool and die Hand bekommen, mit welchem er diese Aufgabe ganz schnell und unkompliziert loesen kann. Besser noch, er hat ein Tool und keiner weiss es. Das kommt besonders gut, wenn es ploetzlich jemand anderes machen muss :evillol:

Wie auch immer, ich habe mal das Sheet von G-Red genommen und ein bisschen aufgebohrt (sorry G dafuer). Damit ist es jetzt eine Datenbank (sorry CN8 dafuer) und es ist praktisch egal ob die Liste sortiert ist. Wichtig ist nur das keine leeren Zeilen dazwischen sind, denn das ist die Exit-Bedingung (koennte aber alles angepasst werden).

Funktioniert leider nicht auf Macs und vielleicht auch nirgendwo ausserhalb meines Excel.

Man muss halt mal schauen wie performant das Teil bei 5000 Zeilen ist, kann sein dass es eine Weile dauert.

Btw: Ich uebernehme keine Verantwortung fuer irgendwelche verlohrenen Daten durch die Nutzung dieses Tools.

Anhang anzeigen TeileListe.zip

Hier das Modul:
Code:
Option Explicit

Sub AbgerundetesRechteck1_Klicken()
Dim db As MakeItADatabase
Set db = New MakeItADatabase

Dim x As Long 'row counter
x = 1 'ignore header

db.SetSheet = ThisWorkbook.Sheets.Item(1)

With ThisWorkbook.Sheets.Item(1)
    Do
        x = x + 1
        .Cells(x, 4).Value = db.GetAllVersions(.Cells(x, 1), CInt(.Cells(x, 2)))
    Loop Until .Cells(x, 1) = ""
End With

Set db = Nothing
End Sub

Hier die Datenbank Klasse:
Code:
Option Explicit

Private cN As Object
Private rs As Object
Private strTable As String

Private Sub Class_Initialize()
Set cN = CreateObject("ADODB.Connection")
cN = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
               "Data Source= " & ThisWorkbook.FullName & ";" & _
               "Extended Properties=""Excel 12.0; HDR=Yes;"""
cN.Open
End Sub

Public Property Let SetSheet(ByVal sh As Worksheet)
    strTable = sh.Name
End Property

Public Property Get SetSheet() As Worksheet
    Set SetSheet = ThisWorkbook.Sheets(strTable)
End Property

Public Function GetAllVersions(ByVal refTeil As String, ByVal vers As Integer) As String
Dim strTemp As String

'Version excluded
'GetRecordset "SELECT * FROM [" & strTable & "$] WHERE Part LIKE '" & refTeil & "' AND NOT Version = " & vers & " ORDER BY Version asc;"

'Version included
GetRecordset "SELECT * FROM [" & strTable & "$] WHERE Part LIKE '" & refTeil & "' ORDER BY Version asc;"

Do Until rs.EOF
    If Len(strTemp) > 0 Then strTemp = strTemp & "; "
    strTemp = strTemp & rs.Fields(2).Value & " " & rs.Fields(1).Value
    rs.movenext
Loop

GetAllVersions = strTemp

strTemp = ""
Set rs = Nothing
End Function

Private Sub GetRecordset(ByVal sql As String)
Set rs = CreateObject("ADODB.recordset")
rs.Open sql, cN, 2, 1
End Sub

Private Sub Class_Terminate()
cN.Close
End Sub

Das Teil koennte man dann noch zu einem Add-In machen. Vorm naechsten Meeting einfach die Liste oeffnen, Daten in ein neues Sheet kopieren und Knopf druecken. Ich wuerde erstmal davon abraten die originale Liste da durch zu jagen :pcangry:

Viel Spass :lol:
 
@all vielen vielen Dank

@Janush ich werde mir mal den Code anschauen und gucken ob ich Ihn angepasst bekomme. Kann zwar kein VBA aber rudimentäre C, Java und PhP Kenntnisse lassen einen dann doch den ein oder anderen Code verstehen. Ich schau mal ob ich die Exit Bedingung bei "" lasse oder Stumpf bis Zeile 10000 prüfen lasse.

Das Tool wird dann natürlich an die nächsten Praktikanten weiter gegeben :D Ich finde es immer schwer in so eingefahreren Strukturen die Produktivität zu verbessern ohne jemandem auf den Schlips zu treten, aber die aktuelle Lage ist halt Schwachsinn.
 
Zuletzt bearbeitet von einem Moderator:
Deswegen machs dir so einfach wie möglich, wenn die Leute an der Arbeit lernresistent sind ;). Das ist dann leider die Sorte, die anfangen umzukrämpeln, wenn die Sch**ße auf die Füße gefallen ist. Dann aber wollen die so schnell und so günstig wie möglich. Damit wird dann noch mal ein Mißt mehrere Jahre genuzt bis dann entweder Konkurs oder jemand tatsächlich sich Gedanken macht ;).

Edit1:
Man könnte, wenn man keine DB Nutzen will, die Lösung von mir oder Janush, soweit anpassen, dass die Datei mit dem VBA Code als Masterdatei dient, in die ein Mensch mit Verständniss der Sache, Einträge macht. Anschlißend drückt dieser Mensch den Knopf und es wird eine aktuelle Kopie der Artickel irgendwo auf dem Laufwerk erzeugt und das Täglich oder nach einem vorbestimmten Interval.
 
Zuletzt bearbeitet:
@G-Red ich baue grade Janush Version um, da die natürlich nur für die Beispielliste geht und nicht für die echte. Da sind die Versionen nämlich keine Int sondern Strings =)
 
Ich wusste das kommt zurück und beißt mich in den A**** :-)

Die kannst du auch ganz rauslassen, da sie nur gebraucht wird, wenn du die Version in der eigentlichen Zeile nicht anzeigen willst.
 
Zuletzt bearbeitet:
Finde die Lösung von Janush sehr interessant, habs so noch nicht probiert wieder was interessantes gelernt :). Ich denke für dein Fall ist das zu viel Aufwand. Vor allem auch wenn deine Tabelle 5000 Einträge hat, ist das mit meinem Script sehr schnell durchlaufen. Wobei das Script von Janosh, wenn ich das richtig gesehen habe, ebenfalls jedes mal sucht und nach dem durchlaufen den Eintrag pro Zeile macht.

Ist jetzt keine Kritik und kein Versuch meine Lösung beser darstellen zu lassen :), aber wenn man schon wie mit einer DB arbeiten will, soll dann auch eine DB dahinter sein und auch eine entsprechende Anwendung.
 
Nur zur Sicherheit hier nochmal eine Version welche die Versionsnummer als String einliesst. Wie du sehen kannst hat die Klasse zwei SQL Statements, das erste excludiert die Version in der Abfragezeile und das zweite nimmt alles mit. Hier einfach durch auskommentieren das richtige auswaehlen :-)

Anhang anzeigen TeileListe.zip

G du hast natuerlich Recht, es ist viel Aufwand pro Zeile eine neue Abfrage zu schicken, aber hey....5000 Zeilen sind jetzt auch ned die Welt und du musst die Liste nicht sortieren.


PS: Bevor ich es vergesse, das Ding funktioniert nur wenn die Header in der ersten Zeile sind, sonst wirds komplizierter.
 
Zuletzt bearbeitet:
Hi Janush, ich muss mich bei dir doch revangieren :D.. hab heute irgendwie Spaß dran und habe deine Lösung auch ein wenig angepasst.

Jetzt schreibt er nicht pro zeile ein und den selben String, sondern zählt die anzahl der gleichen Vorkommnisse (Part) und macht das in eine Range. Dann spring das Programm einfach weiter ohne mit dem Selben Wert einen erneuten Durchlauf zu machen.

Hier die Etwas angepasste Funktion
Code:
Sub AbgerundetesRechteck1_Klicken()
Dim db As MakeItADatabase
Dim strResult As String
Dim intRowsOnSemicolon As Integer
Set db = New MakeItADatabase
 
Dim x As Long 'row counter
x = 1 'ignore header
 
db.SetSheet = ThisWorkbook.Sheets.Item(1)
With ThisWorkbook.Sheets.Item(1)
    Do
        x = x + 1
        If .Cells(x, 1) = "" Then Exit Sub
        strResult = db.GetAllVersions(.Cells(x, 1), .Cells(x, 2))
        intRowsOnSemicolon = UBound(Split(strResult, ";"))
        
        .Range("D" & x & ":D" & x + intRowsOnSemicolon) = Left(strResult, Len(strResult) - 2)
        x = x + intRowsOnSemicolon
        strResult = ""
    Loop Until x = 0
End With

Set db = Nothing
End Sub
 
Zuletzt bearbeitet:
Janush schrieb:
Nur zur Sicherheit hier nochmal eine Version welche die Versionsnummer als String einliesst. Wie du sehen kannst hat die Klasse zwei SQL Statements, das erste excludiert die Version in der Abfragezeile und das zweite nimmt alles mit. Hier einfach durch auskommentieren das richtige auswaehlen :-)

Anhang anzeigen 668177

G du hast natuerlich Recht, es ist viel Aufwand pro Zeile eine neue Abfrage zu schicken, aber hey....5000 Zeilen sind jetzt auch ned die Welt und du musst die Liste nicht sortieren.


PS: Bevor ich es vergesse, das Ding funktioniert nur wenn die Header in der ersten Zeile sind, sonst wirds komplizierter.


Hab ich gesehen, so weit reichen meine neu gewonnene VBA Kentnisse schon, Vielen Dank!

Ihr seid ja richtig eifrig hätte ja gar nicht not getan, aber abermals vielen Dank !
 
...
VBA ist einfach der bessere und vor allem einfachere Weg :) .
 
Zuletzt bearbeitet:
Hey G,

hab deine Antwort gerade erst gesehen. In der Tat eine clevere Umsetzung welche enorm Zeit spart wenn es mal ein paar mehr Zeilen sind. Immerhin ca. 2/3 weniger SQL Anfragen.

Allerdings muss hierfuer die Tabelle auch sortiert sein. Zwar nur die erste Spalte, aber immerhin. Sollte hier irgendwo 1 unsortierter Wert drin stehen, ist das gesamte Ergebnis falsch.

Aber ich mag den Gedanken nur einmal pro Produktgruppe eine SQL Abfrage zu schicken. Man muesste das ein bisschen umbauen und mit dem RecordSet arbeiten, oder so :-)
 
Zurück
Oben