PDA

Vollständige Version anzeigen : Falls Schlagwort "xyz" in Spalte i in Zeile j, setze "ja" in Zelle (i,j+1)


someguy
27.03.2012, 14:59
Hallo,

ich möchte eine Spalte in einer Tabelle auf verschiedene Schlagwörter hin untersuchen lassen.
Kommt z. B. das Wort
abc (egal ob irgendwelche Buchstaben groß- oder kleingeschrieben wurden!)
in Spalte F und Zeile 6 (also Zelle F6) vor, würde ich gerne in G6 das Wort "Ja" gesetzt bekommen, völlig unabhängig davon was vorher in G7 stand.
Wie könnte ich das automatisiert machen (lassen)? :)

edit:
Ich hatte fälschlicherweise vorher im Threadtitel

setze "ja" in Zelle (i,j+1)

stehen, meinte aber

setze "ja" in Zelle (i+1,j)
Vielen Dank an Erich für den Hinweis. Jetzt ist es korrekt!

Erich G.
27.03.2012, 15:09
Hi,
am ehesten durch eine Formel in G6 - oder doch G7 - das wurde nicht so ganz klar.

"Spalte i in Zeile j, setze "ja" in Zelle (i,j+1)" passt nicht.
Bei Cells(i, j) ist der erste Parameter i die Zeile, der zweite Parameter j die Spalte.

<table border="1" cellspacing="0" cellpadding="0" style="font-family:Arial,Arial; font-size:10pt; background-color:#ffffff; padding-left:2pt; padding-right:2pt; "> <colgroup><col style="font-weight:bold; width:30px; " /><col style="width:95px;" /><col style="width:80px;" /></colgroup><tr style="background-color:#cacaca; text-align:center; font-weight:bold; font-size:8pt; "><td >&nbsp;</td><td >F</td><td >G</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >6</td><td >Das Abc l&uuml;gt.</td><td >Ja</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >7</td><td >&nbsp;</td><td >Ja</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >8</td><td >&nbsp;</td><td >&nbsp;</td></tr><tr style="height:17px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >9</td><td >Zahlen nie...</td><td >&nbsp;</td></tr></table><br /><table style="font-family:Arial; font-size:10pt; border-style: groove ;border-color:#00ff00;background-color:#fffcf9; color:#000000; "><tr><td ><b>Formeln der Tabelle</b></td></tr><tr><td ><table border = "1" cellspacing="0" cellpadding="2" style="font-family:Arial; font-size:9pt;"><tr style="background-color:#cacaca; font-size:10pt;"><td >Zelle</td><td >Formel</td></tr><tr><td >G6</td><td >=WENN(ISTZAHL<span style=' color:008000; '>(SUCHEN<span style=' color:#0000ff; '>("abC";F6)</span>)</span>;"Ja";"")</td></tr><tr><td >G7</td><td >=WENN(ISTZAHL<span style=' color:008000; '>(SUCHEN<span style=' color:#0000ff; '>("abC";F6)</span>)</span>;"Ja";"")</td></tr><tr><td >G9</td><td >=WENN(ISTZAHL<span style=' color:008000; '>(FINDEN<span style=' color:#0000ff; '>("abc";F9)</span>)</span>;"Ja";"")</td></tr></table></td></tr></table>
Oder soll es doch jedenfalls VBA sein?

Hasso
27.03.2012, 15:09
Hallo someguy,

das Ganze mit einem Button:

Option Explicit

Private Sub CommandButton1_Click()
Dim zelle As Range
Dim schlagwort As String

schlagwort = InputBox("Bitte Suchbegriff eingeben:")

For Each zelle In UsedRange
If zelle = schlagwort Then zelle.Offset(1, 1) = "Ja"
Next

End Sub

Beispielmappe anbei.

someguy
27.03.2012, 15:27
Hallo someguy,

das Ganze mit einem Button:

Option Explicit

Private Sub CommandButton1_Click()
Dim zelle As Range
Dim schlagwort As String

schlagwort = InputBox("Bitte Suchbegriff eingeben:")

For Each zelle In UsedRange
If zelle = schlagwort Then zelle.Offset(1, 1) = "Ja"
Next

End Sub

