Hilfe mit Makro
#1
Hallo,

ich bin absoluter Neuling was VBA angeht.
Jetzt habe ich eine Anforderung in Excel die sich wohl nur mit einem Makro lösen läßt.

Ich habe zwei Tabellenblätter.
In Blatt 1 gibt es die Spalte B mit folgenden Beispielwerten (ABC, DEF, ABC, XYZ). Werte können also mehrfach vorkommen.
IN Blatt 2 stehen in Spalte A erlaubte Werte, also z.B. ABC

Das Makro soll nun prüfen, ob der Zelleninhalt von Spalte B in Blatt 1 ebenso in Blatt 2 in Spalte A vorkommt.
Falls nicht soll die Zeile nicht gelöscht, sondern der Text"Fehler" eingesetzt werden.

Wäre toll wenn jemand weiterhelfen kann.
Top
#2
Hallo,

möglicherweise reicht auch folgende Formel

=WENN(ZÄHLENWENN(B1;Tabelle2!A:A);"Fehler";"")

Die Formel schreibst du z.B. in C1 und kopierst sie einfach nach unten.

Wenn das so zu verstehen ist,
Zitat:sondern der Text"Fehler" eingesetzt werden.
, dass dieser Text Fehler in die Spalte B statt dem bisherigen Wert eingetragen werden soll dann geht das tatsächlich nur mit einem VBA-Code.

Wenn es dir allerdings genügen würde diese Zelle einfach rot zu markieren dann könnte man wiederum mit einer Bedingten Formatierung arbeiten.
Gruß
Peter
Top
#3
Nein es muss leider ein Makro seinWink

Im Prinzip funktioniert dies hier:

Sub ReplaceStrings()
Dim DoNotWant
Dim i As Long

DoNotWant = Array("The ", ".", ",", ":", ";", "'", "ABC", "DEF") '<-- extend as needed
Application.ScreenUpdating = False
With Columns("B") '<-- adjust to suit your column
For i = 0 To UBound(DoNotWant)
.Replace What:=DoNotWant(i), Replacement:="XXX", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next i
End With
Application.ScreenUpdating = True
End Sub

Schön wäre, wenn das was im Array steht eben in ein eigenes Tabellenblatt ausgelagert werden könnte.
Top
#4
(12.08.2014, 13:24)Ilsfeld110 schrieb: Schön wäre, wenn das was im Array steht eben in ein eigenes Tabellenblatt ausgelagert werden könnte.
Meinst du damit, dass sich das VBA-Array seine Werte aus einem definierten Bereich einer Tabelle holen soll?
Fall "ja", dann würde ich den Bereich als Liste/Tabelle einrichten und dort die Werte direkt auslesen/in das Array einlesen.
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Top
#5
Exakt so - ein klares JAWink
Top
#6
Dann sollte das eine gute Grundlage sein:
In Blatt 2 (Tabelle2) definierst du die entsprechenden Werte als Liste bzw. Tabelle (Hängt von deiner Excel-Version ab).
Die bekommt dann typischerweise den Namen "Tabelle1". -> Bei Bedarf: [F5] und dann wird der Name aufgelistet.
Diesen Namen verwendest du als Range, siehe den Code hierunter.

Code:
Option Explicit
Option Base 1

Sub Verboten()
   Dim aNotGood
  
   aNotGood = Sheets("Tabelle2").Range("Tabelle1")
   MsgBox aNotGood(1, 1) 'Ergibt in deinem Beispiel "The"
End Sub

Diesen Code bindest du in den bereits vorhandenen ein (mit deinen Variablennanen ;)) -> Natürlich ohne die "Kontroll-Maßnahme der MsgBox)
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Top
#7
in welchen vorhandenen code?
den von oben? das passt doch dann nicht...
Top
#8
wieso sollte das nicht passen? Huh

Code:
Option Explicit
Option Base 1

Sub ReplaceStrings()
   Dim DoNotWant
   Dim i As Long
  
   DoNotWant = Sheets("Tabelle2").Range("Tabelle1") '<-- extend as needed ### Passiert dank Tabelle automatisch
   Application.ScreenUpdating = False
   With Columns("B") '<-- adjust to suit your column
      For i = 0 To UBound(DoNotWant)
         .Replace What:=DoNotWant(i), Replacement:="XXX", LookAt:=xlPart, _
         SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
         ReplaceFormat:=False
      Next i
   End With
   Application.ScreenUpdating = True
End Sub

Da ich deine Mappe nicht sehe, kann ich auch nur das Prinzip darstellen ...
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Top
#9
Danke für den kompletten CodeWink
Trotzdem hakt es noch

Hast Du mir ein Beispiel was genau hier rein sollte? Also als "Tabelle2" und "Tabelle1".
DoNotWant = Sheets("Tabelle2").Range("Tabelle1")

Mein Tabellenblatt mit den erlaubten Werten heißt "Whitelist". Der Bereich in dem die erlaubten Werte stehen geht von A1 bis A23. Und die Tabelle heißt Tabelle3
Das Tabellenblatt das gegen die Werte geprüft werden soll heißt "Daten" und die Werte stehen in Spalte B (B1-B12769). Die Tabelle darin heißt Tabelle2

Wenn ich es jetzt richtig verstehe müßte folgendes im Code stehen:
DoNotWant = Sheets("Whitelist").Range("Tabelle3")
--> Das ergibt aber den Laufzeitfehler 9 (Index außerhalb des gültigen Bereichs).
Top
#10
Lies dir bitte noch einmal den TEXT in Beitrag #6 durch.
Sheets("Tabelleblatt-Name")
Range("automatisch vergebener Name der Tabelle/Liste")

Ohne Beispiel-Mappe (auch gerne mini ohne reale Daten) und xls-Version kann ich nicht weiter helfen, in Sachen Tabelle/Liste musst du dich belesen ... Mr. Goo ist da recht aukunftsfreudig Exclamation
Beste Grüße
  Günther

Excel-ist-sexy.de
  …schau doch mal rein!
Der Sicherheit meiner Daten wegen lade ich keine *.xlsm bzw. *.xlsb- Files mehr herunter! -> So geht's ohne!
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste