Sverweis mittels makro/vba

Hallo Zusammen,
stehe als VBA Anfänger seid einigen Wochen voll auf dem Schlauch. Ich hoffe durch euch eine Lösung für mein Problem zu finden.

Mein Ziel in Excel 2003:
Ich habe zwei Tabellen A&B. Beide besitzen eine Spalte mit Artikelnummern. In Tab.A stehen ab A13:A1000 die Artikelnummern wobei die Zeilenzahl(d.h. die Anzahl der Artikelnummern) variiert. Nun sollen die Inhalte der Tab. B mittels der gemeinsame Artikelnummer in die Tab.A übertragen werden ohne die Tab B. zu verändern. Einfach Ausgedrückt ein Sverweis für mehrere Spalten (Zelle(13,O)=SVERWEIS(Tab.A!$A13;Tab.B!$A$4:blush:V$584;3;0)).

Mein Problem:
Nach der Übertragung der Spalten aus Tab.B in die Zellen der Tab.A werden diese verändert (oder abgearbeitet). Anschließend sollen die veränderten Inhalte der Tab. A der Tab. B zurückgeführt werden (eine Art Aktualisierung der Tabelle B). Das Übertragungsprinzip ist gleich: Die bestehenden Artikelnr. aus der Tab A. sollen jeweils in der Tab B. gesucht werden und falls zutreffend dann sollten die ausgewählte Spalten in der jeweiligen Zeile übertragen werden. Bsp. wenn Tab.A!A55= Tab.B!A16 dann Tab.A!O55= Tab.B!B16:Tab.A!P55= Tab.B!C16…

Die Lösung sollte durch einen Makro realisiert werden. Meine Ansätze wie Makroaufzeichnung und dann Modifizierung, Recherche nach ähnlichen Makros im Netz sowie die Anpassung dieser an meine Zielsetzung sind alle samt ohne Erfolg geblieben.

Meine Letzte Hoffnung seid Ihr.

Danke im Voraus!

Tobi

Ist viel zu kompliziert, um es hier zu bearbeiten / beantworten. Da es sich ja augenscheinlich um was berufliches handelt, beschäftigt doch einfach mal einen gelernten Programmierer. Die arbeiten auch stundenweise oder auf Werkvertrag. Das kann sich eine Firma wohl leisten und dann steuerlich auch absetzen.

Hallo,
das sollte sich in etwa so verwirklichen lassen:

  1. Zieltabelle nach „suchziel“ sortieren lassen
  2. Mit sverweis ausfüllen (1. ActiveCell.FormulaR1C1 [sverweis]; 2. „Spalte auswählen“ Range.select „+ ausfüllen“ Selection.Autofill)
  3. Nochmal die Zielspalte markieren und via
    „Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False“ nur die Werte kopieren und in die selbe Spalte eintragen.

Wenn die Werte geändert wurden dasselbe spielchen nochmal, nur mit anderen such-ziel-feldern.

Beste Grüße
Namina

Hallo Tobi81,

zunächst einmal: Excel ist kein Datenbank-Programm. Hierfür wäre Access besser geeignet. In Excel müssen Datenbank-Befehle selbst nachgebildet werden.

Falls es dennoch Excel sein muss, hätte ich folgenden Lösungsansatz:

  • Falls ein Formular eingesetzt wird über das der Anwender die neuen Inhalte eingeben kann, könnte wie folgt vorgegangen werden:
  1. Mit Verweis(…) kann man die Zeilennummer ermitteln, in der die Angaben vom SVerweis ausgelesen worden sind.

  2. Mit den Angaben der Zeilennummer und der festen Spaltennummer aus dem SVerweis kann man einen Inhalt in der Tabelle Tab.B gezielt ändern.

Vielleicht helfen Dir diese Informationen weiter?

Viele Grüße,
BigBen

Hallo Tobi,

Leider kapiere ich nicht ganz, was Du brauchst. Sag etwas
genauer, wie Deine Tabellen A und B aufgebaut sind und
was von B nach A kommen soll, was in A geändert werden
soll und was dann nach B zurückgeschrieben werden soll.
Dazu brauchst Du dann wohl zwei Makros. Bitte gib ein
knappes Beispiel, dann kann ich Dir sicher helfen.

Gruß
gs

Sorry, bin momentan am Bauen, daher kaum Zeit…

