PDA

Vollständige Version anzeigen : Wandeln von Daten


JBO73
24.03.2009, 14:40
Hallo Leute,

Ich stehe mal wieder vor einem Problem:

In einem Feld befindet sich ein code:
z.B.
01A 1AB 6Y4 80I A14 A33 AQ6 AY0 B9K BBH C87 C93 C95 CJ2 CZ3 D7A DAE DG6 DP6 DU3 DU5 DVK E88 EDP FBE FX1 FX3 G62 GEV JL9 K34 K48 K60 KB5 KD4 LHD LUJ

dieser sollte Code, der auch länger sein kann soll durch ein Makro in eine neue .csv Datei gespeichert werden.
Alle Codes untereinander, nicht nebeneinander. und das Feld speichern unter direkt aufgehen und .csv schon ausgewählt sein.

Kriegt das jemand hin?

Gruß
JBO73

chris-kaiser
24.03.2009, 15:33
hiho


Sub csv_()
'ich gehe davon aus das der Text in A1 steht oder?
Dim myArr
myArr = Split([a1], " ")
Range([a1], Cells(UBound(myArr) + 1, 1)) = WorksheetFunction.Transpose(myArr)
ActiveWorkbook.SaveAs Filename:=ActiveWorkbook.Path & "\" & Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - 4) & ".csv", _
FileFormat:=xlCSV, CreateBackup:=False, local:=True
End Sub

hier mal ein Ansatz

IngGi
24.03.2009, 15:41
Hallo JBO73,

versuch's mal hiermit:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Sub</span> Speichern_CSV()
&nbsp;
<span class="TOKEN">Dim</span> vntArray <span class="TOKEN">As</span> Variant
<span class="TOKEN">Dim</span> intSheets <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> intDaten <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> strArray() <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="REM">'Daten in Variant-Array &uuml;bergeben</span>
vntArray = Split(ActiveSheet.Range(&quot;A1&quot;), &quot; &quot;)
<span class="REM">'Hilfsarray entsprechend der Gr&ouml;&szlig;e des Variantarrays dimensionieren</span>
<span class="TOKEN">ReDim</span> strArray(<span class="TOKEN">UBound</span>(vntArray), 0)
<span class="REM">'Daten aus Variantarray in Hilfsarray transponieren</span>
<span class="TOKEN">For</span> intDaten = 0 <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(vntArray)
strArray(intDaten, 0) = vntArray(intDaten)
<span class="TOKEN">Next</span> <span class="REM">'intDaten</span>
&nbsp;
<span class="REM">'Neue Arbeitsmappe erzeugen</span>
Workbooks.Add
<span class="REM">'Warnmeldungen beim L&ouml;schen der Tabellenbl&auml;tter unterdr&uuml;cken</span>
Application.DisplayAlerts = <span class="TOKEN">False</span>
<span class="TOKEN">For</span> intSheets = ActiveWorkbook.Sheets.Count <span class="TOKEN">To</span> 2 <span class="TOKEN">Step</span> -1
<span class="REM"> 'alle Tabellenbl&auml;tter, bis auf eines l&ouml;schen</span>
Sheets(intSheets).Delete
<span class="TOKEN">Next</span> <span class="REM">'intSheets</span>
<span class="REM">'Warnmeldungen wieder einschalten</span>
Application.DisplayAlerts = <span class="TOKEN">True</span>
<span class="REM">'Transponiertes Array einf&uuml;gen</span>
ActiveSheet.Range(&quot;A1:A&quot; &amp; <span class="TOKEN">UBound</span>(vntArray) + 1) = strArray
<span class="REM">'SaveAs-Dialog aufrufen, Dateityp CSV vorw&auml;hlen</span>
Application.Dialogs(xlDialogSaveAs).Show , 6
&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)

Gruß Ingolf

IngGi
24.03.2009, 15:43
Hallo Chris,

da hab ich mich zu lange mit dem Transponieren aufgehalten. WorksheetFunction.Transpose wollte mir partout nicht einfallen.

Gruß Ingolf

chris-kaiser
24.03.2009, 16:03
Hallo Ingolf

dafür habe ich überlesen das er nur den Speicherdialog haben will ^^

