PDA

Vollständige Version anzeigen : Vba


Kiri_Slad
07.07.2015, 20:53
Hallo,

ich bin ein ziemlicher VBA-Neuling.
Mein Problem ist, dass ich Messdaten, die als csv-Datein gespeichert sind in ein Excel Datenblatt importieren will. Hierzu habe ich folgendes erstellt:

Sub CSV_Import()
Dim dateien, i, lastrow
lastrow = 1
dateien = Application.GetOpenFilename _
("csv-Dateien (*.csv), *.csv", MultiSelect:=True)
If IsArray(dateien) Then
For i = 1 To UBound(dateien)
Workbooks.Open dateien(i), local:=True
With ThisWorkbook.Sheets(1)
ActiveSheet.UsedRange.Copy Destination:=.Range("A" & lastrow)
lastrow = .UsedRange.Rows.Count + 1
End With
ActiveWorkbook.Close False
Next i
End If
End Sub


Hier werden die Messergebnisse nacheinander in das Excel-Sheet kopiert.
Nun wäre gut, wenn Dateiname in einer Zeile über den Messergebnissen stehen würde. Aber ich komme mit meinen Kenntnissen leider nicht weiter.
Kann mir hier bitte jemand helfen?

Danke!!!!

Beverly
08.07.2015, 07:12
Hi,

vielleicht so:

Sub CSV_Import()
Dim dateien, i As Integer, lastrow As Long
lastrow = 1
dateien = Application.GetOpenFilename("csv-Dateien (*.csv), *.csv", MultiSelect:=True)
If IsArray(dateien) Then
For i = 1 To UBound(dateien)
Workbooks.Open dateien(i), local:=True
With ThisWorkbook.Sheets(1)
ActiveSheet.UsedRange.Copy Destination:=.Range("A" & lastrow + 1)
.Cells(lastrow, 1) = Mid(dateien(i), InStrRev(dateien(i), "\") + 1)
lastrow = .UsedRange.Rows.Count + 1
End With
ActiveWorkbook.Close False
Next i
End If
End Sub


<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Kiri_Slad
08.07.2015, 10:53
Hi,

vielen vielen Dank, dass klappt super!

Ist es auch möglich auch nur den Namen zu importieren ohne das .csv?

Auch ärgert mich Excel in der Hinsicht, dass es z.b. aus 27.5 den 27. Mai macht. Gibt es hier auch eine Möglichkeit?

Vielen Dank für die Hilfe!!!!!!!

Beverly
08.07.2015, 11:17
Hi,

zu Frage 1: benutze Substitute (oder Replace)

= Application.Substitute(Mid(dateien(i), InStrRev(dateien(i), "\") + 1), ".csv", "")

zu Frage 2: versuche es mal, indem du die betreffende Spalten als Text formatierst.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Kiri_Slad
10.07.2015, 16:24
Hi Beverly,

vielen Dank für deine Antworten! Hat mir sehr geholfen.
Es ist jetzt nur so, dass wenn ich nachträglich die Zellen als Text formatiere Excel mir z.B. aus 17.6 erst den 17. Juni macht (wie beschrieben), aber wenn ich nachträglich die Zelle als Text formatiere mir aus den 17. Juni 42172 macht. Was ist hier los?

Viele Dank!

Beverly
10.07.2015, 16:39
Hi,

vielleicht hilft es, wenn nur die Werte und nicht auch die Formate kopiert werden. Ändere mal diese Zeile

ActiveSheet.UsedRange.Copy Destination:=.Range("A" & lastrow + 1)

in diese 2 Zeilen

ActiveSheet.UsedRange.Copy
.Range("A" & lastrow + 1).PasteSpecial Paste:=xlValues


<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Kiri_Slad
12.07.2015, 17:13
Hallo Beverly,

vielen dank, dass du dir hier so viel Mühe gibst!!!!!!!

Ich habe es ausprobiert und da passiert etwas ganz interessantes:

Alle Werte die Punkt null sind (72.0 z.B.) werden richtig dargestellt, alle anderen werden als die wie oben genannten Tausender-Zahlen dargestellt.......??????????

Level [dBuV] 73.0
MER [dB] 42140
Link Margin [dB] 42194
CBER 4.7e-04
PER <1e-8

Beverly
12.07.2015, 17:23
Hi,

du hast die Zielzellen - wie schon geschrieben - zuerst als Text formatiert?

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Kiri_Slad
12.07.2015, 17:33
Hi,

ja, habe ich schon gemacht....

Viele Grüße!

Beverly
12.07.2015, 17:47
Hi,

dann lade doch mal eine Beispieldate hoch.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Kiri_Slad
12.07.2015, 18:55
Hier eine Datei

Danke!

Beverly
12.07.2015, 19:56
Datei fehlt.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

EarlFred
13.07.2015, 05:10
Hallo,

und täglich grüßt das Murmeltier...

CSV-Dateien niemals als Workbook öffnen, sondern
- per Importfunktion mit passenden Spezifikationen (Dezimaltrenner vorgeben)
- Inhalt (Text) auslesen und passend verarbeiten

Bitte selbst die Suche bemühen, dann findest Du vielleicht dies:
http://www.ms-office-forum.net/forum/showthread.php?t=278526

FSO ist nichtmal nötig, geht auch ohne

"VBA" ist übrigens ein sehr allgemeiner Betreff...

Grüße
EarlFred

EarlFred
13.07.2015, 08:23
Nachtrag
Link für Alternative zu FSO:
http://vb-tec.de/readfile.htm

Kiri_Slad
13.07.2015, 18:50
Hi Beverly,

ich glaube .csv Dateien kann ich hier nicht hochladen....????

Beverly
13.07.2015, 19:05
Hi,

du kannst sie aber als Zip-Datei hochladen.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Kiri_Slad
13.07.2015, 19:24
Jetzt vielleicht....

Danke!

xlph
14.07.2015, 07:48
Hallo,

eine mögliche Lösung:

<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">Public Sub</span> CSV_Import()
<span class="TOKEN">Dim</span> strText <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="TOKEN">Dim</span> vntDateipfade <span class="TOKEN">As</span> Variant
<span class="TOKEN">Dim</span> lngIndex <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> strPfad <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> strDateiname <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="TOKEN">Dim</span> avntDatensaetze() <span class="TOKEN">As</span> Variant
&nbsp;
vntDateipfade = Application.GetOpenFilename(&quot;csv-Dateien (*.csv), *.csv&quot;, MultiSelect:=True)
<span class="TOKEN">If</span> IsArray(vntDateipfade) <span class="TOKEN">Then</span>
<span class="TOKEN">For</span> lngIndex = <span class="TOKEN">LBound</span>(vntDateipfade) <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(vntDateipfade)
&nbsp;
strDateiname = Dir(vntDateipfade(lngIndex))
strPfad = Replace(vntDateipfade(lngIndex), strDateiname, &quot;&quot;)
&nbsp;
strText = ReadTxtFile(vntDateipfade(lngIndex))
&nbsp;
<span class="TOKEN">If</span> Len(strText) &gt; 0 <span class="TOKEN">Then</span>
&nbsp;
<span class="TOKEN">Call</span> TxtTo2DimArray(avntDatensaetze(), strPfad, strDateiname, strText)
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">Next</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">If</span> (<span class="TOKEN">Not</span> avntDatensaetze()) &lt;&gt; -1 <span class="TOKEN">Then</span>
Tabelle1.Range(&quot;A2&quot;).CurrentRegion.Offset(1).Clear
Tabelle1.Range(&quot;A2&quot;).Resize(<span class="TOKEN">UBound</span>(avntDatensaetze, 2), <span class="TOKEN">UBound</span>(avntDatensaetze, 1)).Value = _
WorksheetFunction.Transpose(avntDatensaetze)
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;
<span class="TOKEN">Private Sub</span> TxtTo2DimArray(<span class="TOKEN">ByRef</span> avntDatensaetze() <span class="TOKEN">As</span> Variant, <span class="TOKEN">ByVal</span> strPfad <span class="TOKEN">As</span> String, _
<span class="TOKEN">ByVal</span> strDateiname <span class="TOKEN">As</span> String, <span class="TOKEN">ByVal</span> strText <span class="TOKEN">As</span> <span class="TOKEN">String</span>)
&nbsp;
<span class="TOKEN">Dim</span> astrRow() <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> iastrRow <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Dim</span> astrElemente() <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> iastrElement <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Dim</span> avntTmp(0 <span class="TOKEN">To</span> 2) <span class="TOKEN">As</span> Variant
&nbsp;
<span class="TOKEN">Dim</span> lngIndex <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">If</span> (<span class="TOKEN">Not</span> avntDatensaetze()) = -1 <span class="TOKEN">Then</span>
lngIndex = 1
<span class="TOKEN">ReDim</span> avntDatensaetze(1 <span class="TOKEN">To</span> 24, 1 <span class="TOKEN">To</span> lngIndex)
<span class="TOKEN">Else</span>
lngIndex = <span class="TOKEN">UBound</span>(avntDatensaetze, 2) + 1
<span class="TOKEN">ReDim</span> <span class="TOKEN">Preserve</span> avntDatensaetze(1 <span class="TOKEN">To</span> 24, 1 <span class="TOKEN">To</span> lngIndex)
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
&nbsp;
avntDatensaetze(1, lngIndex) = strPfad
avntDatensaetze(2, lngIndex) = Replace(strDateiname, &quot;.csv&quot;, &quot;&quot;, Compare:=vbTextCompare)
&nbsp;
astrRow() = Split(strText, vbNewLine)
&nbsp;
<span class="TOKEN">For</span> iastrRow = <span class="TOKEN">LBound</span>(astrRow) <span class="TOKEN">To</span> <span class="TOKEN">UBound</span>(astrRow)
astrElemente() = Split(astrRow(iastrRow), &quot;;&quot;)
Select Case iastrRow
Case 0
avntDatensaetze(3, lngIndex) = <span class="TOKEN">CDate</span>(Right$(astrElemente(2), 8))
avntDatensaetze(4, lngIndex) = <span class="TOKEN">CDate</span>(astrElemente(3))
Case 2
avntDatensaetze(5, lngIndex) = Val(astrElemente(0))
avntDatensaetze(6, lngIndex) = astrElemente(2)
avntDatensaetze(7, lngIndex) = Val(astrElemente(4))
Case 3
avntDatensaetze(8, lngIndex) = astrElemente(1)
avntDatensaetze(9, lngIndex) = astrElemente(5)
Case 4 <span class="TOKEN">To</span> 8
&nbsp;
<span class="TOKEN">If</span> IsNumeric(astrElemente(1)) <span class="TOKEN">Then</span> avntTmp(0) = Val(astrElemente(1)) <span class="TOKEN">Else</span> avntTmp(0) = astrElemente(1)
<span class="TOKEN">If</span> IsNumeric(astrElemente(3)) <span class="TOKEN">Then</span> avntTmp(1) = Val(astrElemente(3)) <span class="TOKEN">Else</span> avntTmp(1) = astrElemente(3)
<span class="TOKEN">If</span> IsNumeric(astrElemente(5)) <span class="TOKEN">Then</span> avntTmp(2) = Val(astrElemente(5)) <span class="TOKEN">Else</span> avntTmp(2) = astrElemente(5)
&nbsp;
<span class="TOKEN">If</span> InStr(avntTmp(0), &quot;/&quot;) &gt; 0 <span class="TOKEN">Then</span> avntTmp(0) = &quot;'&quot; &amp; avntTmp(0)
<span class="TOKEN">If</span> InStr(avntTmp(1), &quot;/&quot;) &gt; 0 <span class="TOKEN">Then</span> avntTmp(1) = &quot;'&quot; &amp; avntTmp(1)
<span class="TOKEN">If</span> InStr(avntTmp(2), &quot;/&quot;) &gt; 0 <span class="TOKEN">Then</span> avntTmp(2) = &quot;'&quot; &amp; avntTmp(2)
&nbsp;
avntDatensaetze(10 + (iastrRow - 4) * 3, lngIndex) = avntTmp(0)
avntDatensaetze(11 + (iastrRow - 4) * 3, lngIndex) = avntTmp(1)
avntDatensaetze(12 + (iastrRow - 4) * 3, lngIndex) = avntTmp(2)
&nbsp;
<span class="TOKEN">End</span> Select
<span class="TOKEN">Next</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;
<span class="TOKEN">Function</span> ReadTxtFile(<span class="TOKEN">ByVal</span> Path <span class="TOKEN">As</span> <span class="TOKEN">String</span>) <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> intFF <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="REM"> ' Falls ohne Inhalt, abbrechen</span>
<span class="TOKEN">On</span> <span class="TOKEN">Error</span> <span class="TOKEN">Resume</span> <span class="TOKEN">Next</span>
<span class="TOKEN">If</span> FileLen(Path) = 0 <span class="TOKEN">Then</span> <span class="TOKEN">Exit Function</span>
<span class="TOKEN">On Error GoTo 0</span>
&nbsp;
<span class="REM"> ' Datei lesen</span>
intFF = FreeFile()
<span class="TOKEN">Open</span> Path <span class="TOKEN">For</span> <span class="TOKEN">Binary</span> <span class="TOKEN">As</span> #intFF
ReadTxtFile = Space$(LOF(intFF))
<span class="TOKEN">Get</span> #intFF, , ReadTxtFile
<span class="TOKEN">Close</span> #intFF
<span class="TOKEN">End</span> <span class="TOKEN">Function</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Kiri_Slad
14.07.2015, 13:10
Hallo,

vielen Dank für deine Antwort!!!!!!

Hier zeigt er mir noch einen Laufzeitfehler an, was kann das sein?

Case 0
avntDatensaetze(3, lngIndex) = CDate(Right$(astrElemente(2), 8))


Nochmal vielen Dank!

Kiri_Slad
15.07.2015, 13:51
Hallo xlph,

das vorherige Problem scheint gelöst zu sein.

Nur zeigt er mir bei dieser Stellen (debuggen) an, dass die Variable nicht definiert sei.

If (Not avntDatensaetze()) <> -1 Then
Tabelle1.Range("A2").CurrentRegion.Offset(1).Clear
Tabelle1.Range("A2").Resize(UBound(avntDatensaetze, 2), UBound(avntDatensaetze, 1)).Value = _
WorksheetFunction.Transpose(avntDatensaetze)


was könnte das sein?

Sorry für die vielen Fragen, bin ein wirklicher Anfänger und muss mich leider erst einlernen!

xlph
15.07.2015, 14:10
Versuche es hiermit:

Thisworkbook.Worksheets("Tabelle1").

vorausgesetzt du hast eine Blatt mit dem Namen 'Tabelle1'.

Kiri_Slad
15.07.2015, 18:22
Danke, die Fehlermeldung ist jetzt weg.

Jetzt kommt aber das:


"Laufzeitfehler 16

Ausdruck zu komplex..."


Beim debuggen hier:

Case 0
avntDatensaetze(3, lngIndex) = CDate(Right$(astrElemente(2), 8))
avntDatensaetze(4, lngIndex) = CDate(astrElemente(3))


Ich hoffe ich nerve nicht.....

xlph
15.07.2015, 19:06
avntDatensaetze(3, lngIndex) = astrElemente(2)

Kiri_Slad
16.07.2015, 08:49
Hallo,

vielen Dank!


Jetzt hängt es hier:
Laufzeitfehler 438:


End If

If (Not avntDatensaetze()) <> -1 Then
ThisWorkbook.Worksheets("Tabelle1").CurrentRegion.Offset(1).Clear
ThisWorkbook.Worksheets("Tabelle1").Resize(UBound(avntDatensaetze, 2), UBound(avntDatensaetze, 1)).Value = _
WorksheetFunction.Transpose(avntDatensaetze)
End If


kann man das so lösen??:

End If

If (Not avntDatensaetze()) <> -1 Then
ThisWorkbook.Worksheets("Tabelle1"). _
CurrentRegion.Offset(1).Clear
ThisWorkbook.Worksheets("Tabelle1").Resize(UBound(avntDatensaetze, 2), UBound(avntDatensaetze, 1)).Value = _
WorksheetFunction.Transpose(avntDatensaetze)
End If

End Sub

xlph
16.07.2015, 10:35
Hallo,

lad deine Datei hoch mit einigen .csv-Dateien.

Kiri_Slad
16.07.2015, 10:54
Danke schon mal!!!!

xlph
16.07.2015, 11:15
Hallo,

passt doch ...

Kiri_Slad
16.07.2015, 16:33
Hi,

irgendwie klappt's nicht...

jetzt habe ich hier einen Run Time Error (Ausdruck zu komplex)

Select Case iastrRow
Case 0
avntDatensaetze(3, lngIndex) = CDate(Right$(astrElemente(2), 8))


?????

kann es an meiner Version liegen?

xlph
16.07.2015, 19:46
Die von mir hochgeladene Datei(en) funtioniert!

Kiri_Slad
17.07.2015, 04:33
mmmh....

bei mir leider nicht:

Case 0
avntDatensaetze(3, lngIndex) = CDate(Right$(astrElemente(2), 8))

"Laufzeitfehler 16 Ausdruck zu komplex"


was kann das sein?????

Kiri_Slad
17.07.2015, 04:44
Hallo,

ich habe jetzt mal ein bisschen rumprobiert und die Zeile mit dem Fehler einfach weggelassen...

dann geht's..

kann es am Format des Datums liegen?