PDA

Vollständige Version anzeigen : Excel 2007


lisabo
12.03.2009, 14:27
Hallo!

Folgender Sachverhalt:

Ich habe in Spalte A: mehrere Definitionen wie z. B.:

Rohrleitung
Schild
Schildersystem

Ich hätte gerne ein Makro das mir dann in Spalte B einträgt:

bei Rohrleitung: "1"
bei Schild: "-1"
bei Schildersystem: "2"

usw. Insgesamt habe ich ca. 17 Begriffe mit unterschiedlichen Zahlen.
D. h. also die Definitionen in Spalte A sind gegeben und Spalte B soll automatisch per klick "befüllt" werden.

Ich drehe mich irgendwie im Kreis und habe nicht so eine richtige Idee. Kann mir da jemand helfen?

Vielen Dank im Voraus.

LG
Lisa

Monty Burns
12.03.2009, 15:12
Hallo lisabo

Versuch´s mal damit
Sub Rohrverlegung()

Dim zeile As Long
Dim zeilemax As Long

With ThisWorkbook.Worksheets("Tabelle1")

zeilemax = .UsedRange.Rows.Count
For zeile = 1 To zeilemax
Select Case True
Case Cells(zeile, 1).Value = "Rohrleitung": Cells(zeile, 2).Value = "1"

Case Cells(zeile, 1).Value = "Schild": Cells(zeile, 2).Value = " -1"

Case Cells(zeile, 1).Value = "Schildersystem": Cells(zeile, 2).Value = "2"

End Select
Next zeile
End With
End Sub

Gruß

- Monty Burns

chris-kaiser
12.03.2009, 15:30
hiho

Sub fuelle()
Dim LastR As Long, lngCount As Long, tmpZ As Variant
LastR = Cells(Rows.Count, 1).End(xlUp).Row
For lngCount = 1 To LastR
Select Case Cells(lngCount, 1).Value
Case "Rohrleitung"
tmpZ = 1
Case "Schild"
tmpZ = -1
Case "Schildersystem"
tmpZ = 2
'usw
'usw
'usw
Case Else
tmpZ = ""
End Select
Cells(lngCount, 2) = tmpZ
Next
End Sub

hary
12.03.2009, 15:37
Hi Monty
Dein Code in Kurzform ;-). ein wenig kann man weglassen.
<pre>
Sub t()
Dim zelle As Long
With Worksheets("Tabelle1")
For zelle = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Select Case Cells(zelle, 1).Value
Case "Rohrleitung": Cells(zelle, 2) = 1
Case "Schild": Cells(zelle, 2) = -1
Case "Schildersystem": Cells(zelle, 2) = 2
End Select
Next
End With
End Sub
</pre>
Gruss hary

Monty Burns
12.03.2009, 15:47
Hallo lisalo

Hinweis:
Meine Lösung ist übersichtlicher. Du kannst genau sehen was passiert wo..
Die Lösung von Chris-Kaiser ist bei größeren Vergleichsmengen und vielen verschiedenen Bezeichnungen die bessere Wahl, da eine weitere Variable zum Zuge kommt. Der Code sieht zwar von der Größe her eher kleiner aus, läßt sich aber extrem gut an erweiterte Aufgaben anpassen. Bei mir fällt eine Menge Schreibarbeit an.

Gruß

- Monty Burns -

Monty Burns
12.03.2009, 15:55
Hallo Hary

Ich bin selber auf diese Lösung gekommen.
Zur Übersichtlichkeit und Übung habe ich dieses Makro so gestaltet.

Ich habe in den letzten Tage so tolle Sachen programmiert, daß ich selbst überrascht bin, wie leicht mir das von der Hand geht. Meistens geht´s natürlich um Probleme, die unter "Eurem" Niveau liegen, aber es ist ja noch nicht so lange her - und leider noch nicht vorbei... -, da war ich der Rookie und wußte nicht mal, wie man Echsel richtig schreiben tut.

Gruß

- Monty Burns -

ransi
12.03.2009, 15:57
HAllo Lisa

HAt es eine bestimmten Grund das du das mit einem Makro lösen willst ?
Das ist eigentlich der klassische Anwendungsfall für =sverweis().

ransi

IngGi
12.03.2009, 16:00
Hallo Lisa,

nur der Vollständigkeit halber: Das Problem ließe sich auch ohne VBA per SVERWEIS lösen. Dazu benötigst du lediglich eine Zuordnung der Definitionen zu den Zahlen in zwei Spalten eines Tabellenblattes.

