PDA

Vollständige Version anzeigen : Zelle A je nach Inhalt Zelle B befüllen


schlaubi
11.04.2012, 14:21
Liebes Forum,

ich gehe mal davon aus, dass das Problem für Experten relativ banal ist; blöderweise wusste ich nicht, nach was ich in diesem Kontext suchen muss, deshalb bitte einfach einen Link zu einem bestehenden Fred posten, sofern das schon behandelt wurde.

Also: Ich möchte gerne Zeile A in Abhängigkeit von B befüllen; d.h. wenn in Zeile B der Name Meier steht, soll in Zeile A eine 1 ausgeben werden, wenn da Müller steht eine 2, etc. Idealerweise soll das Feld leer bleiben, falls keine der Bedingungen zutrifft.
Ich habe das erstmal über Open Office (dürfte aber in MS Excel genauso tun) folgendermaßen probiert:
=WENN(SUCHEN("Bangert";D2;1)<>0;70111;Fall2)
und entsprechend bei Fall2 die nächste Abfrage und immer beim "Sonst" der Wenn-Dann-Sonst-Abfrage die nächste dazu. Blöderweise bricht Calc nach der ersten NICHT-zutreffenden Abfrage mittels Suchen ab und gibt dann nur "#Wert!" aus. So gehts also nicht.

Gibts einen Weg das über eine Formel zu lösen? Oder muss da ein Makro her? Sofern ich das mit VisualBasic machen soll - hat jemand einen guten Tipp/ Link für den Einstieg?

Viele Grüße & Danke, schlaubi

EarlFred
11.04.2012, 14:25
Hallo Schlaubi,

am einfachsten dürfte es sein, wenn Du in einem separaten Blatt (Bereich) die Zuordnung von Namen und Zahlen hinterlegst und Dich dann mit der Funktion SVERWEIS darauf beziehst. Nicht gefundene Namen führen zum Fehler #NV, der abgefangen und durch "" ersetzt werden kann.

Grüße
EarlFred

schlaubi
11.04.2012, 16:38
Vielen Dank. Ich les mich gerade hier (http://www.online-excel.de/excel/singsel.php?f=9) ein und werde es morgen probieren. Falls bis dahin jemand der Meinung wäre, dass es noch einen einfacheren Weg gäbe, bitte posten, ich schaue dann nochmal morgen Früh ins Forum.

Liebe Grüße, schlaubi

EarlFred
11.04.2012, 16:45
Hallo schlaubi,

gute Quelle, die Du Dir da gesucht hast - wäre auch mein Tipp gewesen, wenn Du nichts passendes gefunden hättest.

Falls bis dahin jemand der Meinung wäre, dass es noch einen einfacheren Weg gäbe
Wenn Du den SVerweis einmal "gefressen" hast, wirst Du vermutlich nichts einfacheres mehr finden (wollen).

Grüße
EarlFred

schlaubi
12.04.2012, 10:26
Wichtige Frage: Ich habe mir mal die Anleitung angeschaut, da wird mehrfach darauf hingewiesen, dass die Werte ein Kontinuum darstellen müssen. Das ist aber bei mir nicht der Fall, es geht um eine arbiträre Zuordnung, also Meier 123456 bekommen, Müller die 123457, dann aber Kaufmann die 123467. Und Excel soll NUR anschlagen, wenn EXAKT der Wert getroffen wird.

Grüße & Danke, Philip

EarlFred
12.04.2012, 10:41
Hallo Philip,

Durch die Angabe des vierten Argumentes mit Falsch [oder 0] wird erwirkt, dass genau [=exakt!] nach dem Suchwert gefahndet wird.


Das geht dann sogar soweit, dass der Text "12345" nicht gefunden wird, wenn als Vergleich die Zahl 12345 vorgegeben wird.

Grüße
EarlFred

schlaubi
12.04.2012, 10:53
Oh danke, ganz überlesen, das ging jetzt in der Vielfalt der Informationen unter...

schlaubi
12.04.2012, 11:49
Es wird noch komplizierter: In der Suchspalte (D, siehe unten) stehen eben nicht nur die gesuchten Namen, sondern meistens noch mehrere weitere Namen mit Vornamen oder Kürzel, getrennt durch Komma. D.h. Bereich_Verweis = Falsch kann hier garnicht funktionieren. Auch ohne "Falsch" liefert SVerweis keine Ergebnisse.
Zur Sicherheit mal meine Formel, nicht, dass da ein banaler Fehler drin ist:
=SVERWEIS(D2;Tabelle2!$A$1:$B$8;1;)
Erklärung: Durchsucht wird die Zelle D auf Blatt 1, auf Blatt 2 liegen in Spalte 1 die Zahlen, in Spalte 2 die Namen, zurückgegeben werden soll die die zum Namen gehörende Zahl in Spalte 1.

Vielen Dank & Grüße, schlaubi

EarlFred
12.04.2012, 12:04
Hallo Philip,

zuverlässige Auswertungen erfordern eine saubere Datenbasis. Sind die Daten wahllos durchmischt, bereitest Du Dir massig Probleme.

Vielleicht verstehe ich Dich auch einfach nur nicht richtig, dann könnte eine Mustertabelle Aufschluss geben.
So steige ich aber erstmal aus.

Grüße
EarlFred

schlaubi
12.04.2012, 12:29
Also es ist eigentlich ganz einfach: Die Daten stammen aus einer bibliographischen Datenbank. In Tabelle 1, Zeile D sind die Autoren erfasst und da können eben mehrere stehen, mit Vorname oder Kürzel. Ich muss jetzt die Autoren einem Institutionenschlüssel zuordnen. Jetzt könnte man diese Liste eben von Hand durchgehen und die Nummern eintragen, ich würde diese Arbeit aber gerne so weit als möglich automatisieren.
Ich hatte jetzt die Hoffnung, dass SVerweis die Spalte D nach Übereinstimmung nur des in der Matrix angegebenen Nachnamens (Tabelle 2, Spalte 2) durchsuchen kann und dann die zugehörige Nummer ausgibt.
Das geht so nicht?

Vielen Dank für die Mühe, schlaubi

mücke
12.04.2012, 12:35
Moin Philip,

... Beispielmappe ;)
... sonst wird das hier wie früher in der Quizshow Rate mal mit Rosenthal :D