Beispielmappe anbei.
Ist das VBA? Ich meine, kommt der Button und dessen Funktionsweise über VBA zustande?
Ist ja spannend. Ich habe dazu auch diese an Unis vertriebenen Handbücher (die hier (http://www.rrzn.uni-hannover.de/buecher.html), bin Student bzw. bezugs- und nutzungsberechtigt), allerdings diese bisher aufgrund von Zeitmangel sträflich vernachlässigt.
Ich glaube aber, schon selber etwas dort zum Code sagen zu können:
Muss

.Offset(1, 1)
nicht

.Offset(0, 1)
sein? Vielen Dnak auch für die Arbeitsmappe. Ich glaube ich habe schon geschafft, den Button entsprechend meinen Wünschen zu ändern. Ich glaube, du hattest meine widersprüchliche Beschreibung im OP korrekt eingearbeitet?
Hi,
am ehesten durch eine Formel in G6 - oder doch G7 - das wurde nicht so ganz klar.

"Spalte i in Zeile j, setze "ja" in Zelle (i,j+1)" passt nicht.
Bei Cells(i, j) ist der erste Parameter i die Zeile, der zweite Parameter j die Spalte.Heißt das, jedes Argument bei so einer Zellenangabe ist immer so zu betrachten? Das wäre jetzt wichtig für mich, das ist ja eine grundlegende Sache. :)

Oder soll es doch jedenfalls VBA sein?Also ich war da ganz offen.
Dein Beispiel ist ja etwas humaner.
Aber ich werde zukünftig wohl für mehr oder weniger simple Vorgänge VBA gebrauchen können. Vielleicht schaffe ich mich da reinzufuchsen. :)

Hasso
27.03.2012, 15:39
Hallo someguy,

Muss .Offset(1, 1) nicht .Offset(0, 1) sein?

So würde ich es auch sinnvoll finden, du hattest aber geschrieben:

..in Spalte F und Zeile 6 (also Zelle F6) vor, würde ich gerne in G7 das Wort "Ja ..

Und genau das macht mein Code.

someguy
27.03.2012, 15:45
Ok. Woher weißt Excel, welchen 'Range' ich meine? Ist Range diejenige Spalte, in welcher der Rahmen des letzten Mausklicks sitzt?

Erich G.
27.03.2012, 15:56
Hi,
zunächst mal die Angabe von Zeile und Spalte in Cells(). In der VBA-Hilfe zur Worksheet.Cells-Eigenschaft steht u. a. das

Beispiel
In diesem Beispiel wird der Schriftgrad der Zelle C5 von Sheet1 auf 14 Punkt festgelegt:
Worksheets("Sheet1").Cells(5, 3).Font.Size = 14

Das ist aber nur eine (wenn auch recht häufig vorkommende) Variante.
Cells(5, 3) meint die Zelle C5.

Hasso hat dir eine VBA-Lösung gepostet, ich nur eine Excelformel.

Zu .Offset(0, 1):
Das ist richtig, wenn das "Ja" rechts neben die untersuchte Zelle geschrieben werden soll.
(Auch hier: 0 Zeilen, 1 Spalte - also Zeilen, Spalten - wie bei Cells)

"Vielleicht schaffe ich mich da reinzufuchsen."
Bestimmt, IMHO hast du damit sehr ordentlich angefangen! :cool:

Hasso
27.03.2012, 15:57
For Each zelle In UsedRange
If zelle = schlagwort Then zelle.Offset(1, 1) = "Ja"
Next
Dieser Code geht nacheinander alle Zellen des Blatts durch, die etwas beinhalten ("UsedRange"). Die Variable "zelle" enthält immer den Wert der Zelle, die gerade geprüft wird. Und eine Zeile nach unten und eine Spalte rechts davon (zelle.Offset(1, 1) ) wird bei erfolgreichem Fund des Schlagworts das Wörtchen "Ja" eingetragen.

Erich G.
27.03.2012, 16:04
Hi,
zu "Woher weißt Excel, welchen 'Range' ich meine?
Ist Range diejenige Spalte, in welcher der Rahmen des letzten Mausklicks sitzt?"
Gute Frage!
Hassos Code tut viel mehr als du "bestellt" hast. Mit
"For Each zelle In UsedRange"
verarbeitet er ALLE Zellen des benutzen Bereichs (UsedRange). Das können sehr viele Zellen sein...