Und noch ein Hinweis: In deiner Anfrage sprichst du einerseits von Zahlen, andererseits schließt du diese Zahlen in Anführungszeichen ein. Zahlen in Anführungszeichen sind aber keine richtigen Zahlen, sondern Text. Dies bleibt nicht ohne Folgen. Monty hat in seiner Lösung die Anführungszeichen übernommen, Chris und hary haben sie weggelassen. Wie es im Endeffekt richtig ist, kannst nur du wissen. Wenn du mit den Zahlen anschließend noch weiterrechnen willst, solltest du die Anführungszeichen weg lassen. In der Regel reagiert Excel da großzügig und muckt nicht. Aber die eine oder andere Funktion streikt bei Zahlen als Text.

Übrigens: In den Zellen siehst du nachher fatalerweise die Anführungszeichen nicht - es ist aber trotzdem eine Zahl als Text!

Gruß Ingolf

lisabo
12.03.2009, 16:10
Hallo,

vielen Dank.
Hab erstmal die korrigiert Form von Monty genommen. Klappt, super!

Könnte Ihr mir denn auch noch sagen, wie ich sog. Platzhalter für Ergänzungen der Wörter beschreibe.

Ich meine wenn nicht Schild, sondern "Schilder" oder "Verkehrs-Schild" dort steht, dass Excel das auch erkennt und die gleiche Bewertung wie bei Schild vornimmt.

Lg
Lisa

lisabo
12.03.2009, 16:15
Hallo Ingi und Ransi,

vielen Dank, sverweis wäre auch eine Alternative. Ist für einen Kollegen, mal sehen, was funzt.

LG
Lisa

Monty Burns
12.03.2009, 16:18
Hallo lisabo

...nimm am besten die Lösung von Chris_Kaiser. Da kannst Du statt 'usw. weiter Fälle eintragen. Versuch doch einfach mal das Schema zu verstehen und entwickle einfach weite Zeilen im Code, die bei Chris_Kaiser denkbar einfach zu realisieren sind, da alles, was entdeckt wird, in eine einzige Variable gepackt wird und nicht, wie bei mir, eine ganze Zeile zusätzlicher Code bedeutet.

Nur Mut...

Gruß

- Monty Burns -

lisabo
12.03.2009, 16:36
Hallo nochmal,

danke, vielleicht verstehe ich Dich nicht richtig oder ich habe mich nicht richtig ausgedrückt. Ich meinte Platzhalter wie * oder ?.

Ich habe es ausprobiert und hinter Rohrleitung ein * gesetzt, damit er auch Rohrleitungen findet und mit 1 bewertet, hat aber nicht geklappt.

Ich dachte die Sternchen wäre dafür da, aber leider scheint das nicht zu funktionieren
ub t()
Dim zelle As Long
With Worksheets("Tabelle1")
For zelle = 1 To Cells(Rows.Count, 1).End(xlUp).Row
Select Case Cells(zelle, 1).Value
Case "Rohrleitung*": Cells(zelle, 2) = 1
Case "Schild": Cells(zelle, 2) = -1
Case "Schildersystem": Cells(zelle, 2) = 2
End Select
Next
End Witieren.

LG
Lisa

Monty Burns
12.03.2009, 16:51
Hallo lisalo

Mein Vorschlag ist in so einem Fall:

If Left(Cells(zeile, 1).Value, 4) = "ABCD" Then

...als Beispiel. Damit findet man die ersten 4 Zeichen ( also z.B. "Schw" von Schwarz ) und kann das hinter der Case - Schleife einbauen:

Sub Rohrverlegung()

Dim zeile As Long
Dim zeilemax As Long

With ThisWorkbook.Worksheets("Tabelle1")

zeilemax = .UsedRange.Rows.Count
For zeile = 1 To zeilemax
Select Case True
Case Cells(zeile, 1).Value = "Rohrleitung": Cells(zeile, 2).Value = "1"

Case Cells(zeile, 1).Value = "Schild": Cells(zeile, 2).Value = " -1"

Case Cells(zeile, 1).Value = "Schildersystem": Cells(zeile, 2).Value = "2"
End Select
If Left(Cells(zeile, 1).Value, 4) = "Schw" Then: Cells(zeile, 2).Value = "Hurra!"
Next zeile
End With
End Sub

Wenn Du nun für Schw etwas anderes eingibst, mußt Du die Anzahl der Zeichen ebenfalls ändern...aber Du bist ja schon groß...

Gruß

- Monty Burns -

lisabo
12.03.2009, 17:02
Hallo Monty-Burns,

funktioniert, aber so ganz bin ich noch nicht zufrieden.

Vielen Dank erstmal, werde morgen weiter probieren.

DANKE.

Lisa

Monty Burns
12.03.2009, 17:05
Hallo lisalo

Monty Burns & Lisa ( S. )...wenn das nicht funktioniert, weiß ich´s nicht...