schlaubi
16.04.2012, 13:27
Ich hatte gehofft, es geht mit umfassender Beschreibung auch ohne, da ich die Daten nicht einfach zur Verfügung stellen möchte. Ich werde eine anonymisierte Beispielmappe zusammenstellen.

schlaubi
18.04.2012, 16:07
Jetzt endlich die Beispielmappe; mir ist noch aufgefallen, dass man den Konfliktfall (was tun, wenn mehrere Ergebnisse zutreffen) noch managen müsste: Der Name, der in Spalte D ganz vorne steht, müsste als Erster ausgewertete und zugeordnet werden, ab Position 2 wäre es egal, welchem das zugeordnet wird.

Wobei es auch passen dürfte, wenn man den Konfliktfall einfach außen vor lässt, das kommt jetzt nur in meiner Beispieldatei so oft vor.

Grüße & Danke, schlaubi

Hasso
19.04.2012, 14:05
Hallo Schlaubi,

auf jeden Fall müsstest du in der zweiten Tabelle die Spaltereihenfolge umdrehen, also in Spalte A die Namen und in Spalte B die Kostenstellen. SVERWEIS durchsucht die Matrix immer von links nach rechts.

Außerdem stehen in Spalte D der Tabelle1 Namen mit einem Zusatz (z.B. Müller K) - aber in Tabelle2 stehen nur einzelne Namen ohne Zusatz (Müller). Wie soll denn da eine Zuordnung gefunden werden??

Du solltest den Aufbau der Tabelle bzw. den Inhalt der Felder noch mal überdenken.

schlaubi
26.04.2012, 11:16
Vielen Dank für die Infos.
Allerdings wäre das in meinem Fall gerade der Witz an der Sache, dass die Angaben in Spalte D, Tabelle 1, eben NICHT 100% mit meinem Verweisparameter aus Tabelle 2 übereinstimmen. Hintergrund ist das nicht alle sich an die Konventionen halten (die lautet Nachname + erster Buchstabe Vorname) und ich eben ALLE Varianten finden möchte (z. B. auch Nachname + voller Vorname), weshalb ich NUR den Nachnamen angegeben habe.

Sehr ich das richtig, das sowas mit SVERWEIS NICHT möglich ist? Was wäre denn eine adäquate Herangehensweise?