Wenn nur F6 bearbeitet werden soll, dann anstelle von
For Each zelle In UsedRange
If zelle = schlagwort Then zelle.Offset(1, 1) = "Ja"
Next
nur der Code
If Cells(6, 6) = schlagwort Then Cells(6, 6).Offset(0, 1) = "Ja"
oder
If Cells(6, 6) = schlagwort Then Cells(6, 7) = "Ja"

someguy
27.03.2012, 16:28
Ah, stimmt. Hasso war nur ganz korrekt.

Wie kann ich denn eine bestimmte Spalte durch den Button bearbeiten lassen?
Also nicht voll eingeschränkt "Cells(6,6)" sondern z. B. "Cells(i,6)"? Wobei das i hier natürlich nicht richtig ist, nur so meine ich es... er sollte halt die Spalte komplett von oben nach unten durchlaufen, aber dann natürlich wieder nur so weit wie ich diese Spalte benutzt habe.

Ist das eigentlich jetzt 2 mal Zufall gewesen, dass ihr im Abstand von weniger als 1 Minuten beide Male gepostet habt? Lustig. :)

Hasso
27.03.2012, 16:41
Hallo someguy,

so wird die Spalte G bis zur letzten Zeile mit Inhalt durchsucht:
Option Explicit

Private Sub CommandButton1_Click()
Dim zelle As Range
Dim bereich As Range
Dim schlagwort As String
Dim letzteZeile As Long
dim spalte as Integer

spalte = 7 'Spalte G
letzteZeile = Cells(Rows.Count, spalte).End(xlUp).Row + 1
schlagwort = InputBox("Bitte Suchbegriff eingeben:")
bereich = Range("G1:G" & letzteZeile & "")

For Each zelle In bereich
If zelle = schlagwort Then zelle.Offset(1, 1) = "Ja"
Next

Die Variable letztezeile ermittelt die letzte Zeile der Spalte (hier G = spalte 7) und geht alle Zellen in diesem Bereich durch.
End Sub

someguy
04.04.2012, 13:09
Hallo Hallo,
so funktioniert der Code leider nicht. Der Debugger zeigt bei mir als Fehler an:
bereich = Range("G1:G" & letzteZeile & "")
In Spalte G steht bei mir:

Januar
Februar
März
April
Mai
Juni
Juli
August
September
Oktober

Übrigens, ich meinte tatsächlich doch die Zelle daneben, nicht einmal nach rechts und einmal nach unten. Also nur einmal nach rechts. :)

Hasso
04.04.2012, 13:30
Hallo someguy,

welche Fehlermeldung zeigt der Debugger denn an (also nicht nur die Zeile, in der der Fehler auftritt, sondern der Text der Fehlermeldung)?

Es könnte sein, dass du eine Variable falsch geschrieben hast oder etwas anderes. Der vollständige Code des Makros, nicht nur die fehlerverursachende Zeile, wäre sicher hilfreich.

am Besten wäre es, wenn du deine Mappe mal hochladen würdest, sonst raten wir hier nur herum.

Erich G.
05.04.2012, 06:47
Hi,
in Hassos Code steckt ein Fehler. In der Zeile

bereich = Range("G1:G" & letzteZeile & "")

fehlt am Anfang das "Set". Den Leerstring am Ende kann man weglassen. Also:

Set bereich = Range("G1:G" & letzteZeile)

Klappt es dann? :mrcool:

someguy
05.04.2012, 12:39
Hi,
in Hassos Code steckt ein Fehler. In der Zeile

bereich = Range("G1:G" & letzteZeile & "")

fehlt am Anfang das "Set". Den Leerstring am Ende kann man weglassen. Also:

Set bereich = Range("G1:G" & letzteZeile)

Klappt es dann? :mrcool:Hallo Erich, so klappt es. Danke! :)

Hallo someguy,

welche Fehlermeldung zeigt der Debugger denn an (also nicht nur die Zeile, in der der Fehler auftritt, sondern der Text der Fehlermeldung)?Stimmt, da hätte ich etwas mehr posten können.
Es könnte sein, dass du eine Variable falsch geschrieben hast oder etwas anderes. Der vollständige Code des Makros, nicht nur die fehlerverursachende Zeile, wäre sicher hilfreich.Das erschließt sich mir leider nicht zu 100 %, es handelt sich ja um deinen Code, den ich (natürlich) 1:1 übernommen hatte. Danke nochmal :)