liebe Grüße

Stephan

Hallo g.s.,
danke erstmal im Voraus.

Bsp. Aufbau Tabellenblatt A.

Beginnend ab Zeile 13.

Spalten
A= Artikelnr.
B= Umsatz

O= Kommentar (zu Beginn leer da Werte erst in Tab.bl.B)
P= Entwicklungsstand (zu Beginn leer da Werte erst in Tab.bl.B)

Aufbau Tabellenblatt B.

Beginnend ab Zeile 4.
Spalten
A= Artikelnr.
B= Frist
C= Kommentar
D= Entwicklungsstand

Was ich jetzt machen möchte ist, die Werte, Spalte C&D, aus dem Tab.blatt B in das Tab.blatts A zu übertragen. Dabei soll die Artikelnr. als Bindeglied/Suchkriterium dienen. Sind die Werte aus Tab.bl.B in der Tab.bl.A platziert ist die erste Zielsetzung erreicht. (Makro 1)

Die damit vollständige Tab.bl A kann nun verändert werden speziell in den Spalten O=Kommentar und P= Entwicklungsstand. Bsp. der Entwicklungsstand wechselt von „Niedrig“ auf „Mittel“ oder „Hoch“.

Da das Tab.bl. B eine Art Historie darstellt, sollen die in dem Tab.bl. A eingetragenen (egal ob verändert oder nicht) Werte wie etwa neue Kommentare & und der Entwicklungsstand in die Tab.bl. B zurückgeführt werden und bestehende Einträge überschreiben.

Ich ich konnte es verständlich rüberbringen.

Besten im Voraus

Gruß

Hallo Tobi,

Du hast leider nicht mitgeteilt, wie Deine Blätter
gefüllt werden. Werden neue Artikelnummern zuerst
nur in Blatt A eingegeben? Oder auch gleich in B?
Gibt es Lücken in den Zeilen in A oder in B?

Ich bin einmal davon ausgegangen, daß neue Artikel-
nummern nur in A angefügt werden, sodaß beim Copy
von A nach B in Blatt B die fehlenden Zeilen ergänzt
werden. Ist das nicht der Fall, muß im zweiten Makro
der gesamte ElseIf-Zweig wegfallen.

Hier die Makros, ich habe sie A_nach_B und B_nach_A
genannt, ändere die Namen nach Geschmack und kopiere
den Code in einen Modul. (a propos: im Duden heißt
es noch immer DER Modul, auch wenn MS samt seiner
Epigonenliteratur DAS Modul schreibt…)

Option Explicit

Sub B\_nach\_A()
 Dim Quelle As Worksheet, Ziel As Worksheet
 Dim q As Long, z As Long, i As Long, j As Long
 'Hier legst Du Deine Daten fest
 Const TblA As String = "Tabelle A"
 Const TblB As String = "Tabelle B"
 Const AnfA As Integer = 13 '1. Zeile in Tabelle A
 Const AnfB As Integer = 4 '1. Zeile in Tabelle B
 Const KomA As Integer = 15 'Spalte O in Tabelle A
 Const KomB As Integer = 3 'Spalte C in Tabelle B
 Const EntA As Integer = 16 'Spalte P in Tabelle A
 Const EntB As Integer = 4 'Spalte D in Tabelle B

 On Error Resume Next
 Application.ScreenUpdating = False
 Set Quelle = ActiveWorkbook.Sheets(TblB)
 Set Ziel = ActiveWorkbook.Sheets(TblA)
 'Letzte Zeile in Tabelle A:
 Quelle.Activate
 q = Quelle.Range("A65535").End(xlUp).Row
 'Letzte Zeile in Tabelle B:
 Ziel.Activate
 z = Ziel.Range("A65535").End(xlUp).Row
 'Übertrag:
 For i = AnfB To q
 For j = AnfA To z
 If Ziel.Cells(j, 1).Value = Quelle.Cells(i, 1).Value Then
 Ziel.Cells(j, KomA).Value = Quelle.Cells(i, KomB).Value
 Ziel.Cells(j, EntA).Value = Quelle.Cells(i, EntB).Value
 End If
 Next j
 Next i
 Application.ScreenUpdating = True
 Ziel.Activate
 Set Quelle = Nothing
 Set Ziel = Nothing
End Sub