Sub csv_()
Dim myArr
myArr = Split([a1], " ")
Workbooks.Add
Range([a1], Cells(UBound(myArr) + 1, 1)) = WorksheetFunction.Transpose(myArr)
Application.Dialogs(xlDialogSaveAs).Show , 6
End Sub

JBO73
25.03.2009, 21:07
Hallo IngGi,

net schlecht einen Wunsch hätte ich noch.
Wie kann ich folgende Zeile anpassen, dass ich erst die Zelle anwähle in der der Code steht, und dann das Makro starte! Das Problem ist das ich steuern muss wann und auf welche Zelle das Makro ausgeführt wird!

vntArray = Split(ActiveSheet.Range("A1"), " ")

Danke noch mal für die klasse Hilfe.

Gruß

JBO73

JBO73
25.03.2009, 21:14
Spitze auch Dein Code, nur hab ich hier auch das Problem, dass ich das Makro für jedes neue Feld anpassen muss.

Es wäre auch hier ein Wunsch, das ich erst das zu "konvertierende Feld" auswähle und dann das Makro starte. Es wäre auch OK wenn ich erst das Makro starte, dann das zu "konvertierende Feld" auswähle und dann das Makro den Rest macht.
Danke
Gruß
JBO73

IngGi
25.03.2009, 21:55
Hallo JBO73,

mit folgender Ergänzung/Änderung wird die Zelle über eine Inputbox ausgewählt. Du kannst entweder die Adresse der Zelle über die Tastatur eintragen oder ganz einfach die gewünschte Zelle mit der Maus auswählen. Wenn du mit der Maus einen Zellbereich mit mehreren Zellen auswählst, wird die obere linke Zelle genommen:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Sub</span> Speichern_CSV()
&nbsp;
<span class="TOKEN">Dim</span> vntArray <span class="TOKEN">As</span> Variant
<span class="TOKEN">Dim</span> intSheets <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> intDaten <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>
<span class="TOKEN">Dim</span> strArray() <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> rng <span class="TOKEN">As</span> Range
&nbsp;
<span class="REM">'Zelle &uuml;ber Inputbox ausw&auml;hlen</span>
<span class="TOKEN">Set</span> rng = Application.InputBox(Prompt:=&quot;Gew&uuml;nschte Zelle ausw&auml;hlen&quot;, Type:=8)
<span class="REM">'Wenn keine Zelle ausgew&auml;hlt, Makro beenden</span>
<span class="TOKEN">If</span> rng <span class="TOKEN">Is</span> <span class="TOKEN">Nothing</span> <span class="TOKEN">Then</span> <span class="TOKEN">Exit Sub</span>
&nbsp;
<span class="REM">'Daten in Variant-Array &uuml;bergeben</span>
vntArray = Split(rng.Resize(1, 1), &quot; &quot;)
<span class="REM">'Hilfsarray entsprechend der Gr&ouml;&szlig;e des Variantarrays dimensionieren</span>
<span class="TOKEN">ReDim</span> strArray(<span class="TOKEN">UBound</span>(vntArray), 0)
<span class="REM">'Daten aus Variantarray in Hilfsarray transponieren</span>
<span class="TOKEN">For</span> intDaten = 0 <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(vntArray)
strArray(intDaten, 0) = vntArray(intDaten)
<span class="TOKEN">Next</span> <span class="REM">'intDaten</span>
&nbsp;
<span class="REM">'Neue Arbeitsmappe erzeugen</span>
Workbooks.Add
<span class="REM">'Warnmeldungen beim L&ouml;schen der Tabellenbl&auml;tter unterdr&uuml;cken</span>
Application.DisplayAlerts = <span class="TOKEN">False</span>
<span class="TOKEN">For</span> intSheets = ActiveWorkbook.Sheets.Count <span class="TOKEN">To</span> 2 <span class="TOKEN">Step</span> -1
<span class="REM"> 'alle Tabellenbl&auml;tter, bis auf eines l&ouml;schen</span>
Sheets(intSheets).Delete
<span class="TOKEN">Next</span> <span class="REM">'intSheets</span>
<span class="REM">'Warnmeldungen wieder einschalten</span>
Application.DisplayAlerts = <span class="TOKEN">True</span>
<span class="REM">'Transponiertes Array einf&uuml;gen</span>
ActiveSheet.Range(&quot;A1:A&quot; &amp; <span class="TOKEN">UBound</span>(vntArray) + 1) = strArray
<span class="REM">'SaveAs-Dialog aufrufen, Dateityp CSV vorw&auml;hlen</span>
Application.Dialogs(xlDialogSaveAs).Show , 6
&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)

Gruß Ingolf

JBO73
26.03.2009, 07:56
Hallo Ingolf,

das ist ja klasse! Eine Frage hätte ich noch:


Der Pfad ist immer der gleiche, er steht also auch fest.

Der Pfad lautet immer:

C:\AdminN001\ABAT\ARBEITSORDNER ABAT BOM\RPO

Der Dateiname steht in der selben Zeile in Spalte "R".

Kann man das einbauen?

Danke.

Gruß

Jens

IngGi
26.03.2009, 08:08
Hallo Jens,

das würde dann so aussehen:
Application.Dialogs(xlDialogSaveAs).Show _
"C:\AdminN001\ABAT\ARBEITSORDNER ABAT BOM\RPO\" & Range("R" & rng.Row), 6
Gruß Ingolf

JBO73
26.03.2009, 08:30
Hallo Ingolf,


das funktioniert leider nicht! Das Speichern unter Fenster geht auf, aber der Dateiname aus der Spalte R übernimmt er nicht.
Von mir aus kann er automatisch speichern mit dem Dateiname aus Spalte R.

Dieses "Speichern unter" ist kein muss, wenn der Speicher Ort immer der selbe Pfad (C:\AdminN001\ABAT\ARBEITSORDNER ABAT BOM\RPO) ist, kann das Makro direkt dort die Datei speichern mit dem Name aus der Spalte R .
Z.B.
Ich wähle in Zeile 10 Spalte O ein Feld aus um es mit dem Makro zu konvertieren, dann ist der Name der Datei in auch in Zeile 10 in der Spalte R.

Danke noch mals für das Klasse Makro.

Gruß

Jens

chris-kaiser
26.03.2009, 08:42
hiho

Sub csv_()
Dim myArr, rng As Range, StrSp As String, WBcsv As Workbook
Const StrPath = "C:\AdminN001\ABAT\ARBEITSORDNER ABAT BOM\RPO\"
Set rng = Application.InputBox(Prompt:="Gewünschte Zelle auswählen", Type:=8)
If rng Is Nothing Then Exit Sub
StrSp = Cells(rng.Row, "R").Value & ".csv"
myArr = Split(rng, " ")
Workbooks.Add
Set WBcsv = ActiveWorkbook
Range([a1], Cells(UBound(myArr) + 1, 1)) = WorksheetFunction.Transpose(myArr)
WBcsv.SaveAs Filename:=StrPath & StrSp, FileFormat:=xlCSV, CreateBackup:=False, local:=True
WBcsv.Close True
End Sub

JBO73
26.03.2009, 09:23
Das ist ja spitze.

kann man dieses etwas erweitern, so dass ich das auf einen ganzen Bereich( es ist immer die Spalte O , aber immer nur ein Teil nicht die Gesammte) anweden kann und wenn eine Datei überschrieben werden kann soll er es automatisch machen ohne nachzufragen.
Z.B.

O81 bis O114

Für jede Spalte sollte er dann eine .CSV Datei mit dem jeweiligen Namen aus R generieren.
Wenn überschreiben, dann auf jeden Fall, ohne Bestätigung.

Gruß & Danke

Jens

chris-kaiser
26.03.2009, 09:44
hiho

Sub csv_()
Dim myArr, rng As Range, StrSp As String, WBcsv As Workbook
Const StrPath = "C:\AdminN001\ABAT\ARBEITSORDNER ABAT BOM\RPO\"
For icount = 81 To 114
StrSp = Cells(icount, "R").Value & ".csv"
myArr = Split(Cells(icount, "O"), " ")
Workbooks.Add
Set WBcsv = ActiveWorkbook
Range([a1], Cells(UBound(myArr) + 1, 1)) = WorksheetFunction.Transpose(myArr)
Application.DisplayAlerts = False
WBcsv.SaveAs Filename:=StrPath & StrSp, FileFormat:=xlCSV, CreateBackup:=False, local:=True
Application.DisplayAlerts = True
WBcsv.Close False
Next
End Sub

