Access - größter Wert aus 6 Spalten

Hallo zusammen!

Ich habe in Access eine Tabelle mit Kunden-Umsätzen je Warengruppe in 6 Spalten und den Gesamt-Umsatz.
Ich brauche nun eine Abfrage, mit der ich je Kunde die Warengruppe herausfinden möchte, die den größten Anteil am Gesamt-Umsatz ausmacht. Und zwar den Namen (z.B. „WG2“) und nicht den Wert!

Beispiel:

Kunde WG1 WG2 WG3 WG4 WG5 WG6 Summe MaxWG
Kunde 1 7 8 6 4 7 2 34 WG2

Kann mir da jemand weiterhelfen?
Vielleicht mit einer Wenn-Formel?
Wie viele Wenn-Formeln kann ich ineinander verschachteln?
Vielen Dank im Voraus!!

Elli aus Köln

Hallo Elli aus Köln

Ich habe in Access eine Tabelle mit Kunden-Umsätzen je
Warengruppe in 6 Spalten und den Gesamt-Umsatz.

Schön, aber nicht brauchbar…

Ich brauche nun eine Abfrage, mit der ich je Kunde die
Warengruppe herausfinden möchte, die den größten Anteil am
Gesamt-Umsatz ausmacht. Und zwar den Namen (z.B. „WG2“) und
nicht den Wert!

Die Art Tabelle ist für Access und dort zu erfolgenden Auswertungen denkbar schlecht, um nicht zu sagen, überhaupt nicht geeignet.

Beispiel:

Kunde WG1 WG2 WG3 WG4 WG5 WG6 Summe MaxWG
Kunde 1 7 8 6 4 7 2 34 WG2

Kann mir da jemand weiterhelfen?

Ja sicher, mit dem Rat, die Tabelle(n) vernünftig, d. h. nach den Normalisierungsregeln im mehrere TAbellen aufzudröseln und in Beziehung zueinander zu setzen. (wenn Du in und mit Access weiterarbeiten willst)

Vielleicht mit einer Wenn-Formel?

Das wäre wahrscheinlich möglich, aber ohne meine Mithilfe :wink: . Da bekäme ich ja meine ausgerissenen grauen Haare wieder zurück…

Wie viele Wenn-Formeln kann ich ineinander verschachteln?

m. W. 7

Ich würde (bei dieser Konstellation) dazu raten, eine VBA-Public-Funktion zu schreiben, die die Werte als Parameterarray übergeben bekommt und den max-Wert heraussucht. Die „Position“ des entspr. Array-Elementes dient zur Bestimmung des Feldnamens.

(Nochmal: solche Vorgehensweise ist im Grunde Murks, weil gegen grundlegende Prinzipien von Datenbankfunktionalitäten verstoßen wird, die nur durch Tricksereien in den Griff zu bekommen sind.)

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Franz,

vielen Dank für Deine schnelle Antwort!
Leider kriege ich die Umsätze in dieser Form jede Woche aus dem Controlling…
Grundsätzlich ist die DB korrekt aufgebaut!

Wie suche ich denn den Max-Wert aus verschiedenen Feldern?

Da ich noch eher Access-Anfänger bin, bin ich zum Thema VBA-Public-Funktion noch etwas ratlos.
In der Theorie weiß ich, was Du meinst, aber praktisch kriege ich das nicht umgesetzt…

Vielen Dank und viele Grüße
Elli

Hallo Elli,

vielen Dank für Deine schnelle Antwort!
Leider kriege ich die Umsätze in dieser Form jede Woche aus
dem Controlling…

tja. die Controller haben sich seit jeher nie um relationale Tabellen geschert. Für die gibt es nur Excel :wink:

Grundsätzlich ist die DB korrekt aufgebaut!

Nein!!!

Wie suche ich denn den Max-Wert aus verschiedenen Feldern?

Kopiere die folgenden Code in eine Standard(!)-Modul (also kein Formularmodul)

Public Function fktFindMaxField(ParamArray arr() As Variant) As String

Dim i As Long, maxPos As Long, maxValue As Double, fn As String
On Error GoTo Er
maxPos = 0
maxValue = 0#

For i = 0 To UBound(arr) Step 2
If arr(i) > maxValue Then
maxPos = i
maxValue = arr(i)
fn = arr(i + 1)
End If

Next

fktFindMaxField = fn

Exit_Fkt:
Exit Function

Er:
MsgBox Err.Number & ": " & Err.Description
Resume Exit_Fkt

End Function

In einer Abfrage schreibst Du in einer leeren Spalte in Zeile „Feld“ dieses:

MaxFeld: fktFindMaxField([wg1];„WG1“;[wg2];„WG2“;[wg3];„WG3“;[wg4];„WG4“;[wg5];„WG5“;[wg6];„WG6“)

Da ich noch eher Access-Anfänger bin, bin ich zum Thema
VBA-Public-Funktion noch etwas ratlos.

Jetzt hoffentlich nicht mehr :wink:

In der Theorie weiß ich, was Du meinst, aber praktisch kriege
ich das nicht umgesetzt…

Na, denn halt oben die Praxis…

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Franz,

das scheint grundsätzlich zu klappen, allerdings ist in dem VBA-Modul ein Syntax-Fehler und da komme ich nicht weiter…

Er markiert den folgenden Teil rot:
Public Function fktFindMaxField(ParamArray arr() As Variant) As
String

Kannst Du mir da nochmal helfen, bitte?
Bin ratlos…

Vielen Dank und viele Grüße
Elli

Hallo,

mhmm, kann mir nur vorstellen, dass Du zwei Zeilen benutzt. Es muß alles in eine Zeile:

Public Function fktFindMaxField(ParamArray arr() As Variant) As String

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Es klappt, es klappt, es klappt!!! :smile:

Vielen Dank für die tolle Hilfe!!!

Viele Grüße aus Köln
Elli