| |
 | Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
|
Autor
|
Thema: Suchen/Ersetzen in mehreren Tabellen (3992 mal gelesen)
|
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 26. Feb. 2009 16:47 <-- editieren / zitieren --> Unities abgeben:         
Hallo Excel-Experten Hab das Problem das ich in mehreren Tabellen nach einem bestimmten String (Artikelnummer) suchen möchte und wenn gefunden die komplette Zeile rechts davon in die Suchtabelle kopieren möchte. Für das Suchen in einer Tabelle klappt das ja! Nur wie erweitern auf alle Tabellen (mit Namen)? ********************************************************************************** Der Makrorecorder zeichnet mir diesen Code auf: Sub Makro2() ' ' Makro2 Makro ' Makro am 26.2.2009 von who aufgezeichnet '
' Sheets(Array("Tabelle2", "Tabelle3", "Tabelle4")).Select Sheets("Tabelle2").Activate Range("A3").Select Selection.Copy End Sub ********************************************************************************** Nur, wie bekomme ich das Sheets(Array("Tabelle2", "Tabelle3", "Tabelle4")).Select in den nachfolgenden Code? Option Explicit
Sub SuchenErsetzen() Dim wksSource As Worksheet, wksTarget As Worksheet Dim var As Variant Dim lngRow As Long Application.ScreenUpdating = False Set wksSource = Worksheets("Tabelle2") Set wksTarget = Worksheets("Tabelle1") lngRow = 1 Do Until IsEmpty(wksTarget.Cells(lngRow, 1)) var = Application.Match(wksTarget.Cells(lngRow, 1), _ wksSource.Columns(1), 0) If Not IsError(var) Then wksTarget.Rows(lngRow).Value = wksSource.Rows(var).Value End If lngRow = lngRow + 1 Loop Application.ScreenUpdating = True End Sub Eine Beispielmappe ist natürlich mit dabei.
Danke Wolfgang ------------------ Immer wieder neu lernen [Diese Nachricht wurde von hotstaks2005 am 26. Feb. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
   
 Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 26. Feb. 2009 16:53 <-- editieren / zitieren --> Unities abgeben:          Nur für hotstaks2005
|
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 26. Feb. 2009 17:05 <-- editieren / zitieren --> Unities abgeben:         
Hallo Paulchen Zuerst hab ich es mit SVERWEIS versucht zu lösen; bin aber an den mehreren Tabellen nicht weiter gekommen. Dann hab ich per Internet diesen Code gefunden und der gefällt mir eigentlich ganz gut da ich hier in der Tabelle 1 nur die Suchbegriffe eingeben muss der Rest geht automatisch - bis halt auf mehrere Tabellen. Ach ja: Tabelle = Register Grundsätzlich geht es hierbei um eine Herstellerdatenbank für Eplan und den Export dorthin. Grüße Wolfgang ------------------ Immer wieder neu lernen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
   
 Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 27. Feb. 2009 09:01 <-- editieren / zitieren --> Unities abgeben:          Nur für hotstaks2005
Bordmittel: Zitat: Zuerst hab ich es mit SVERWEIS versucht zu lösen; bin aber an den mehreren Tabellen nicht weiter gekommen.
Formeln lassen sich über mehrere Register ebenso einsetzen wie über mehrere Zellen; der SVERWEIS ist eine kleine Ausnahme. Siehe z. B. Google --> Treffer bei herber, angepasst: Code: =WENN(ISTFEHLER(SVERWEIS(A1;Tabelle2!$A:$B;2;0));SVERWEIS(A1;Tabelle3!$A:$B;2;0);SVERWEIS(A1;Tabelle2!$A:$B;2;0))
Kommt darauf an, wieviele Register Du hast; WENN lässt sich tiefer verschachteln...VBA: Möglich ist das schon, mit einer Schleife in der Schleife ;-). Es ist allerdings mit etwas Aufwand verbunden. Ich gehe mal davon aus, dass Deine Quellregister immer gleich aufgebaut sind. Ein Ansatz: Du brauchst
- Einen Zähler für die Zeilen des Quellregisters wksSource: Das Quellregister wechselt von Tabelle2 zu Tabelle3 zu... Dieser Zähler muss immer wieder bei 1 beginnen.
- Einen Zähler für die Zeilen des Zielregisters wksTarget: Das Zielregister bleibt das gleiche; dieser Zähler muss allerdings fortlaufend geschrieben werden.
- Eine Schleife um die Sub SuchenErsetzen herum, die die Register (Worksheets) durchläuft. Ob Du das in die gleiche Sub einbaust oder eine aufrufende Prozedur gestaltest, bleibt Dir überlassen. Dabei muss ausgeschlossen werden, das wksSource = wksTarget - sonst würde das Ziel ohne zu meckern auf sich selbst kopiert.
Momentan ist mit lngRow nur ein Zähler definiert, der in Quell- und Zielregister die gleiche Zeile anspricht. Die Aufgabe ist interessant und schreit förmlich nach VBA; mir fehlt allerdings die Zeit. Bin gespannt, was Du daraus machst. ------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 27. Feb. 2009 09:16 <-- editieren / zitieren --> Unities abgeben:         
Hi Paulchen; besten Dank für Deine Hinweise. Werd mich dann mal mit meinen (noch sehr beschränkten) Kenntnissen in VBA mal an eine Lösung heran wagen. Grüße Wolfgang Nachtrag: Warum an dieser Stelle VBA? In der Tabelle 1 sollen Bestellbezeichnungen eingetragen und die dazu gehörigen Daten werden dann in Tabelle N gesucht und das Ergebnis nach Eplan exportiert. Vorteil: Kein Kopieren bzw. Auffüllen der Zeilen mit SVERWEIS-Formel - da unterschiedliche Anzahl von Datensätzen gesucht werden. Soviel zur Erklärung wqrum VBA - hoffe, es ist verständlich. Grüße Wolfgang ------------------ Immer wieder neu lernen [Diese Nachricht wurde von hotstaks2005 am 27. Feb. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
   
 Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 27. Feb. 2009 12:34 <-- editieren / zitieren --> Unities abgeben:          Nur für hotstaks2005
Mahlzeit, probier mal diesen Code (Ergänzung zu oben): Code: Private Sub RegisterDurchlaufen() Dim wsQ As Worksheet, wsZ As Worksheet 'Quelle und Ziel Dim iQ As Integer, iZ As Integer 'Zeilenzaehler fuer Quelle und Ziel Dim iW As Integer 'Zaehler zum Durchlaufen der Register Application.ScreenUpdating = False 'Bildschirmflackern aus Set wsZ = ThisWorkbook.Worksheets("Tabelle1") 'Ziel - bleibt IMMER gleich und heisst IMMER "Tabelle1" iZ = 1 iW = 2 'ERSTE Quellmappe festlegen Set wsQ = ThisWorkbook.Worksheets("Tabelle" & iW) ' Debug.Print "Ziel: " & wsZ.Name 'Ausgabe im Direktbereich zu Testzwecken For iW = 2 To ThisWorkbook.Worksheets.Count iQ = 1 'Quelle immer ab Zeile 1 beginnen Set wsQ = ThisWorkbook.Worksheets("Tabelle" & iW) ' Debug.Print "Quelle: " & wsQ.Name SuchenErsetzen wsQ, wsZ, iQ, iZ Next iW Set wsQ = Nothing Set wsZ = Nothing Application.ScreenUpdating = True End SubPrivate Sub SuchenErsetzen(wksSource As Worksheet, wksTarget As Worksheet, iQ As Integer, iZ As Integer) Dim var As Variant Dim iH As Integer 'Halt: aktuelle Quellmappe beendet, Zeile merken Dim strT As String 'Inhalt der Suchzelle, die NICHT gefunden wird Do Until IsEmpty(wksTarget.Cells(iZ, 1)) var = Application.Match(wksTarget.Cells(iZ, 1), wksSource.Columns(1), 0) If Not IsError(var) Then wksTarget.Rows(iZ).Value = wksSource.Rows(var).Value iQ = iQ + 1 iH = iZ 'Haltepunkt = Zeilenzaehler ' Else: strT = wksTarget.Cells(iZ, 1) 'Inhalt der 1. Zelle in akuteller Reihe merken... ' wksTarget.Rows(iZ).Value = "" '... alte Werte loeschen... ' wksTarget.Cells(iZ, 1) = strT '... erste Zelle wieder befuellen ' iH = iZ End If iZ = iZ + 1 Loop iZ = iH + 1 'Zeilenzaehler zuruecksetzen, naechste Zeile End Sub
Die Zielketten müssen/sollten vorher händisch gelöscht werden.------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 02. Mrz. 2009 11:46 <-- editieren / zitieren --> Unities abgeben:         
Sorry - war am Freitag nicht mehr im Hause und hab deinen Beitrag hier erst grade gelesen. Der Code funzt soweit ganz gut; was ich nicht nachvollziehen kann ist der Übergang zur nächsten Tabelle. Der passiert zur Zeit nicht und bin grade dabei das mal nach zu stellen. Besten Dank für deine Hilfestellung Wolfgang ------------------ Immer wieder neu lernen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 02. Mrz. 2009 12:39 <-- editieren / zitieren --> Unities abgeben:         
Habs jetzt noch mal genau nachgestellt; hatte uin meiner Versuchsdatei eine Spalte falsch drin deshalb ist nichts gefunden worden. Klappt also bestens! Werd aber trotzdem versuchen herauszubekommen wie du das hin bekommen hast. Danke Wolfgang Ü's gibts auch ------------------ Immer wieder neu lernen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 02. Mrz. 2009 14:32 <-- editieren / zitieren --> Unities abgeben:         
Hi - Ein Problem habe ich noch. Die zu suchenden Bestellbezeichnungen werden ja nicht unbedingt in der Reihenfolge der Tabellen eingegeben. Es kann also sein das die Bestellbezeichnungen in unterschiedlichen Tabellen enthalten sind und damit nicht gefunden werden. (s. Beispielmappe) Welches ist hier die beste Möglichkeit vorzugehen? Im Augenblick wird eine Tabelle nach der anderen durchsucht aber es findet kein Wechsel bei nicht gefundener Bestellbezeichnung statt. Hoffe es ist einigermassen klar - Beispiemappe mit Ausgangssitouation anbei. Grüße Wolfgang ------------------ Immer wieder neu lernen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
   
 Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 02. Mrz. 2009 17:29 <-- editieren / zitieren --> Unities abgeben:          Nur für hotstaks2005
'n Abend Wolfgang, richtig: Momentan wird erst das Register Tabelle2 vollständig durchsucht, anschließend das Register Tabelle3 usw. - so hatte ich die Vorgabe verstanden ;-). Suchbegriff --> Tabelle2 Zeile1 Zeile2 Zeile3... Suchbegriff --> Tabelle3 Zeile1 Zeile2 Zeile3... Vorgehensweise: Schleife "rumdrehen", theoretisch so: Suchbegriff --> Tabelle2 Zeile1 Suchbegriff --> Tabelle3 Zeile1 Suchbegriff --> Tabelle2 Zeile2 Suchbegriff --> Tabelle3 Zeile2... Die Schleife muss erst das Register wechseln und dann die Zeile. Im Zielregister soll (unverändert) fortlaufend geschrieben werden. Vergiss die Zeilen oben - Sicherung erstellt? Dann teste den hier: Code: Private Sub CommandButton1_Click() Dim wsQ As Worksheet, wsZ As Worksheet 'Quelle und Ziel Dim iZ As Integer 'Zeilenzaehler fuer Quelle und Ziel GEMEINSAM Dim iW As Integer 'Zaehler zum Durchlaufen der Register Application.ScreenUpdating = False 'Bildschirmflackern aus Set wsZ = ThisWorkbook.Worksheets("Tabelle1") 'Ziel - bleibt IMMER gleich und heisst IMMER "Tabelle1" iZ = 1 iW = 2 'ERSTES Quellregister festlegen Do Until IsEmpty(wsZ.Cells(iZ, 1)) 'Beginn Schleife ZEILENWEISE For iW = 2 To ThisWorkbook.Worksheets.Count 'Schleife fuer Register INNERHALB der Zeilenschleife Set wsQ = ThisWorkbook.Worksheets("Tabelle" & iW) var = Application.Match(wsZ.Cells(iZ, 1), wsQ.Columns(1), 0) If Not IsError(var) Then wsZ.Rows(iZ).Value = wsQ.Rows(var).Value End If Next iW iZ = iZ + 1 'naechste Zeile Loop Set wsQ = Nothing Set wsZ = Nothing Application.ScreenUpdating = True End Sub
Obacht: Wenn ein Begriff in Tabelle2 vorkommt, wird er in Tabelle1 eingetragen. Sollte der gleiche Suchbegriff ebenfalls in Tabelle3 vorkommen, wird er (anschließend) in Tabelle1 eingetragen. Gefundener Wert aus Tab3 überschreibt also gefundener Wert aus Tab2. Wobei bei Stücklisten etc. von einmaligen Suchbegriffen auszugehen ist. ------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 03. Mrz. 2009 10:16 <-- editieren / zitieren --> Unities abgeben:         
Hallo Paulchen, erst mal wieder recht schönen Dank für deine Hilfe bei meinem Problem. Hab es zwar selber mal versucht kam aber aufgrund fehlender VBA-Kenntnisse nicht so richtig weiter. Heute morgen schaue ich hier nach und finde eine fertige funktionierende Lösung! Vielen Dank dafür. Werd jetzt mal versuchen nachzuvollziehen wie du zu diesem Lösungsweg gekommen bist um auch mal selber mit VBA klar zu kommen. MfG Wolfgang .....mehrmaliges Vorkommen einer Bestellbezeichnung - sollte nicht der Fall sein da unterschiedliche Herrsteller aber kann passieren.
------------------ Immer wieder neu lernen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
   
 Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 03. Mrz. 2009 12:29 <-- editieren / zitieren --> Unities abgeben:          Nur für hotstaks2005
Hallo Wolfgang, besten Dank für die Rückmeldungen! Zum VBA besser verstehen gibt's diverse Tutorials im Netz . Auf die Schnelle: Cursor im Code positionieren, Taste F5 drücken (Ausführen), Taste F8 (schrittweise ausführen), F9 (Haltepunkte); das Direktfenster kann z. B. Variablen zur Laufzeit ausgeben, siehe Screenshot. Überwachungen sind auch hilfreich. Zitat: mehrmaliges Vorkommen einer Bestellbezeichnung [...] kann passieren
Gedanken hierzu: Die Artikelnummern werden verglichen. Erweitere den Code aus dem vorherigen Post um diesen Teil - Doppelte werden rot eingefärbt. Code: If Not IsError(var) Then If iW > 2 Then 'Wert aus Tab2 ist bereits eingetragen, aktuell wird Tab3 oder Tab4 oder... durchsucht Debug.Print "wsZ: " & wsZ.Cells(iZ, 1).Value 'zu Testzwecken Debug.Print "wsQ: " & wsQ.Cells(var, 1).Value If wsZ.Cells(iZ, 1) = wsQ.Cells(var, 1) And Not IsEmpty(wsZ.Cells(iZ, 2)) Then 'Art-Nr Quelle = Art-Nr Ziel UND in Spalte B im Ziel ist NICHT leer MsgBox "Doppelte Artikelnummer: " _ & vbCrLf & vbCrLf & _ wsZ.Cells(iZ, 1) & _ vbCrLf & vbCrLf & _ "Bitte überprüfen...", _ vbOKOnly + vbInformation, "Hinweis" wsZ.Cells(iZ, 1).Interior.ColorIndex = 3 'Zelle rot hervorheben End If End If wsZ.Rows(iZ).Value = wsQ.Rows(var).Value End If
------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 03. Mrz. 2009 14:23 <-- editieren / zitieren --> Unities abgeben:         
Hi Paulchen - klappt ja immer vorzüglicher! Werd mich jetzt mal selber dran begeben um mir doppelte Bestellbezeichnungen auf einer extra Tabelle ausgeben zu lassen zur besseren Nachbearbeitung. Eine grundsätzliche Frage noch: Für das durchsuchen der Tabelle schreibst du ja ("Tabelle" & iW) wobei iW die Tabellennummer ist und zum Tabellennamen dazu addiert wird. Passt alle so wenn Tabellennamen so aufgebaut. Meine Frage ist die ob es möglich ist die Tabellen mit eigenen Namen aufzulistenn also anstatt "Tabelle1" "TabelleN" zb. mit "ABB" "PHOENIX" etc. Wenn ja, wäre ich um eine kurze Rückmeldung dankbar; würde dann versuchen das selber hinzubekommen. Muss ja auch mal was selber machen. Bin auch so im groben mal dabei mich mit VBA auseinander zu setzen und habe Hier und in anderen Foren viele Hinweise und Tips bekommen - auch wo man mal was nachlesen kann. An dieser Stelle noch mal ein herzliches Dankeschön an dich und dieses Forum - der Gedanke der gegenseitigen Hilfe ist immer gut! Grüße Wolfgang ------------------ Immer wieder neu lernen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
   
 Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 03. Mrz. 2009 15:46 <-- editieren / zitieren --> Unities abgeben:          Nur für hotstaks2005
Zitat: Meine Frage ist die ob es möglich ist die Tabellen mit eigenen Namen aufzulistenn also anstatt "Tabelle1" "TabelleN" zb. mit "ABB" "PHOENIX" etc.
Dachte mir fast, dass diese Frage irgendwann auftaucht :) ... Die Register lassen sich alle über ihren eindeutigen Index ansprechen. Im VBA-Editor steht z. B. "Tabelle1 (Tabelle1)". Der Teil in Klammern ändert sich, wenn Du in Excel ein Register umtaufst. Lass den hier mal laufen (Direktbereich anzeigen lassen): Code: Sub RegisterNamen()Dim ws As Worksheet Dim str As String For Each ws In ThisWorkbook.Worksheets Debug.Print "Name: " & ws.Name Debug.Print "Index: " & ws.Index Next ws End Sub
Benenne ein Register um, lass nochmal laufen.BTW ist die Adressierung per Index die elegantere, weil unzweifelhafte, flexible und sichere Variante: Den Index kann Dir kein User einfach so umbenennen ;-). Die Namen der Register (wie sie in Excel zu lesen sind) spielen mit Index keine Rolle, Du kannst die Register beliebig (um)benennen, ohne dass sich Dein Code aufhängt. [Edit: Den String str brauchst Du gar nicht, der ist überflüssig /Edit] ------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 [Diese Nachricht wurde von Paulchen am 03. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
hotstaks2005 Mitglied Elektriker
 
 Beiträge: 142 Registriert: 03.07.2008 EPLAN 5.7 Office 2003
|
erstellt am: 03. Mrz. 2009 16:58 <-- editieren / zitieren --> Unities abgeben:         
|