p.s hättest Du das schon früher genauer beschrieben ........:rolleyes:

JBO73
26.03.2009, 09:49
Hallo,

net schlecht, den Bereich wollte ich schon selbst wählen! Sowie vorher !

Enschuldige bitte für die Mühe!

Danke trozdem!

Gruß

Jens

chris-kaiser
26.03.2009, 10:27
hiho

Sub csv_()
Dim myArr, rng As Range, StrSp As String, WBcsv As Workbook, cell_ as Range
Const StrPath = "C:\AdminN001\ABAT\ARBEITSORDNER ABAT BOM\RPO\"
Set rng = Application.InputBox(Prompt:="Gewünschte Zelle auswählen", Type:=8)
If rng Is Nothing Then Exit Sub
For Each cell_ In rng
StrSp = Cells(cell_.Row, "R") & ".csv"
myArr = Split(cell_, " ")
Workbooks.Add
Set WBcsv = ActiveWorkbook
Range([a1], Cells(UBound(myArr) + 1, 1)) = WorksheetFunction.Transpose(myArr)
Application.DisplayAlerts = False
WBcsv.SaveAs Filename:=StrPath & StrSp, FileFormat:=xlCSV, CreateBackup:=False, local:=True
Application.DisplayAlerts = True
WBcsv.Close False
Next
End Sub

JBO73
26.03.2009, 11:57
Danke.

klappt wunderbar.

Gruß

Jens

JBO73
26.03.2009, 17:08
Das würde ich auch gerne können, wie kann man sich das beibringen? Wie hast du das gelernt?

Gruß

Jens

chris-kaiser
27.03.2009, 08:49
Guten Morgen

wie kann man sich das beibringen? Wie hast du das gelernt?

zu meiner Person

1. viel Zeit (seit 1992 arbeite ich mehr oder weniger in der EDV Branche, Excel intensiver seit 2001)
2. Hobby (Excel ist viel mehr Hobby als Beruf)
3. in Foren mitlesen, ausprobieren , so lerne ich Tag für Tag was neues dazu
4. F1 :)

Wenn es Dir die Zeit zulässt, einfach mal ab und zu reinschauen, das Archiv durchstöbern, Dinge ausprobieren, wenn es mal nicht klappt , Fragen stellen
Excelseiten besuchen...hier ein paar Links
auf den einzelnen Seiten findest Du auch Folgelinks

www.herber.de
größter deutschsprachiger Excelserver

www.excel-center.de
Beispiele, Foren, umfangreiche Linkliste

www.online-excel.de
private Seite von Peter Haserodt (auch mit Einstieg VBA)

www.excelformeln.de
alles rund um Excelfunktionen (fortgeschritten)

www.ms-office-forum.de
Alles rund ums Officepaket

Diagramme:
www.peltiertech.com
(engl. Seite)

http://beverly.excelhost.de
(deutsche Seite)

Lernhilfe sehr empfehlenswert! (Grundlagen)
www.klickdichschlau.at

für das Programmieren z.b
www.vb-fun.de
www.activevb.de
www.vbarchiv.de

jinx
27.03.2009, 15:39
Moin, Chris,

es heißt aber schon beinahe endlos lange nicht mehr ms-office-forum.de, sondern .net - Günther hält die alte Adresse immer noch und hat eine Weiterleitung geschaltet. so dass man immer auf der "richtigen" Seite landet... ;)

JBO73
27.03.2009, 17:01
Cool! Das einzige Prolem was ich habe, ist dieZeit!

Danke für die Links.

Ich habe jetzt noch weitere herausforderungen in Excel zu bewältigen!!

Am besten ich durch suche mal die Foren nach Ähnlichen Problemen.

Gruß

Jens

chris-kaiser
27.03.2009, 19:30
Hallo jinx

danke für die Info, wusste ich nicht!
Du kannst den Beitrag editieren
und auf .net ändern

so dass man immer auf der "richtigen" Seite landet...
:)

sind wir doch
und mein Post sollte sicherlich keine Fremdwerbung sein!
schicke Dir noch eine PN.

gruß
chris