INDEX-Rechnung, Excel-Formel

Isaaaaaabell

Cadet 2nd Year
Registriert
Apr. 2014
Beiträge
17
Guten Morgen zusammen,

beim letzten Mal hat das so super geklappt. Jetzt hoff ich ihr könnt mir bei diesen einem Problem nochmal helfen.

Im Anhang seht ihr eine Ausgangsdatei und rechts die Lösung, wie ich es gerne hätte.
Anhand der Ähnlichkeit in der Ausgangsdatei sollen rechts in der Lösung alle Materialien mit einer Ähnlichkeit mit dem Wert 1 erscheinen, gibt es keine Ähnlichkeiten mit Wert 1, sollen alle Ähnlichkeiten größer 0,95 erscheinen, existieren auch keine Ähnlichkeiten größer 0,95, sollen alle Ähnlichkeiten größer 0,9 erscheinen.
Das Problem hierbei ist, dass das immer unterschiedlich viele Materialien sein können. Manchmal sind es nur 2, manchmal aber z.B. 10.

Habt Ihr Ideen wie ich das Problem lösen könnte? Wäre hier womöglich eine INDEX-Rechnung hilfreich?

Danke schonmal an alle Helfer!

Grüße
isabell
 

Anhänge

  • Beispiel.docx
    43 KB · Aufrufe: 137
Hi Isabell,

eine fertige Lösung kann ich dir hier nicht bieten. Ich geh aber davon aus, dass du das über ein Makro lösen musst, also über VB Code.
Dabei kannst du alle Zeilen durchlaufen (Dann ist die Anzahl der Materialien egal), und du kannst mit if,elseif,else deine Ähnlichkeiten abschätzen.
Dann kannst du auch das fertige Ergebnis auf die Excel Tabelle malen.
 
Mmh das hört sich ziemlich kompliziert an.
Leider hab ich keine Erfahrung mit VBA.

Schade, ich dachte ich könnte das "einfacher" lösen.
 
Hi,

der Name Ausgangsdatei impliziert ja schon irgendwie, dass es keine Quelldatei ist, sondern schon irgendwie berechnet wird. Und genau hier würde ich ansetzen und dann ein zweites Tebellenblatt erstellen, bei dem nach Ähnlichkeiten gefiltert wird. Kommt natürlich darauf an wo die Tabelle herkommt. Bei einem proprietären Warenwirtschaftssystem wird die Änderung einiges an Geld kosten, ein bestehendes Skript kann man relativ leicht ändern.

Ansonsten nach Ähnlichkeit sortieren und die unteren Zeilen - bei denen ein bestimmter Wert unterschritten wird - abschneiden? Da gibt es viele Lösungen, um VB.Net oder einem C# Worksheet wirst du nicht drumherum kommen.
 
Das Problem ist das ich keinerlei Erfahrung im Bereich VBA habe.
Die Ausgangsdatei soll so bestehen bleiben wie sie ist.
Stimmt die Ähnlichkeiten berechnen sich anhand mehrerer Parameter.

Dachte vll kann man über eine INDEX-Rechnung einfach alle Werte größer 0,9 filtern.
Gibt es diese Möglcihkeit nicht?
 
Das Problem ist vielmehr die Iteration, dass nacheinander in fünfer Schritten nach der Ähnlichkeit geprüft werden soll. Das nächste ist die Sortierung und das Dritte, dass die Ausgangsgröße variabel ist. Um das alles zu berücksichtigen braucht es schon einiges an WennDann-Anweisungen und kleine Änderungen sind im Nachhinein fast unmöglich bzw. viel zu zeitaufwändig.

Soll die Lösung dann genauso in der rechten Hälfte des gleichen Tabellenblattes stehen oder soll ein neues Excel-Dokument entstehen? Soll sich die Tabelle automatisch "updaten"?
 
Wenn es möglich wäre, dass es genau so rechts neben der Ausgangsdatei steht - wäre es perfekt.

Ich merk schon das es sehr kompliziert ist. Sitze selbst seit Ewigkeiten drüber und versuch mit irgendwelchen verrückten Formel zu einer Lösung zu kommen.

Vielen Dank schonmal für die Hilfe.
 
Wenn es bis morgen Abend reicht, würde ich mich mal daran versuchen. Dazu bräuchte ich noch ein paar Informationen:
Soll die Ausgabe automatisch aktualisiert werden? Welche Excel-Version benutzt du?
 
Ach das wäre perfekt!
Morgen würde reichen, ja.

Die Ausgabe müsste sich immer automatisch aktualiesieren, ja. Die Ähnlichkeiten, auf dessen Grundlage die Filterung ja stattfinden soll, berechnen sich je nach Eingabedaten nämlich auch jedes mal neu.

Ich arbeite mit Microsoft Excel 2007.