Viele Grüße & Danke, schlaubi

Hasso
26.04.2012, 12:57
Hallo schlaubi,

ich würde einfach eine benutzerdefinierte Funktion verwenden.

Option Explicit
Public Function KostenstelleZuordnen(kst As Range)

Dim zelle As Range

For Each zelle In Worksheets("Tabelle2").Range("B1:B100")
If InStr(kst, zelle) > 0 Then
KostenstelleZuordnen = zelle.Offset(0, -1)
Exit Function
End If
Next
End Function


In die Zelle schreibst du dann einfach die Funktion wie eine normale Excel-Funktion:
<table border="1" cellspacing="0" cellpadding="0" style="font-family:Arial,Arial; font-size:10pt; background-color:#fffbf0; padding-left:2pt; padding-right:2pt; "> <colgroup><col style="font-weight:bold; width:30px; " /><col style="width:117.6px;" /><col style="width:54.4px;" /><col style="width:110.4px;" /><col style="width:302.4px;" /></colgroup><tr style="background-color:#cacaca; text-align:center; font-weight:bold; font-size:8pt; "><td >&nbsp;</td><td >A</td><td >B</td><td >C</td><td >D</td></tr><tr style="height:22px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >1</td><td >Neue Kostenstelle</td><td >Lfdnr</td><td >Typ</td><td >Autor</td></tr><tr style="height:22px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >2</td><td style="text-align:center; ">00002</td><td style="text-align:right; ">136994</td><td >Artikel</td><td >M&uuml;ller K</td></tr><tr style="height:22px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >3</td><td style="text-align:center; ">00002</td><td style="text-align:right; ">136995</td><td >Artikel</td><td >M&uuml;ller K</td></tr><tr style="height:22px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >4</td><td style="text-align:center; ">00002</td><td style="text-align:right; ">136996</td><td >Artikel</td><td >M&uuml;ller K</td></tr><tr style="height:22px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >5</td><td style="text-align:center; ">00002</td><td style="text-align:right; ">130120</td><td >Artikel</td><td >M&uuml;ller K, Mustermann M, Schmidt P, Maier M</td></tr><tr style="height:22px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >6</td><td style="text-align:center; ">00002</td><td style="text-align:right; ">130127</td><td >Artikel</td><td >M&uuml;ller K, Mustermann M, Schmidt P</td></tr><tr style="height:22px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >7</td><td style="text-align:center; ">00002</td><td style="text-align:right; ">132906</td><td >Monographie</td><td >M&uuml;ller K, Mustermann M, Schmidt P, Meier L</td></tr><tr style="height:22px ;" ><td style="font-size:8pt; background-color:#cacaca; text-align:center; " >8</td><td style="text-align:center; ">00003</td><td style="text-align:right; ">127912</td><td >Monographie</td><td >Mustermann M</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 >A2</td><td >=KostenstelleZuordnen(D2)</td></tr><tr><td >A3</td><td >=KostenstelleZuordnen(D3)</td></tr><tr><td >A4</td><td >=KostenstelleZuordnen(D4)</td></tr><tr><td >A5</td><td >=KostenstelleZuordnen(D5)</td></tr><tr><td >A6</td><td >=KostenstelleZuordnen(D6)</td></tr><tr><td >A7</td><td >=KostenstelleZuordnen(D7)</td></tr><tr><td >A8</td><td >=KostenstelleZuordnen(D8)</td></tr></table></td></tr></table> <br /><br /><span style="font-family:Arial; font-size:9pt; font-weight:bold;background-color:#ffffff; color:#000000; ">Excel Tabellen im Web darstellen &gt;&gt; </span><a style ="font-family:Arial; font-size:9pt; color:#fcf507; background-color:#800040; font-weight:bold;" href="http://www.excel-jeanie-html.de" target="_blank"> Excel Jeanie HTML 4 </a>

Wenn der Name nicht vorhanden ist, gibt er Kostenstelle 00000 aus.
Beispielmappe anbei.

schlaubi
26.04.2012, 16:44
Vielen lieben Dank!
Hab mir die Bestandteile mal angeschaut um zu verstehen, was das Script macht. Interessant!
Bei der Nutzung bekomme ich jedoch die Fehlermeldung #Name!, was aber vermutlich an meiner Unfähigkeit liegt das Script "anzuwenden". Habe es bisher nur in ein VBA-Codefenster kopiert...

