1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

VBA vergleiche zwei tabellen

Discussion in 'Programmieren' started by Saiks, Feb 21, 2009.

Thread Status:
Not open for further replies.
  1. Saiks

    Saiks Byte

    Hallo Leute,

    ich möchte folgendes erreichen:

    Es gibt 2 Tabellen, in der einen Tabelle wird nach der Reihe der Wert aus Spalte "A" mit den Werten aus der Tabelle aus der Spalte "B" verglichen. Die Werte in der 2 Tabelle sind nicht gleich angeordnet wie die in der ersten. Wenn der Wert aus A gefunden wurde soll ein Wert der in der 1. Tabelle in Spalte C steht, in die 2. Tabelle in die Spalte G kopiert/eingefügt werden.
    Wäre sowas möglich?! Hab mir schon die Zähe daran ausgebissen.

    Hier mein Anfang, der einige Fehler enthält. Es ist auch vielleicht ein komplett falscher Ansatz.

    Code:
    Sub x()
    
    
    Dim Zelle As Range
    Dim sBeg As String
    Dim selc
    Dim i As Integer
    
     Do Until i = 50
     i = i + 1
        sBeg = Tabelle3.Range("A" & i)
        selc = Tabelle2.Range("B2:B65536")
        selc.Select
        If Zelle = sBeg And Tabelle3.Range("E" & i) <> "D" Then
        Zelle.Select
       
        Selection.Copy
        Sheets("Zusammenfasssung").Select
        Range("G" & i).Select
        ActiveSheet.Paste
    End If
    Loop
    
    End Sub 
     
  2. Ardy

    Ardy Halbes Megabyte

    Hier mal die sehr unperformante brachiale Methode ;)

    Code:
    Private Sub CommandButton1_Click()
    Dim i, j As Integer
    Dim StrA, StrB, StrC As String
    
    For i = 1 To 10
        StrA = Sheets(1).Cells(i, 1)
        For j = 1 To 10
            StrB = Sheets(2).Cells(j, 2)
            If StrA = StrB Then
                StrC = Sheets(1).Cells(i, 3)
                Sheets(2).Cells(j, 6) = StrC
            End If
        Next j
    Next i
    
    End Sub
    Erste Schleife kopiert Zelle A1(A2, A3, etc...) in StrA.
    Dann beginnt die innere Schleife B1 (B2,...) von Tabelle2 in StrB zu kopieren.
    Nun werden die Werte verglichen. Bei einem Treffer wird C1(...) in StrC kopiert und dann in Sheet2 auf G eingefügt.

    Da gibts noch riesiges Optimierungspotential, aber es macht die Aufgabe (zumindest so wie ich sie verstanden habe).
    War das was du haben wolltest?
     
  3. Urs2

    Urs2 Megabyte

    Die Frage ist etwas umständlich geschrieben... zumindest für mich...
    Muss es denn mit VBA gemacht werden?

    Wenn Du in die oberste Zelle in G, wo der Zusatzwert eventuell hingeschrieben werden soll, diese Formel eingibst >

    =WENN(ISTZAHL(VERGLEICH(A5;Tabelle1!A$7:A$65536;0))=FALSCH;"";SVERWEIS(A5;Tabelle1!A$7:C$65536;3;FALSCH))

    ...und dann nach unten kopierst, sollte es auch funktionieren.

    Gegebenfalls die Zell- und Blattbezeichnungen anpassen, wenn ich das falsch verstanden hätte.

    Gruss Urs


    @Ardy
    Du wolltest sicher alle Variablen als String oder Integer dimensionieren? Dann muss es es so sein >

    Dim i As Integer, j As Integer

    ...sonst wird nur die Letzte als Integer bezeichnet, die davor stehenden alle als Variant.
     
  4. Ardy

    Ardy Halbes Megabyte

    Die meisten Aufgaben in Excel kann man natürlich auch mit Formeln lösen.
    Ich glaub das ist alles nur Gewohnheit....manche kennen alle Formeln, andere programmieren lieber schnell ein paar Zeilen.

    @Urs2:
    Danke für die Verbesserung. Jep ich wollte alle als Integer deklarieren...naja jede Sprache hat ihre Eigenheiten...(besonders vb ;) )
    Es läuft aber auch als Variant.
     
  5. Urs2

    Urs2 Megabyte

    ...sicher, meistens...

    Bei "normalen" Typen braucht es in VBA überhaupt keine Deklaration, nicht deklarierte Variablen sind einfach Variant... der dann zur Laufzeit zB zum Typ Variant/Integer wird.
    Erst bei bei speziellen Datentypen, wie Date, Object, Range oder so, sind Probleme damit schon vorprogrammiert!

    Vielleicht braucht ja der TO wirklich eine VBA-Lösung...
    Ich selbst ziehe VBA-Lösungen immer vor, wenn es einigermassen sinnvoll ist, besonders natürlich wenn ein vorher schon vorhandenes VBA nur noch zu ergänzen wäre.
    Das "Herumgekritzle" in Tabellenblatt/Eingabezeile gefällt mir nicht, zumal dann ja auch nur für die komplette Formel ein allgemeiner Fehler angezeigt würde...

    Mein Beitrag war keinesfalls als Kritik an Deinem Vorschlag zu verstehen !

    Gruss Urs
     
  6. Ardy

    Ardy Halbes Megabyte

    Da hast du schon recht, dass man mit Variant aufpassen muss. Hier wird die Variable ja nur zur Schleife benutzt, deshalb habe ich ergänzt, dass es so auch läuft.
    Für unerfahrene Programmierer natürlich eine große Falle wenn man nicht auf den "unsauberen" Umgang mit Variant hinweist.

    Keine Sorge, konstruktive Kritik nehme ich immer gerne an :)
    Besonders wenn sich kleine Fehler bei mir eingeschlichen haben.

    Ansonsten sind die paar Zeilen von mir ja nicht unbedingt als die Lösung schlechthin zu betrachten...es gibt einige Wege um das Problem des TO zu lösen. Außerdem ist einiges an den paar Zeilen verbesserungswürdig, jedoch hatte ich gestern keine Lust mich länger als 3 min mit dem Problem zu befassen um eine "saubere" Lösung zu basteln...
    Meistens sind VBA-Schnipsel in Excel eh nur für einmalige Kleinigkeiten gedacht und werden danach nicht mehr benötigt.
     
Thread Status:
Not open for further replies.

Share This Page