Zuordnungsproblem

Diskutiere und helfe bei Zuordnungsproblem im Bereich Microsoft Office im Windows Info bei einer Lösung; Hallo Community, Ich habe Tabelle3 und Tabelle4. Aus diesen beiden Tabellen möchte ich in Tabelle3 eine neue Zuordnung treffen. Mit einem Makro habe... Dieses Thema im Forum "Microsoft Office" wurde erstellt von Michael5960, 4. Oktober 2016.

  1. Zuordnungsproblem


    Hallo Community,


    Ich habe Tabelle3 und Tabelle4. Aus diesen beiden Tabellen möchte ich in Tabelle3 eine neue Zuordnung treffen.

    Mit einem Makro habe ich aus Tabelle 4 die Schulen in Tabelle 3 übernommen, Duplikate gelöscht und eine alphabetische Sortierung vorgenommen.

    Problem: Jetzt möchte ich den Schulen in Tabelle3 die Mitarbeiter zuordnen: Da in der Spalte F der Tabelle4 Schulen mehrmals vorhanden sind und die Namen auch verschiedenen Schulen in den weiteren Spalten zugeordnet sein können, komme ich mit Vergleich oder Verweisen nicht weiter. Es können max. 5 Namen an einer Schule sein. Hat da jemand eine Idee? Danke!


    Tabelle 3

    LfdNr. Schule Standort Name, Vorname Name, Vorname Name, Vorname Name, Vorname Name, Vorname
    1 Schule 01 Standort 01
    2 Schule 02 Standort 02
    3 Schule 03 Standort 03
    4 Schule 04 Standort 04
    5 Schule 05 Standort 05
    6 Schule 06 Standort 06
    7 Schule 07 Standort 07
    8 Schule 08 Standort 08
    9 Schule 09 Standort 09
    10 Schule 10 Standort 10
    11 Schule 11 Standort 11
    12 Schule 12 Standort 12
    13 Schule 13 Standort 13
    14 Schule 14 Standort 14
    15 Schule 15 Standort 15
    16 Schule 16 Standort 16
    17 Schule 17 Standort 17

    Tabelle 4

    LfdNr. Name, Vorname Schule Standort Schule Standort Schule Standort Schule Standort Schule Standort
    1 Name, Vorname 01 Schule 01 Standort 01 Schule 03 Standort 03 Schule 04 Standort 04 Schule 11 Standort 11
    2 Name, Vorname 02 Schule 01 Standort 01 Schule 03 Standort 03 Schule 05 Standort 05
    3 Name, Vorname 03 Schule 04 Standort 04
    4 Name, Vorname 04 Schule 02 Standort 02
    5 Name, Vorname 05 Schule 03 Standort 03
    6 Name, Vorname 06 Schule 15 Standort 15
    7 Name, Vorname 07 Schule 06 Standort 06 Schule 14 Standort 14
    8 Name, Vorname 08 Schule 07 Standort 07
    9 Name, Vorname 09 Schule 02 Standort 02
    10 Name, Vorname 10 Schule 08 Standort 08 Schule 11 Standort 11
    11 Name, Vorname 11 Schule 09 Standort 09
    12 Name, Vorname 12 Schule 10 Standort 10
    13 Name, Vorname 13 Schule 11 Standort 11
    14 Name, Vorname 14 Schule 12 Standort 12
    15 Name, Vorname 15 Schule 05 Standort 05 Schule 07 Standort 07 Schule 17 Standort 17
    16 Name, Vorname 16 Schule 04 Standort 04
    17 Name, Vorname 17 Schule 02 Standort 02
    18 Name, Vorname 18 Schule 12 Standort 12
    19 Name, Vorname 19 Schule 13 Standort 13
    20 Name, Vorname 20 Schule 14 Standort 14
    21 Name, Vorname 21 Schule 15 Standort 15
    22 Name, Vorname 22 Schule 16 Standort 16
    23 Name, Vorname 23 Schule 13 Standort 13 Schule 17 Standort 17
     
  2. Michael5960 Win User

    Zuordnungsproblem

    Hallo Andreas,

    nochmals vielen Dank.

    Allein der Editor und Debuggen hat mir sehr geholfen und einige Fragen geklärt. Alles andere muss ich noch in Ruhe durchspielen. Ist aber klasse um zu lernen. Dankeschön

    Gruß

    Michael
  3. Andreas Killer Win User

    Zuordnungsproblem

    Ganz ehrlich damit habe ich schon Probleme, da ich nur vermuten kann, welcher Teil des Programmes, wo eingesetzt wird.
    Hallo Michael,

    kuck dir mal diese Seite an, speziell unter Grundlagen\Wie und wo fügt man ein Makro ein:

    http://www.online-excel.de/

    Auch ansonsten solltest Du Dir das mal die Seite zu Gemüte führen, gerade das Kapitel über den VBA-Editor, denn Debuggen ist eins der wichtigsten Dinge die man wissen/können muss. Ich setze voraus das Du Dir zumindest dieses Kapitel mal grob ankuckst, bzw.
    so ungefähr weißt wie der Debugger funktioniert.

    Als Anfänger nutzt Dir mein Code oben nix, also vergiss den Krams einfach und fangen wir mal ganz ganz einfach an:

    Bevor wir Deine Datei vermurksen, mach einfach mal eine neue Datei (diese hat bei mir 3 Tabellen "Tabelle1","Tabelle2","Tabelle3") und kopier Deine Daten aus diesem Thread von oben unter "Tabelle 4" in "Tabelle1" und speicher die Datei als .XLSM ab.

    Dann machst Du den VBA Editor auf, Menü\Einfügen\Modul und da kopierst Du den Code unten rein.

    Und den läßt Du nicht einfach laufen, sondern debuggst diesen Schritt für Schritt mit F8, ließ Dir die Kommentare durch und kuck in die Tabellenblätter, nutze Direktfenster und Überwachungsfenster.

    Wenn Du das verdaut hast, dann ist der Grundstock gelegt, der Schnee auf der Spitze des Eisberges geschmolzen. :)

    Ab jetzt benutzt Du den Makrorekorder nur noch dazu um rauszukriegen welche Befehle man für igrendwas benutzt und liest Dir in der Hilfe die Beispiele durch, bzw. schreibst den Code nach dem Muster unten um.

    Dann versuch mal die Daten aus der Tabelle2 in die Tabelle3 zu bringen so das sie Deinen Vorstellungen entsprechen, das könntest Du nun selber hinbekommen.

    Du kannst Dich an meinem Code orientieren, aber es gibt immer viele Wege zum Ziel, gerade in Excel.

    Nicht verzweifeln, es ist noch kein Programmierer vom Himmel gefallen, auch ich hab mal so wie Du angefangen... ich hab nur gut 25 Jahre Vorsprung. ;-)

    Andreas.

    Option Explicit

    Sub EinsZuZwei()

    'Fangen wir mal damit an wie wir eine solche Liste in eine "universelle" Form umformen.

    'Also mache aus

    ' LfdNr. Name, Vorname Schule Standort Schule Standort Schule Standort Schule Standort Schule Standort

    'dies

    ' LfdNr. Name, Vorname Schule Standort



    Dim Source As Range, Dest As Range, This As Range, Here As Range

    Dim i As Long, j As Long



    'Wir stellen uns mal blind und wissen nur das die obige Form vorliegt aber wir keine Ahnung von der Menge der Daten haben.

    'Zuerst referenzieren wir mal die Daten, d.h. von A1 aus alle angrenzenden Zellen, ich gehe davon aus das "Tabelle1" aktiv ist:

    Set Source = Range("A1").CurrentRegion

    'Nun wissen wir schon mal wie viele Reihen, Zeilen wir haben, schau in das "Direktfenster" (drück STRG-G falls nicht offen)

    Debug.Print "Zeilen " & Source.Rows.Count, "Spalten " & Source.Columns.Count



    'Anmerkung am Rande:

    ' Der Aufruf von "Range" ohne was davor referenziert aus einem regulärem Modul immer die Zelle in der aktuellen Tabelle.

    ' Aus einem Klassenmodul (Codemodul) einer Tabelle immer die Zelle die zu diesem Modul gehört!



    'Man kann auch auf andere Tabellen zugreifen in dem man einen Bezeichner voranstellt:

    Set Dest = Worksheets("Tabelle2").Range("B2")



    'Schreiben wir da mal was rein (kuck erst danach in Tabelle2):

    Dest = "LfdNr."

    'Um angrenzende Zellen zu referenzieren kann man Cells verwenden, die Position ist inkrementell, wobei (1,1) die Zelle selber ist!

    Dest.Cells(1, 2) = "Name, Vorname"

    'Auch diese Syntax geht:

    Dest(1, 3) = "Schule"

    'Mit Offset geht es auch, wobei hier (0,0) die Zelle selber wäre. Läßt man ein Argument weg, dann ist dieses 0:

    Dest.Offset(, 3) = "Standort"



    'Damit der folgende Code in die nächste Zeile schreibt setzen wir Dest eins weiter runter:

    Set Dest = Dest.Offset(1)



    'Merke: MIT SET referenziert man eine Zelle, OHNE SET schreib man was rein!



    'Da wir alle Daten nach "Schule Standort" aufnehmen wollen müssen wir von Spalte 3 bis zur letzten in 2er Schritten gehen

    For j = 3 To Source.Columns.Count Step 2

    'Die Zeilen durchlaufen wir ab Zeile 2 (Überschriften brauchen wir nicht) bis zur letzen (Step 1 ist der Standard)

    For i = 2 To Source.Rows.Count

    'Nun können wir mal die Zelle an dieser Position referenzieren, nimm mal "This" in das "Überwachungsfenster"

    ' "This" markieren, SHIFT-F9 drücken, Hinzufügen:

    Set This = Source.Cells(i, j)



    'Nun kucken wir mal ob was drin steht, andernfalls brauchen wir das folgende ja nicht

    If Not IsEmpty(This) Then

    'Nun kannst Du den Wert der Zelle sehen, weiß aber nicht welche Zelle das ist.

    'BTW, wenn Du neugierig bist, dann klick mal auf das + im Überwachungsfenster neben "This", dann kannst Du Dir mal ankucken was das RANGE alles so umfaßt.

    'RANGE ist das wichtigste Objekt in Excel, damit geht fast alles!

    'Und das sind nur einige der Eigenschaften, das Ding hat auch noch Methoden (Property/Sub/Function), benutzen wir mal eine um die Adresse der Zelle zu sehen:

    Debug.Print This.Address(0, 0)

    'Klick mal auf Address und drück F1, dann schau Dir mal die Ausgabe an wenn Du eine 0 wegläßt (drück STRG-F9 um den Code auf die Zeile zurückzusetzen).



    'Zurück zum Thema, schreiben wir die LfdNr. unserer Zeile nach Tabelle2, aber wo ist "LfdNr."?

    'This zeigt auf die Schule, die LfdNr. ist links davon in der ersten Spalte, also nutzen wir INTERSECT um diese Zelle zu referenzieren.

    'Wir bilden den Schnittpunkt der ersten Spalte mit der Zeile von This:

    Set Here = Intersect(Source.Columns(1), This.EntireRow)



    'Und rein damit. BTW, wenn man es ordentlich machen will, dann sollte man die Value Eigenschaft verwenden.

    '(In manchen Fällen muss man das machen, sonst kann es Murks geben, in unserem Fall ist das nicht notwendig).

    Dest.Value = Here.Value



    'Und die anderen Daten auch

    Dest.Offset(, 1) = Here.Offset(, 1)

    Dest.Offset(, 2) = This

    Dest.Offset(, 3) = This.Offset(, 1)



    'Weitersetzen nicht vergessen:

    Set Dest = Dest.Offset(1)



    'Debugge noch mal min. eine Runde weiter bis Du das obige verstanden hast.

    'Dann drück F5 und lass den Rest in einem Rutsch laufen

    End If

    Next

    Next



    'An dieser Stelle halten wir das Makro einfach mal an:

    Stop

    'Kuck mal in Tabelle2 und sieh Dir die Daten an, kann man nicht so wirklich sehen außerdem alles noch durcheinander.

    'Also referenzieren wir alle Daten

    ' Anmerkung: Dest steht ja direkt unter den Daten in einer leeren Zelle, daher eine Zeile hoch!

    Set Dest = Dest.Offset(-1).CurrentRegion



    'Welche Zellen umfaßt nun Dest? Überleg mal bevor Du die nächste Zeile ausführst und es Dir ankuckst

    Debug.Print Dest.Address(0, 0)



    'Damit man nicht immer wieder den gleichen Variablennamen schreiben muss kann man WITH verwenden

    'Alles innerhalb von WITH mit einem Punkt davor bezieht sich auf die WITH-Variable



    With Dest

    'Nun verbreitern wir mal die Spalten damit alle Daten sichtbar werden

    .EntireColumn.AutoFit

    'Und sortieren nach Schule und Standort.

    'Anmerkung:

    ' Jedes Argument hat einen Namen, diesen kann man mit := verwenden um nicht jedes Argument für einen Aufruf angeben zu müssen

    .Sort Key1:=.Offset(, 2), Key2:=.Offset(, 3), Header:=xlYes

    End With

    End Sub
  4. Andreas Killer Win User

    Zuordnungsproblem

    Hallo Michael,

    und wie ist es damit? Ich kann ja nicht wissen wo es bei Dir hapert ;-)

    Andreas.

    Option Explicit

    Sub Test()

    Dim All As Range

    Dim Data



    'Daten der Tabelle referenzieren

    Set All = Range("Tabelle4")

    'Einlesen

    Data = TabelleVierZuUni(All)



    'In neuem Blatt ausgeben

    Sheets.Add

    Range("A1").Resize(, 4).Value = Array("LfdNr.", "Name, Vorname", "Schule", "Standort")

    Range("A2").Resize(UBound(Data), UBound(Data, 2)).Value = Data

    End Sub

    Private Function TabelleVierZuUni(ByVal Where As Range) As Variant

    Dim Data, Item

    Dim i As Long, j As Long

    Dim All As New Collection



    Data = Where.Value



    'Schule und Standort

    For j = 3 To 11 Step 2

    'Jede Zeile

    For i = 1 To UBound(Data)

    'Was drin?

    If Not IsEmpty(Data(i, j)) Then

    'Abspeichern Nr/Name/Schule/Standort

    All.Add Array(Data(i, 1), Data(i, 2), Data(i, j), Data(i, j + 1))

    End If

    Next

    Next



    'Collection zu 2D-Array

    ReDim Data(1 To All.Count, 1 To 4)

    i = 0

    For Each Item In All

    i = i + 1

    For j = 1 To 4

    Data(i, j) = Item(j - 1)

    Next

    Next

    TabelleVierZuUni = Data

    End Function
  5. Andreas Killer Win User

    Zuordnungsproblem

    Ich habe Tabelle3 und Tabelle4. Aus diesen beiden Tabellen möchte ich in Tabelle3 eine neue Zuordnung treffen.
    Macht doch keinen Sinn, ergibt die gleiche krude Datenwurst, nur anders herum.

    Mach Dir aus Tabelle4 eine neue in diesem Format:

    [table][tr][td]LfdNr.[/td][td]Name, Vorname[/td][td]Schule [/td][td]Standort[/td][/tr][/table]

    Dann kannst Du nach Name, Vorname sortieren und/oder Schule, filtern was auch immer.

    Und daraus dann auch Deine Tabelle3 (oder andere Formate) generieren:

    Bilde einen Schlüssel aus Schule&"-"&Standort,

    suche danach in Tabelle3

    gehe nach rechts bis Zelle frei

    eintragen.

    Andreas.
  6. Michael5960 Win User

    Zuordnungsproblem

    Hallo Andreas,

    da hast du dir sehr viel Mühe gegeben das Problem zu lösen . Erst mal vielen Dank.

    Leider hast du einen blutigen Anfänger für VBA vor dir. Ich habe versucht dein Programm zu übertragen.

    Ganz ehrlich damit habe ich schon Probleme, da ich nur vermuten kann, welcher Teil des Programmes, wo eingesetzt wird.

    SubTest habe ich unter Makros

    Option Explicit und Private Function TabelleVierZuUni(ByVal Where As Range) As Variant in der Tabelle4

    Bekomme dann Fehlermeldung Sub oder Function nicht definiert in folgender Zeile:

    Data = TabelleVierZuUni(All)

    Wenn du Zeit hast, wäre es super, mir zu erklären, wie ich vorgehen muss. Vielen Dank!

    Gruß Michael
  7. User Advert


    Hi,

    willkommen im Windows Forum!
Thema:

Zuordnungsproblem - Microsoft Office

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.