Grüße, schlaubi

Hasso
26.04.2012, 19:59
Hallo schlaubi,

Hab mir die Bestandteile mal angeschaut um zu verstehen, was das Script macht. Interessant!
Bei der Nutzung bekomme ich jedoch die Fehlermeldung #Name!, was aber vermutlich an meiner Unfähigkeit liegt das Script "anzuwenden". Habe es bisher nur in ein VBA-Codefenster kopiert...

Erstelle im Codefenster ein neues Modul (Menü Einfügen|Modul) und kopiere den Code da rein, so wie ich es auch in meiner Beispieldatei gemacht habe.

Pit987
27.04.2012, 05:37
Hallo Schlaubi!
SVERWEIS ist da schon das Mittel der Wahl.
Bei Deiner Namenssuche sollte eine Extraspalte Deine Namesspalte D so aufbereiten, dass Deine Suche möglich wird. Dazu am Ende vom Datensatz das Namensfeld mit "Text in Spalte" auftrennen und mit Verketten wieder zusammenbauen.

Da Du Titel hast, die mehrere Autoren haben, muß ja das gleiche Buch mehrfach angeführt werden, denn eine Zelle ist ein Name. Sonst wird der Suchbegriff meiner Meinung nach zu kompliziert.

Damit verändert sich der AUfbau der Tabelle. Die erste Spalte sollte das Suchkriterium sein.
Das muß aber nicht zwingend mit ausgedruckt oder gar nur angezeigt werden.

Bei all dem ist aber das Problem, dass SVERWEIS nur den ersten Treffer anzeigt. Alle Bücher von "Müller K" werden so nicht angezeigt.
Daher würde ich "Spalte B, die laufende Nummer" zusätzlich als erste Spalte anlegen. Das soll heißen, dass in der Spalte A und der Spalte C dann die laufende Nummer steht.
Das mußt Du für alle möglichen Suchbegriffe machen, denn SVERWEIS sucht freiwillig nur rechts vom Treffer.

Bücher und Autoren sind nicht so einfach zu listen. Da tauchen mehr "Graf von und zu" auf, als bei normalen Namenslisten. Wie gehst Du damit auf Deiner Liste um?


PS: Bei Guttenberg fehlen wohl ein paar Autoren

schlaubi
03.05.2012, 15:11
Hehe, Guttenberg :) .
Vielen Dank für die tolle Hilfe! Da ich gerade an einem Mac-Excel sitze und da keine VB-Makros laufen, habe ich das einfach nochmal mit SVERWEIS ausprobiert: Klappt jetzt. Ich habe kurzerhand als Suchkriterium eben doch Nachname + Erster Buchstabe Vorname genommen, und das Feld D einfach aufgesplittet. Das ist in Ordnung, wenn er das Buch nur dem Erstautor bzw. ersten Treffer zuweist, das Buch darf eh nur 1x auftauchen.

Es geht auch nicht um riesige Dateien und das ganze soll bloß eine Hilfestellung sein, es muss ohnehin manuelle nachgearbeitet werden. Passt wunderbar so!

schlaubi
15.05.2012, 11:00
Noch eine ergänzende Rückfrage, besonders an Hasso: Ich habe hier eine Tabelle einer anderen Datenbank, die ich für eine neue Version der Datenbank aufbereiten soll, siehe dazu mein Sample. Und zwar würde ich gerne die Datumsangaben der Spalte F, die z. T. per Komma und Kaufmanns-Und getrennt sind auf die Spalten H bis K verteilen. Ich denke auch, dass man das wohl per VBA/ Makro erledigen muss.
Kann mir da jemand weiterhelfen? Gerne auch per Link oder Hinweis auf die zu verwendenden Funktionen. Dürfte ja eine ziemlich klassische Aufgabenstellung sein...

Viele Grüße & Danke, schlaubi

CitizenX
15.05.2012, 11:56
Hi,