Wäre super wenns klappt.
Vielen vielen Dank!
 
Also ich sehe hier 3 Möglichkeiten OHNE ein VBA-Skript oder Makro nutzen zu müssen:

1. Lösung - Pivottabelle
Zeilenbeschriftung = Materialtabelle, dort dann "Wertefilter/Zwischen" mit Bezug auf "Summe von Ähnlichkeiten".

Nachteile: für jedes Kriterium eine extra Tabelle, in deinem Fall 3. Muss manuell aktualisiert werden wenn sich die Quelle ändert, außer du öffnest das Dokument neu (dann automatisch).

2. Lösung - bedingte Formatierung
Du ermittelst erst den Schwellenwert in der Ausgangsspalte der Ähnlichkeiten in irgend einer freien Zelle
=WENN(MAX(G4:G16)=1;1;WENN(MAX(G4:G16)>=0,95;0,95;WENN(MAX(G4:G16)>=0,9;0,9;"<0,9")))

Dann benutzt du diese Formel vom letzten mal um eine erste Sortierung vorzunehmen
=INDEX(A$4:A$16;VERGLEICH(KGRÖSSTE($G$4:$G$16+ZEILE($4:$16)%%%;ZEILE($A1));$G$4:$G$16+ZEILE($4:$16)%%%;0))

Als nächstes gleichst du in einer freien Spalte rechts von der Tabelle ab ob der Schwellenwert auf die jeweilige Zeile zutrifft
=WENN(O4>$Q$2;"anzeigen";"")

Dann legst du für jede Zeile eine bedingte Formatierung an welche per Formel prüfen soll: Prüfzelle = "anzeigen" dann keine Änderung, wenn Prüfzelle = "" dann Text weiß (oder Farbe die der Hintergrund halt hat)

3. Lösung - FORMEL (Empfehlung)

Du ermittelst erst den Schwellenwert in der Ausgangsspalte der Ähnlichkeiten in irgend einer freien Zelle
=WENN(MAX(G4:G16)=1;1;WENN(MAX(G4:G16)>=0,95;0,95;WENN(MAX(G4:G16)>=0,9;0,9;"<0,9")))

Dann benutzt du diese Formel vom letzten mal um eine erste Sortierung vorzunehmen
=INDEX(A$4:A$16;VERGLEICH(KGRÖSSTE($G$4:$G$16+ZEILE($4:$16)%%%;ZEILE($A1));$G$4:$G$16+ZEILE($4:$16)%%%;0))

Nun fügst du neben der neuen Tabelle eine Spalte hinzu wo du die Ähnlichkeiten mit der oberen Formel nochmal so anzeigen lässt, also einfach eine Kopie (notwendig weil sonst ein Zirkelfehler im nächsten Schritt entsteht, man kann ja keine Formel auf eine Zelle beziehen die sich erst prüft)
Dann blendest du diese Spalte aus

Nun ergänzt du die alte Sortierformel aus Schritt 2 mit einer Wenn-Abfrage
=WENN($P4>$R$2; INDEX(G$4:G$16;VERGLEICH(KGRÖSSTE($G$4:$G$16+ZEILE($4:$16)%%%;ZEILE($A1));$G$4:$G$16+ZEILE($4:$16)%%%;0));"")



Viel Text, schwer zu verstehen, darum hier alle 3 Lösungen als Beispiel:

Beispiel-Datei XLS
 
So,
unabhängig von dir TNM, poste ich auch mal meine Lösung:

Das ist ein erster Entwurf, d.h. Fehlerbehandlung und die Sortierung sind noch nicht implementiert. Das Filtern und Anzeigen klappt aber zuverlässig. Ich habe leider erst wieder am Wochenende Zeit mich damit zu beschäftigen.

Um den Entwickler-Ribbon einzublenden, gehe oben links auf das Office-Symbol, dann neben Excel-Beenden auf Excel-Optionen und setze den Haken bei "Entwicklerregistrierkarte..."

Um das Makro in deiner Datei hinzuzufügen wechsle auf die Entwicklertools -> Visual Basic.
Gehe auf Einfügen -> Modul und kopieren den Text in das Code-Fenster:

Code:
Option Explicit
Public dteLetzterAufruf As Date
Public Sub Programm()

    Dim letztezeile As Long
    Dim zeilennummern(1 To 100) As Integer
    Dim index As Integer
    Dim indexzeile As Integer
    Dim aehnlichkeit As Variant
    Dim temp As Variant
    Dim vergleich As Variant
    Dim indexzeilenkopieren As Integer
    
    aehnlichkeit = "100"
    index = 1
    
    ThisWorkbook.Sheets("Tabelle1").Range("I4:O100").Value = ""                          'Tabellenbereich auf der rechten Seite löschen
    Range("I4", "O100").Borders.LineStyle = xlNone
    
    letztezeile = ThisWorkbook.Sheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp).Row    'Ermittle die letzte Zeile, in der noch Daten stehen

    
    
    'Finde Zeilen, in denen die höchsten Ähnlichkeiten vorkommen
    Do While aehnlichkeit > 5                                       'Solange die Ähnlichkeit nicht unter 0.05 fällt
                                                                    'gehe abwärts - ausgehend von 1 - iterativ und spaltenweise durch die Tabelle
                                                                    
        For indexzeile = 4 To letztezeile                           'Für jede Zeile
            Set temp = ThisWorkbook.Sheets("Tabelle1").Range("G" & indexzeile)          'Lese den Zelleninhalt als temp ein
            
            If temp * 100 >= aehnlichkeit + 5 Then                     'Prüfe, ob der Wert größer oder gleich der (variablen) Ähnlichkeit ist
                'MsgBox temp
                zeilennummern(index) = indexzeile                   'ist das wahr, speichere die Zeile in ein Array
                index = index + 1                                   'und erhöhe den Arrayindex um 1
            End If
            
            If indexzeile = letztezeile Then                        'Befindet sich die Schleife im letzten Durchlauf, so setze die Ähnlichkeit in 0.05er Schritten nach unten
                aehnlichkeit = aehnlichkeit - 5
            End If
        Next indexzeile
      
        If zeilennummern(1) <> 0 Then                               'Sobald Werte im Array stehen, verlasse die erste Schleife
            Exit Do
        End If
    Loop
    

    'Ergebnisse der obigen Suche auf die rechte Seite kopieren
    For indexzeilenkopieren = 1 To index                            'Für jeden Eintrag im Array
        If zeilennummern(indexzeilenkopieren) <> 0 Then             'für den die Ähnlichkeit ungleich 0 ist
                                                                    'kopiere auf die rechte Seite
            ThisWorkbook.Sheets("Tabelle1").Range("I" & indexzeilenkopieren + 3 & ":O" & indexzeilenkopieren + 3) = ThisWorkbook.Sheets("Tabelle1").Range("A" & zeilennummern(indexzeilenkopieren) & ":G" & zeilennummern(indexzeilenkopieren)).Value
        End If
    Next indexzeilenkopieren
    
    'Formatierung erstellen
    
    Application.ScreenUpdating = False
    ThisWorkbook.Sheets("Tabelle1").Range("A2:G3").Copy                                 'Tabellenkopf kopieren
    ThisWorkbook.Sheets("Tabelle1").Range("I2:O3").PasteSpecial xlPasteAll

    
    ThisWorkbook.Sheets("Tabelle1").Range("I4:O" & index + 2).Select
    
    With ThisWorkbook.Sheets("Tabelle1").Range("I4:O" & index + 2)
        .Borders(xlDiagonalDown).LineStyle = xlNone
        .Borders(xlDiagonalUp).LineStyle = xlNone
        With Selection.Borders(xlEdgeLeft)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeTop)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideVertical)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
        With Selection.Borders(xlInsideHorizontal)
            .LineStyle = xlContinuous
            .Weight = xlThin
            .ColorIndex = xlAutomatic
        End With
    End With
    
    'Sortieren
    ThisWorkbook.Sheets("Tabelle1").Range("I4:O" & index + 2).Select
    Selection.Sort Key1:=Range("O4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
    
    
    Application.CutCopyMode = False
    Application.ScreenUpdating = False
    SendKeys "{ESC}"
    


End Sub

Sub StarteTimer()
dteLetzterAufruf = Now + TimeValue("00:00:05")
Programm
Application.OnTime dteLetzterAufruf, "StarteTimer"
End Sub
Hier oben kann über TimeValue die Zeit, mit der die Mappe aktualisiert wird, eingestellt werden. Momentan ist die bei 5 Sekunden.

Danach mit rechter Maustaste auf "Diese Arbeitsmappe" -> Code anzeigen und noch den Text einfügen:

Code:
Private Sub Workbook_BeforeClose(Cancel As Boolean)

'Application.OnTime dteLetzterAufruf, "StarteTimer", Schedule:=False

End Sub

Private Sub Workbook_Open()
StarteTimer
End Sub

-> speichern -> Visual Basic Editor schließen

Dann in der Entwicklerleiste auf Makros klicken
StarteTimer auswählen und Makros in: "Diese Arbeitsmappe" auswählen.
Das Ganze mit "Speichern unter" als XLSM-Datei speichern.

Hoffe, dass es dir weiterhilft und sich evtl. noch jemand findet, der den oder den Vorschlag von TMN weiterverfolgt.

Anhang anzeigen Ausgangsdatei - 0.1.4.xlsm.zip
 
DANKE DANKE DANKE an euch beide!
Schau mir alles mal an und denke damit komme ich klar.

Super!!!
 
Zurück
Oben