Sub A\_nach\_B()
 Dim Quelle As Worksheet, Ziel As Worksheet
 Dim q As Long, z As Long, i As Long, j As Long, max As Integer
 Const TblA As String = "Tabelle A"
 Const TblB As String = "Tabelle B"
 Const AnfA As Integer = 13
 Const AnfB As Integer = 4
 Const KomA As Integer = 15
 Const KomB As Integer = 3
 Const EntA As Integer = 16
 Const EntB As Integer = 4

 On Error Resume Next
 Application.ScreenUpdating = False
 Set Quelle = ActiveWorkbook.Sheets(TblA)
 Set Ziel = ActiveWorkbook.Sheets(TblB)
 Quelle.Activate
 q = Quelle.Range("A65535").End(xlUp).Row
 Ziel.Activate
 z = Ziel.Range("A65535").End(xlUp).Row
 max = q + AnfB - AnfA
 For i = AnfA To q
 For j = AnfB To max
 If Ziel.Cells(j, 1).Value = Quelle.Cells(i, 1).Value Then
 Ziel.Cells(j, KomB).Value = Quelle.Cells(i, KomA).Value
 Ziel.Cells(j, EntB).Value = Quelle.Cells(i, EntA).Value
 'ggf neue Zeilen aus A in B anfügen:
 ElseIf (i - AnfA \> z - AnfB) And (Ziel.Cells(j, 1).Value = "") Then
 Ziel.Cells(j, 1).Value = Quelle.Cells(i, 1).Value
 Ziel.Cells(j, KomB).Value = Quelle.Cells(i, KomA).Value
 Ziel.Cells(j, EntB).Value = Quelle.Cells(i, EntA).Value
 Exit For
 End If
 Next j
 Next i
 Application.ScreenUpdating = True
 Ziel.Activate
 Set Quelle = Nothing
 Set Ziel = Nothing
End Sub

Wenn Lücken in den Zeilen vorhanden sind, funktioniert
der Code nicht. In diesem Fall melde Dich bitte noch
einmal mit genauen Angaben. Um ev. Änderungen im Tabellen-
aufbau zu verkraften, sind alle Daten als Konstante de-
klariert, die Du bei Bedarf leicht anpassen kannst.

Frohe Ostern!
gs

Hallo G.S.,

vielen herzlichen Dank.

Beste Grüße und frohe Ostern

Tobi

Hi,

sorry, ich kann Dir leider nur Infos zu VBA im Zusammenhang mit Access geben.
Habe mich nich mit Excel und VBA beschäftigt.
Jetzt fehlt mir die Zeit. Ich bevorzuge mittlerweise auch OpenOffice (Excel,… läuft leider nicht unter Linux:wink: ).

Bis dann
Karsten

Hi Tobi

hier das kleine Makro für den SVERWEIS:

Sub ArtikelNr() 'Code in ein Modul kopieren
'Sheets(1) = Tab A
'Sheets(2) = Tab B
Application.ScreenUpdating = False
For i = 13 To 1000 'Zeilenbereich der Tab A
If Sheets(1).Cells(i, 1) = Empty Then Exit For 'wenn in den Artikelnrn. zwischendurch keine leerzelle gibt, kann so vorzeitig abgebrochen werden.
For j = 13 To 1000 'Zeilenbereich der Tab B
If Sheets(1).Cells(i, 1) = Sheets(2).Cells(j, 1) Then 'wenn gleiche Artikelnummer gefunden denn …
For k = 1 To 5 '1 - 5 = Anzahl des zu kopierenden Bereiches
Sheets(1).Cells(i, 14 + k) = Sheets(2).Cells(j, k) ’ 14+1 = Spalte „O“. Werte ggf anpassen
Next k
End If
Next j
Next i
Application.ScreenUpdating = True
End Sub

Die Werte müsstest du deiner Liste anpassen. Das Makro direkt ausführen oder bei öfteren Gebrauch in die Symbolleiste einfügen.

CODE für das rekopieren (nachdem die Daten verändert wurden):

Sub rekopieren()
Sheets(1).Select
Range(Cells(13, 15), Cells(1000, 20)).Copy 'cells(13,15)=O13
Sheets(2).Select
Range(Cells(13, 1), Cells(1000, 5)).PasteSpecial Paste:=xlPasteAll 'der gesamte Bereich wird in TAB B kopiert
End Sub

Gruß Andreas