teste mal:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Sub</span> SplitMe()
<span class="TOKEN">Dim</span> myRange <span class="TOKEN">As</span> Range, Zelle <span class="TOKEN">As</span> Range, strTemp <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> z <span class="TOKEN">As</span> Long, s <span class="TOKEN">As</span> Long, k <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> myArray()
&nbsp;
<span class="TOKEN">On Error GoTo</span> errExit
<span class="TOKEN">Set</span> myRange = Sheets(&quot;Tabelle1&quot;).Columns(6).SpecialCells(xlCellTypeConstants)
<span class="TOKEN">ReDim</span> myArray(myRange.Cells.Count, 3)
&nbsp;
<span class="TOKEN">For</span> <span class="TOKEN">Each</span> Zelle <span class="TOKEN">In</span> myRange
strTemp = Replace(Zelle, &quot;&amp;&quot;, &quot;,&quot;)
<span class="TOKEN">For</span> k = 0 <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(Split(strTemp, &quot;,&quot;))
myArray(z, s) = Split(strTemp, &quot;,&quot;)(k)
s = s + 1
<span class="TOKEN">Next</span> k
s = 0
z = z + 1
<span class="TOKEN">Next</span>
myRange.Offset(, 2).Resize(myRange.Cells.Count, 4) = myArray
Columns(myRange.Offset(, 2).Column).Resize(, 4).AutoFit
&nbsp;
errExit:
<span class="TOKEN">Set</span> myRange = <span class="TOKEN">Nothing</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr>&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

schlaubi
15.05.2012, 15:35
Grandios, vielen Dank :cool: . Tut was es soll! Hab noch 2-3 kleine Anpassungen vorgenommen.
Ich habe den Code mal erläutert, man möge mich korrigieren und ergänzen:
Option Explicit

Sub SplitMe()

// Variablen- bzw. Felddeklaration
Dim myRange As Range, Zelle As Range, strTemp As String
Dim z As Long, s As Long, k As Long
Dim myArray()

// Wo soll gesucht werden. Aber was bringt SpecialCells(xlCellTypeConstants)? Und wozu ReDim?
On Error GoTo errExit
Set myRange = Sheets("Tabelle1").Columns(6).SpecialCells(xlCellTypeConstants)
ReDim myArray(myRange.Cells.Count, 3)

// Schleife durchsucht Bereich; erstmal werden alle "&" ersetzt, dann läuft er bis zum ersten Komma, aber dann ab For k komm ich nicht mehr ganz mit.
For Each Zelle In myRange
strTemp = Replace(Zelle, "&", ",")
For k = 0 To UBound(Split(strTemp, ","))
myArray(z, s) = Split(strTemp, ",")(k)
s = s + 1
Next k
s = 0
z = z + 1
Next

//Hier werden die Felder ab einer bestimmten Zelle ausgegeben und die Größe angepasst.
myRange.Offset(, 2).Resize(myRange.Cells.Count, 4) = myArray
Columns(myRange.Offset(, 2).Column).Resize(, 4).AutoFit

errExit:
Set myRange = Nothing
End Sub

Grüße & Danke, schlaubi

schlaubi
16.05.2012, 16:23
Vielleicht könnte mir jemand den Code noch ein bisschen erläutern?
Ich würde gerne noch die Jahreszahl 2012 an jede Zelle anhängen, da ich aber nicht ganz durchblicke, komme ich da ins Schleudern.

Grüße & Danke, schlaubi

CitizenX
16.05.2012, 17:25
Hi,