Gruß

- Monty Burns

IngGi
12.03.2009, 17:05
Hallo Lisa,

Select Case funktioniert leider weder mit Platzhaltern, noch mit dem Like-Operator. Statt dessen musst du mit einer If-Struktur wie bei folgendem Code arbeiten. Dieser Code prüft, ob ein bestimmtes Wort in der Zelle vorkommt.

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Sub</span> ZahlEintragen()
&nbsp;
<span class="TOKEN">Dim</span> rng <span class="TOKEN">As</span> Range
&nbsp;
<span class="TOKEN">For</span> <span class="TOKEN">Each</span> rng <span class="TOKEN">In</span> Range(&quot;A1:A&quot; &amp; Cells(Rows.Count, 1).End(xlUp).Row)
<span class="TOKEN">If</span> InStr(1, rng, &quot;Rohrleitung&quot;) &gt; 0 <span class="TOKEN">Then</span>
rng.Offset(0, 1) = 1
<span class="TOKEN">ElseIf</span> InStr(1, rng, &quot;Schildersystem&quot;) &gt; 0 <span class="TOKEN">Then</span>
rng.Offset(0, 1) = -1
<span class="TOKEN">ElseIf</span> InStr(1, rng, &quot;Schild&quot;) &gt; 0 <span class="TOKEN">Then</span>
rng.Offset(0, 1) = 2
<span class="TOKEN">Else</span>
rng.Offset(0, 1) = &quot;&quot;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Next</span> <span class="REM">'rng</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Allerdings ist dieser Code sehr mit Vorsicht zu geniessen. Das wird schon bei deinen Beispielen deutlich. Das Wort Schild wird nämlich nicht nur in Schilder und Verkehrs-Schild gefunden, sondern auch in Schildersystem! Damit nun die Zuordnung von Schild nicht mit derjenigen von Schildersystem verwechselt wird, musst du unbedingt darauf achten, dass in der If-Struktur die Abfrage für Schildersystem vor der Abfrage für Schild steht. Es kommt also auf die Reihenfolge an!

Gruß Ingolf

chris-kaiser
12.03.2009, 17:49
hiho

Sub stantiv()
Dim MyArrStr, MyarrInd, icount
'bei der Reihenfolge auf die Logik achten!!, wie es Ingi schon beschrieben hat
MyArrStr = Array("*Schildersystem*", "*Rohrleitung*", "*Schild*") 'erweitern
MyarrInd = Array(2, 1, -1) 'erweitern
For icount = 1 To Cells(Rows.Count, 1).End(xlUp).Row
For Index = 0 To UBound(MyArrStr)
If Cells(icount, 1) Like MyArrStr(Index) Then
Cells(icount, 2).Value = MyarrInd(Index)
Exit For 'mal ausnahmsweise
End If
Next
Next
End Sub

hier noch die Demo

Monty Burns
12.03.2009, 18:07
Hallo lisalo

Das ist nun eine Version mit der Du auch Suchbegriffe unabhängig von einer direkten Codeänderung eingeben kannst. Wenn kein alternativer Suchbegriff gewünscht wird, sucht das Ding trotzdem weiter irgendwelche Rohre...

Sub RohrverlegungMitInputbox()

Dim zeile As Long
Dim zeilemax As Long
Dim Eingabe As String
Dim lang As Long

Eingabe = InputBox("Geben Sie hier Ihren alternativen Suchbegriff ein, Sir!", vbQuestion + vbOKCancel, Default:="Dann eben nicht")
If StrPtr(Eingabe) = 0 Then Eingabe = "xxxxxxxxx"
lang = Len(Eingabe)

With ThisWorkbook.Worksheets("Tabelle1")

zeilemax = .UsedRange.Rows.Count
For zeile = 1 To zeilemax
Select Case True
Case Cells(zeile, 1).Value = "Rohrleitung": Cells(zeile, 2).Value = "1"

Case Cells(zeile, 1).Value = "Schild": Cells(zeile, 2).Value = " -1"

Case Cells(zeile, 1).Value = "Schildersystem": Cells(zeile, 2).Value = "2"
End Select
If Left(Cells(zeile, 1).Value, lang) = Eingabe Then: Cells(zeile, 2).Value = "Hurra!"
Next zeile
End With
End Sub

Gruß

Monty Burns -

lisabo
13.03.2009, 07:20
Vielen Dank für Eure Hilfe.

Kann mir daraus mein Macro nun so "basteln" wie ich es möchte. SUPER:D

Ich bin sehr zufrieden und kann nun heute abend in Urlaub fahren :-)))) :mrcool:

Liebe Grüße und bis zum nächsten Mal.

Lisa