ich hab's noch etwas umgestaltet, da die SpecialCells- Methode
hier nicht notwendig ist und auch bei nicht zusammenhängenden
Bereichen zu einer fehlerhaften Ausgabe führt.

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Sub</span> SplitMe2()
<span class="TOKEN">Dim</span> strTemp <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> z <span class="TOKEN">As</span> Long, s <span class="TOKEN">As</span> Long, k <span class="TOKEN">As</span> Long, lngLast <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> MySplit <span class="REM">' nur f&uuml;r Testzwecke</span>
&nbsp;
<span class="TOKEN">With</span> Sheets(&quot;Tabelle1&quot;)
<span class="REM"> ' letze bef&uuml;llte Zeile in Spalte 6 (&quot;F&quot;)</span>
lngLast = .Cells(.Rows.Count, 6).End(xlUp).Row
&nbsp;
<span class="REM"> ' Array Dimensionieren</span>
<span class="TOKEN">ReDim</span> myArray(1 <span class="TOKEN">To</span> lngLast, 3)
&nbsp;
<span class="REM"> ' Schleife von der 1 .sten Zeile zur letzten Zeile</span>
<span class="TOKEN">For</span> z = 1 <span class="TOKEN">To</span> lngLast
&nbsp;
<span class="REM"> ' wechseln des &amp;-Zeichen in Komma</span>
strTemp = Replace(.Cells(z, 6), &quot;&amp;&quot;, &quot;,&quot;)
&nbsp;
<span class="REM"> 'Schleife zum f&uuml;llen des Array mit den Feldern des Split Datenfeldes ( k - gibt das Feld an)</span>
<span class="TOKEN">For</span> k = 0 <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(Split(strTemp, &quot;,&quot;))
<span class="REM"> ' dient zur Veranschaulichung- im Lokalfenster werden die Datenfelder ausgegeben</span>
MySplit = Split(strTemp, &quot;,&quot;)
myArray(z, s) = Split(strTemp, &quot;,&quot;)(k) &amp; &quot;2012&quot;
<span class="REM"> 's -Spaltenz&auml;hler</span>
s = s + 1
<span class="TOKEN">Next</span> k
&nbsp;
<span class="REM"> 'Spaltenz&auml;hler f&uuml;r Neubef&uuml;llung auf Null setzen</span>
s = 0
<span class="TOKEN">Next</span>
&nbsp;
<span class="REM"> ' Ausgabebereich dimensionieren und mit Werten des Array f&uuml;llen</span>
.Cells(1, 8).Resize(lngLast, 4) = myArray
<span class="REM"> ' Spalten an Gr&ouml;&szlig;e anpassen</span>
.Columns(8).Resize(, 4).AutoFit
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr>&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Note:
Wenn du im Einzelschritt Modus ( F8 ) durch den Code gehst, kannst du dir im
Lokal Fenster (http://www.vba-workshop.de/index.php?article=52) die Datenfelder der Split (http://www.online-excel.de/excel/singsel_vba.php?f=20) Funktion ansehen ( MySplit )

schlaubi
22.05.2012, 16:07
Vielen Dank, gerade ausprobiert. Funktioniert natürlich 1a.
Hab noch zwei Erweiterungen eingebaut:
' wechseln des &-Zeichen in Komma
strTemp = Replace(.Cells(z, 6), "&", ",")
strTemp = Replace(strTemp, ".", "/")
strTemp = Replace(strTemp, "jeden Jahres", "")

Aber leider ersetzt der die "/" nie beim ersten Datum in der Zeile?

Außerdem ist mir noch eine Methode eingefallen, wie ich verhindern kann, dass Split bei anderen Strings als Datumsangaben in der Zeile angewendet wird: Split soll die Punkte in der Zeile zählen und sofern min. 2 vorhanden sind, abbrechen. Mein Gedanke war also abstrakt: Anzahl Punkte in Variable zählen, dann If-Schleife: Wenn <2 garnix tun, ansonsten Script ausführen. Mit der konkretren Umsetzung bin ich aber noch überfordert...

Grüße und Danke, schlaubi

CitizenX
22.05.2012, 16:31
Hi,

ersetze mal die Schleife:


<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">For</span> z = 1 <span class="TOKEN">To</span> lngLast
&nbsp;
<span class="REM"> ' String aufbereiten</span>
strTemp = Replace(.Cells(z, 6), &quot;&amp;&quot;, &quot;,&quot;)
strTemp = Replace(strTemp, &quot;.&quot;, &quot;/&quot;)
strTemp = Replace(strTemp, &quot;jeden Jahres&quot;, &quot;&quot;)
strTemp = Replace(strTemp, &quot; &quot;, &quot;&quot;)
&nbsp;
<span class="REM"> 'Schleife zum f&uuml;llen des Array mit den Feldern des Split Datenfeldes ( k - gibt das Feld an)</span>
<span class="TOKEN">For</span> k = 0 <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(Split(strTemp, &quot;,&quot;))
<span class="REM"> ' dient zur Veranschaulichung- im Lokalfenster werden die Datenfelder ausgegeben</span>
MySplit = Split(strTemp, &quot;,&quot;)
myArray(z, s) = &quot;'&quot; &amp; Split(strTemp, &quot;,&quot;)(k) &amp; &quot;2012&quot;
<span class="REM"> 's -Spaltenz&auml;hler</span>
s = s + 1
<span class="TOKEN">Next</span> k</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

schlaubi
05.06.2012, 16:36
So, ein letztes Mal: Die Umformatierung ist noch nicht wie gewünscht. Wie bekomme ich das hin, dass die Datumseinträge am Ende 2012-12-31 aussehen, also yyyy-mm-dd?

Danke im voraus, schlaubi

CitizenX
05.06.2012, 16:56
Hi,


<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
&nbsp;
<span class="TOKEN">Sub</span> SplitMe3()
<span class="TOKEN">Dim</span> strTemp <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> z <span class="TOKEN">As</span> Long, s <span class="TOKEN">As</span> Long, k <span class="TOKEN">As</span> Long, lngLast <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">With</span> Sheets(&quot;Tabelle1&quot;)
<span class="REM"> ' letze bef&uuml;llte Zeile in Spalte 6 (&quot;F&quot;)</span>
lngLast = .Cells(.Rows.Count, 6).End(xlUp).Row
&nbsp;
<span class="REM"> ' Array Dimensionieren</span>
<span class="TOKEN">ReDim</span> myArray(1 <span class="TOKEN">To</span> lngLast, 3)
&nbsp;
<span class="REM"> ' Schleife von der 1 .sten Zeile zur letzten Zeile</span>
<span class="TOKEN">For</span> z = 1 <span class="TOKEN">To</span> lngLast
&nbsp;
<span class="REM"> ' String aufbereiten</span>
strTemp = Replace(.Cells(z, 6), &quot;&amp;&quot;, &quot;,&quot;)
strTemp = Replace(strTemp, &quot;jeden Jahres&quot;, &quot;&quot;)
strTemp = Replace(strTemp, &quot; &quot;, &quot;&quot;)
&nbsp;
<span class="REM"> 'Schleife zum f&uuml;llen des Array mit den Feldern des Split Datenfeldes ( k - gibt das Feld an)</span>
<span class="TOKEN">For</span> k = 0 <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(Split(strTemp, &quot;,&quot;))
myArray(z, s) = DateValue(Split(strTemp, &quot;,&quot;)(k) &amp; &quot;2012&quot;)
<span class="REM"> 's -Spaltenz&auml;hler</span>
s = s + 1
<span class="TOKEN">Next</span> k
<span class="REM"> 'Spaltenz&auml;hler f&uuml;r Neubef&uuml;llung auf Null setzen</span>
s = 0
<span class="TOKEN">Next</span>
&nbsp;
<span class="REM"> ' Ausgabebereich dimensionieren und mit Werten des Array f&uuml;llen</span>
.Cells(1, 8).Resize(lngLast, 4) = myArray
.Cells(1, 8).Resize(lngLast, 4).NumberFormat = &quot;yyyy-mm-dd&quot;
<span class="REM"> ' Spalten an Gr&ouml;&szlig;e anpassen</span>
.Columns(8).Resize(, 4).AutoFit
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr>&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

schlaubi
06.06.2012, 11:44
So einfach geht das! Vielen Dank.
Habe auch schon überlegt, ob ich das einfach über EXcel und das Format nachträglich umstellen soll, aber so ists schöner.

Aber: Ich habe jetzt die Daten, die per Script bearbeitet werden sollen, auf ein eigenes Blatt gepackt. Ich habe das Script zwar angepasst, aber leider gibts trotzdem den Laufzeitfehler 13: Typen unverträglich und den Debug-Verweis auf Zeile
myArray(z, s) = DateValue(Split(strTemp, ",")(k) & "2012")

Hab mal ein Beispiel angehängt. Wahrscheinlich nur ein Anfängerfehler, aber ich probier jetzt seit ner Stunde rum und komme nicht drauf...

Grüße, schlaubi

schlaubi
11.06.2012, 14:09
Darf ich nochmal nachhaken? - wäre wirklich super, wenn jemand noch ein letztes Mal schauen könnte. Ich vermute, es liegt an der Zellenformatierung, wobei auch Änderungen diesbezüglich keine Besserung gebracht haben...

IngGi
11.06.2012, 14:49
Hallo Schlaubi,

in Zelle B6 fehlt der Punkt hinter dem Datum 01.03.

Wenn du da einfach das Jahr 2012 anhängst, erhältst du "01.032012". Daraus kann die Funktion DateValue kein Datum machen, daher der Laufzeitfehler.

Gruß Ingolf

schlaubi
12.06.2012, 13:51
Oh man, *schäm*. Vielen Dank für den Hinweis!