Arrayinhalt an Variable übergeben (VBA)

Hallo allerseits,
auf die Gefahr hin, dass ich eich nerve ist hier das nächste Problem:
Ich habe mir ein Array definiert, lese Werte ein und will die jetzt an eine Variable übergeben:

Dim VAC(1 To 4)
Dim RV(1 To 4)
Dim koVAC
Dim koRV
Ran = 1
 Do Until ...
 intern = intern + 1
 If Trim(Worksheets(FilStr$).Cells(intern, 1).VALUE) = "VAC" Then
 VAC(Ran) = Trim(Worksheets(FilStr$).Cells(intern, 2).VALUE)
 ElseIf Trim(Worksheets(FilStr$).Cells(intern, 1).VALUE) = "RV" Then
 RV(Ran) = Trim(Worksheets(FilStr$).Cells(intern, 2).VALUE)
 Ran = Ran + 1
 End If
 intern = intern + 1

 Loop
 For i = 1 To 4
 koVAC = koVAC + VAC(i) + ","
 koRV = RV(i) + ","
 Next

In der For-Next-Schelife erhalte ich dabei den Fehler „Typen unverträglich“. Wie kann ich den kompletten Inhalt des Arrays also an eine nicht-Array Variable übergeben?

Ralph

Hallo Ralph!

For i = 1 To 4
koVAC = koVAC + VAC(i) + „,“
koRV = RV(i) + „,“
Next

In der For-Next-Schelife erhalte ich dabei den Fehler „Typen
unverträglich“. Wie kann ich den kompletten Inhalt des Arrays
also an eine nicht-Array Variable übergeben?

Ralph

Du versuchst hier die Variablen koVAC und VAC(1) sowie „,“ zu addieren. Das kann nicht funktionieren. Denn die Variablen haben offenbar unterschiedliche Datentypen.

Oder möchtest du die Inhalte des Arrays als Zeichenkette zusammen fügen?

mfg
christoph

Hallo,

Dim VAC(1 To 4)

variant. Wenn als erstes eine Zahl eingetragen wird, kann das ein Double werden. Dann kann man den Inhalt nicht mehr als String verarbeiten.

Versuch’s mal mit:

Dim VAC(1 To 4) As String
Dim RV(1 To 4) As String
Dim koVAC As String
Dim koRV As String

Dann bist Du sicher, daß das Strings sind. :smile:

koRV = RV(i) + „,“

Da wolltest Du schreiben:

koVAC = koVAC & VAC(i) & „,“
koRV = koRV & RV(i) & „,“

Sonst ist mir nichts aufgefallen.

Gruß Rainer

auf die Gefahr hin, dass ich eich nerve ist hier das nächste
Problem:

Hallo Ralph,

mit Fragen kannst du hier nicht nerven, dafür ist dieses Forum da :smile:

Du schreibst keinen Anfängercode, dein Code ist schon fortgeschritten.
Damit auch länger und komplexer.

Ich beschreibe mal was ich tue, wenn ich eine Vba-Frage habe wo ich weiß Rainer kann mir da mit seinem super VB-Wissen gar nicht helfen, dann frage auch ich in einem Excel.Vba-Forum nach.

Da ich aber nicht nur Frager sondern, z.b. hier und auch im anderen Forum Oftantworter bin weiß ich was Antworter sich wünschen.

Zunächst grundsätzlich immer die Angabe der Excelversion.

Den Einsatz von Option Explicit. Macht keinen Bock langen Code manuell auf falsche Schreibweisen von variablen zu überprüfen.

Dann, kostet mich zwar Arbeit als Frager, aber ich muß das reine Problem aus dem langen Code mit vielen makros usw. herauskristallisieren und in eigenständig laufende Prozeduren auf Fremdrechnern umwandeln.

So wie mein nachstehender Code hätte auch dein Code aussehen können!

Dann, das hast du gemacht *lob*, immer angeben welche Zeile markiert der Debugger mit welcher Fehlermeldung.

Ggfs. falls wichtig noch angeben welche Werte wichtige Variablen zum Fehlerzeitpunkt haben.

Bei Codes ist z.B. schlecht:

Sub Test()
Dim Var1
Var1=range(„A1“).value

denn fremde Leute wissen nicht was gerade in A1 steht. Häufiger Fehler bei Umgang mit Zeiten/Datümern in Zellen. Erfordert dann nachfragen, oftmals mehrmals bis klar ist was genau in der zelle steht in welchem Format.

Besser ist es so:

Dim Var1
Var1=format(„1.1.2000“,„yymmdd“)

Sinngemäß gilt das auch für globale Variablen.

Ich hoffe ich konnte mich verständlich machen.

Gruß
Reinhard

Sub tt()
Dim koVAC, koRV, i, Vac(1 To 4), RV(1 To 4)
For i = 1 To 4
 Vac(i) = i \* 2
 RV(i) = i \* 2
Next i
For i = 1 To 4
 koVAC = koVAC & Vac(i) & ","
 koRV = RV(i) & ","
Next
MsgBox koVAC
MsgBox koRV
End Sub

Hallo Ralph!

Du schreibst von tausend(en) Codezeilen. Und was ich so bis jetzt gesehen habe, war auch teilweise ziemlich komplex. Und in den bisherigen Codeausschnitten habe ich nicht viel Excelspezifisches gesehen.

Bist du dir eigentlich sicher, das Excel mitsamt VBA das richtige Werkzeug dafür ist? Ob es eventuell nicht sinnvoller ist, ein eigenes Programm für deinen Anwendungsfall zu schreiben.

Kannst du mir (uns) eine Beispieldatei übermitteln, ich würde mir das gerne einmal anschauen? Oder geht das wegen dem Datenschutz nicht?

mfg
christoph

Hallo Ralph!

Du schreibst von tausend(en) Codezeilen. Und was ich so bis
jetzt gesehen habe, war auch teilweise ziemlich komplex. Und
in den bisherigen Codeausschnitten habe ich nicht viel
Excelspezifisches gesehen.

hallo christoph,

ich habe auch die Codes gesehen undglaube, aufgrund dessen was ich sah, die Zeilenanzahl wird man schon gewaltig verringern können.

cc = 4
 Do Until Trim(Worksheets(pubwsresults).Cells(1, cc).VALUE) = ""
 cc = cc + 1
 Loop

 Worksheets(pubwsresults).Select
 Columns(cc).Select
 Selection.NumberFormat = "@"

kann man als Zweizeiler schreiben.
naja drei wegen dem Trim, wenn da Datenschrott drinsteht.
Logisch kann man den Kürzfaktor 2:7 nicht auf Alles anwenden, naja mal schauen…

Gruß
Reinhard

Hallo Christoph,

Und was ich so bis
jetzt gesehen habe, war auch teilweise ziemlich komplex.

Ich fühle mich geehrt:smile:

Und in den bisherigen Codeausschnitten habe ich nicht viel
Excelspezifisches gesehen.

Kein Wunder, da gibts nix Excel-spezifisches.

Bist du dir eigentlich sicher, das Excel mitsamt VBA das
richtige Werkzeug dafür ist? Ob es eventuell nicht sinnvoller
ist, ein eigenes Programm für deinen Anwendungsfall zu
schreiben.

Also: Erstens bin ich mir keineswegs sicher, dass Excel das richtige ist. Die Ausgabe muss eben als Exceldatei erfolgen, wobei der Aufbau des Arbeitsblatts streng vorgegeben ist. Und wenn ich in Excel ausgeben muss, mache ich die Verarbeitung am besten auch in Excel. Außerdem gab es für die schwierigen Teile bereits einen Code der funktioniert (der ist auch nicht von mir :smile:)

Kannst du mir (uns) eine Beispieldatei übermitteln, ich würde
mir das gerne einmal anschauen? Oder geht das wegen dem
Datenschutz nicht?

Ich befürchte, dass mit dem Datenschutz muss ich bejahen, tut mir leid. Deswegen kann ich immer nur Codeschnippsel hier einstellen.

Ralph

Hallo Reinhard,

ich habe auch die Codes gesehen undglaube, aufgrund dessen was
ich sah, die Zeilenanzahl wird man schon gewaltig verringern
können.

Hundertprozentig! Ich spreche eben nicht VBA, sondern radebreche es.

Ralph
PS: Die Trim werde ich wahrscheinlich alle noch löschen, die machen mehr Probleme als sie lösen.

Ich befürchte, dass mit dem Datenschutz muss ich bejahen, tut
mir leid. Deswegen kann ich immer nur Codeschnippsel hier
einstellen.

hallo Ralph,

Datenschutz für den Code? Klar, wenn ich da was Gutes finde kopier ich mir das. Aber die Erwartungshaltung habe ich nicht so und ich kopiere nur richtig Gutes, Normales kann ich mir selbst basteln.

Also datenschutz wegen der tabelleninhalte? Okay, schmeiß die Tabellenblätter die man zur Problemlösung nicht braucht raus.
In den verbliebenen Blättern braucht man sicher keine 5000 zeilen, lösche also die zeilen 100-5000.

Nun zu den daten. Angenommen du hast eine Spalte mit der Überschrift „Name“, dann schreib in die zelle darunter Name1, dann markiere die zelle und klicke unten rechts auf die Ecke der zelle und ziehs nach unten.
Schon hast du eine Namensliste. Das machste mit allen Spalten.
Wenn es wichtig ist zahlen anstatt Strings zu haben, es gibt die Funktion Zufallszahl().

Diese derart veränderte mappe kannste dann hochladen mit FAQ:2606
Wichtig dabei ist einzig daß dein problem was es zu lösen gilt erhalten blieb.

Gruß
Reinhard

Hallo Ralph!

Also: Erstens bin ich mir keineswegs sicher, dass Excel das
richtige ist. Die Ausgabe muss eben als Exceldatei erfolgen,
wobei der Aufbau des Arbeitsblatts streng vorgegeben ist. Und
wenn ich in Excel ausgeben muss, mache ich die Verarbeitung am
besten auch in Excel. Außerdem gab es für die schwierigen
Teile bereits einen Code der funktioniert (der ist auch nicht
von mir :smile:)

OK, dann ist ziemlich klar, das der Einsatz von Excel sinnvoll ist. Da müssten dann schon andere Probleme (ewige Laufzeiten oder Ähnliches) auftreten, um auf eine andere Lösung umzusatteln.

Ich befürchte, dass mit dem Datenschutz muss ich bejahen, tut
mir leid. Deswegen kann ich immer nur Codeschnippsel hier
einstellen.

Alles klar. Dann werden wir dir halt hier anhand der Codeausschnitte weiter helfen.

mfg
christoph

Hallo Ralph,

Hallo allerseits,
auf die Gefahr hin, dass ich eich nerve ist hier das nächste
Problem:
Ich habe mir ein Array definiert, lese Werte ein und will die
jetzt an eine Variable übergeben:

Dim VAC(1 To 4)
Dim RV(1 To 4)
Dim koVAC
Dim koRV
Ran = 1
Do Until …
intern = intern + 1
If Trim(Worksheets(FilStr$).Cells(intern,
1).VALUE) = „VAC“ Then
VAC(Ran) =
Trim(Worksheets(FilStr$).Cells(intern, 2).VALUE)
ElseIf Trim(Worksheets(FilStr$).Cells(intern,
1).VALUE) = „RV“ Then
RV(Ran) =
Trim(Worksheets(FilStr$).Cells(intern, 2).VALUE)
Ran = Ran + 1
End If
intern = intern + 1

Loop
For i = 1 To 4
koVAC = koVAC + VAC(i) + „,“
koRV = RV(i) + „,“
Next

Ich habe zwar nicht viel Ahnung von VBA Ralph, aber sorry für den Ausdruck. Aber wenn ich mir das anschaue, wird mir schlecht :s

Nehmen wir mal deinen Source auseinander!

Option Explicit ON Fehlt!

Dim VAC(1 To 4)
Dim RV(1 To 4)

Array werden definiert, als Variant! Warum gibst du hier nicht den Typ an?
Wieso definierst du sie via 1 to 4 und nicht Vac(3) und rv(3) ?

Dim koVAC
Dim koRV

Der selbe Mist :frowning: Warum gibst du hier nicht den Typen an ?

Ran = 1
Do Until ...
 intern = intern + 1

Soweit schaut das gut aus :wink:

 If Trim(Workheets(FilStr$).Cells(intern,1).VALUE) = "VAC" Then
 VAC(Ran) =Trim(Worksheets(FilStr$).Cells(intern, 2).VALUE)
 ElseIf Trim(Worksheets(FilStr$).Cells(intern,1).VALUE) = "RV" Then
 RV(Ran) =Trim(Worksheets(FilStr$).Cells(intern, 2).VALUE)
 Ran = Ran + 1
 End If

Was ist wenn der ValueWert vac ist rv oder ganz was anderes ?
Es wird zwischen Gross und Kleinschreibung unterschieden!
Hier kannst du dir sehr sehr schnell einen Fehler einfangen!
Welchen Typ gibt hier ueberhaupt die Value Eigenschaft zurueck?

 intern = intern + 1

Wieso addierst du hier noch einmal intern auf ?
Dann kannst du in der obigen Anweisung = Intern = intern+2 schreiben und intern vor der Schleife auf -1 setzen

Loop
For i = 1 To 4
 koVAC = koVAC + VAC(i) + ","
 koRV = RV(i) + ","
Next

So wie es hier ausschaut, sind die Daten alle vom Typ String! Also gebe bei der Declaration der Variablen gleich den Typ String mit an! Auch hast du dann unter koVAC und koRV, welches Variablen vom Typ String sein muessen ( bei der Declaration bitte gleich mit angeben) immer ein Komma am Ende. Ist das so gewollt? Hast du dir mal die Inhalte in den Arrays VAC und RV angeschaut? Was steht denn da drinnen? Hast du mal dein Project im Debug Modus durchlaufen lassen ? In welcher Zeile tritt den der Fehler auf, bei was für Werten?
Desweiteren sollte man Strings nicht mit + Verknüpfen sondern das Verknüpfungszeichen & nehmen :wink:

In der For-Next-Schelife erhalte ich dabei den Fehler „Typen
unverträglich“. Wie kann ich den kompletten Inhalt des Arrays
also an eine nicht-Array Variable übergeben?

In welcher Zeile genau ? Welchen Wert hat in dem Moment rv(i) und vac(i) ?

Ralph

MfG Alex

TextFilePlatform Einstellung
Hallo Reinhard,

Zunächst grundsätzlich immer die Angabe der Excelversion.

nuja, ich nehme Excel 2007. Der Code wird aber sicherlich auch von älterern Versionen benutzt werden.

Den Einsatz von Option Explicit.

Jupp, mache ich noch.

koVAC = koVAC & Vac(i) & „,“

Bingo, das & war schuld, ich hatte ja + genommen. richtige Idee, falsche Ausführung.
Aber noch etwas. Ich lese Daten aus einer Tabelle in eine Variable ein über:

Do While Not EOF(vIn): DoEvents
 Line Input #vIn, sLine
 If Len(sLine) \> 0 Then
 iLineCnt = iLineCnt + 1
 statcnt = statcnt + 1
 If statcnt \> 49999 Then
 msgcnt = msgcnt + statcnt
 frmAppStatus.lblStat2.Caption = pubTxt15 + " " + Trim(Str$(Int(msgcnt)))
 statcnt = 0
 End If

 Strx$ = Trim(sLine)

 If Strx$ "" Then
 i = i + 1
 End If
 End If
Loop

Dabei wird mir in einer Zeile der Wert „xyz_EC_TEMP 20 °C“ in sLine eingelesen (Die Leerzeichen sind Leerzeichen, keine Tabs). Soweit so gut. Ausgegeben wird sLine über:

...
With ActiveSheet.QueryTables.Add(Connection:= \_
 Filstr2$ \_
 , Destination:=Range("$A$1"))
 .Name = QryStr$
 .FieldNames = True
 .RowNumbers = False
 .FillAdjacentFormulas = False
 .PreserveFormatting = True
 .RefreshOnFileOpen = False
 .RefreshStyle = xlInsertDeleteCells
 .SavePassword = False
 .SaveData = True
 .AdjustColumnWidth = True
 .RefreshPeriod = 0
 .TextFilePromptOnRefresh = False
 .TextFilePlatform = 65001
 .TextFileStartRow = 1
 .TextFileParseType = xlDelimited
 .TextFileTextQualifier = xlTextQualifierDoubleQuote
 .TextFileConsecutiveDelimiter = True
 .TextFileTabDelimiter = True
 .TextFileSemicolonDelimiter = False
 .TextFileCommaDelimiter = False
 .TextFileSpaceDelimiter = False
 .TextFileColumnDataTypes = Array(2)
 .TextFileTrailingMinusNumbers = True
 .Refresh BackgroundQuery:=False
 End With

Jetzt wird bei der Ausgabe das Grad-Zeichen und alles hinter dem Gradzeichen abgeschnitten. Wenn ich TextFilePlatform ändere in 850 (Windows ANSI), erfolgt die Ausgabe als „xyz_EC_TEMP
20 ░C“. Aber mit welcher Einstellung erhalte ich das Grad-Zeichen wieder?
fragende Grüße,

Ralph

Hi,

Den Einsatz von Option Explicit.

Jupp, mache ich noch.

falls Dein Problem nur ein Tippfehler sein sollte, zeigt ihn Dir VBA dann.

Zum Problem:
Input macht bei Text nicht immer ganz was es soll.
Lies das File mal anders ein und prüfe, ob dann alles angezeigt wird. Falls nicht sind die Daten da, können aber nicht nicht angezeigt werden. Dann liegt das Problem nicht beim Lesen sondern bei Excel.

So geht’s übrigens auch etwas schneller als mit Line Input.

Gruß Rainer

Option Explicit

Private Sub Command1\_Click()
 Dim ff As Integer, Na As String, Txt As String, l As Long, Arr() As String, i As Long
 Na = "C:\Test.txt"
 ff = FreeFile
 l = FileLen(Na)
 Txt = Space(l)
 Open Na For Binary As #ff
 Get #ff, , Txt
 Close #ff
 Arr = Split(Txt, vbCrLf)
 For i = LBound(Arr) To UBound(Arr)
 List1.AddItem Arr(i)
 Next
End Sub

Hallo Rainer,

Input macht bei Text nicht immer ganz was es soll.

Der Input ist nicht das Problem. Beim Einlesen wird ja der Inhalt der Variable im Lokalfenster angezeigt, und da steh wirklich „xyz_EC_TEMP 20 °C“ drin. Nur bei der Ausgabe wird das verhunzt.

Ralph

Hallo Ralph,

Zunächst grundsätzlich immer die Angabe der Excelversion.

nuja, ich nehme Excel 2007. Der Code wird aber sicherlich auch
von älterern Versionen benutzt werden.

okay.

Aber noch etwas. Ich lese Daten aus einer Tabelle in eine
Variable ein über:

Ich sehe da ähem Chaos :smile:
Du liest eine Datei aus. jede zeile wird nacheinander in die Variable sLine geschrieben.
Alle 50000 zeilen passiert irgendwas weil statcnt auf 50000 steht.
Dann wird frmAppStatus.lblStat2.Caption mit irgednwas befüllt.
Caption ist ein Text=String, du benutzt aber wieder das Pluszeichen?

Und bei der Querytable sehe ich keinen Zusammenhang mit sLine.

Und, du benutzt die, meist für Fremde unbekannt gefüllten nachfolgenden ZEHN Variablen für nicht mal 20 Zeilen Code (die Standards von Querytable.Add kann man ja nicht mitzählen)
vin,sline,ilinecnt,statcnt,msgcnt,puptxt15,Str$,i,filestr$,qrystr

Da stellen sich mir zwei Fragen, braauch man soviel Variablen und was steht denn drin?

Wenn dein jetziges Problem darin besteht daß in einer datei in einer zeile das Grad-zeichen steht, aber irgendwie nicht richtig ausgelesen wird.
Na gut, dann bastle eine Txt-datei mit einer zeile wo das Grad-zeichen drinsteht.
Dann liefere dazu deinen Code der die dateizeile ausliest und falsch darstellt.
Und zeige uns die Datei und den Code. dann können wir schauen an was es liegt.

Gruß
Reinhard

Do While Not EOF(vIn): DoEvents
Line Input #vIn, sLine
If Len(sLine) > 0 Then
iLineCnt = iLineCnt + 1
statcnt = statcnt + 1
If statcnt > 49999 Then
msgcnt = msgcnt + statcnt
frmAppStatus.lblStat2.Caption = pubTxt15 + " " +
Trim(Str$(Int(msgcnt)))
statcnt = 0
End If

Strx$ = Trim(sLine)

If Strx$ „“ Then
i = i + 1
End If
End If
Loop

Dabei wird mir in einer Zeile der Wert „xyz_EC_TEMP 20
°C“ in sLine eingelesen (Die Leerzeichen sind Leerzeichen,
keine Tabs). Soweit so gut. Ausgegeben wird sLine über:


With ActiveSheet.QueryTables.Add(Connection:= _
Filstr2$ _
, Destination:=Range("$A$1"))
.Name = QryStr$
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier =
xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = True
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(2)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With

Jetzt wird bei der Ausgabe das Grad-Zeichen und alles hinter
dem Gradzeichen abgeschnitten. Wenn ich TextFilePlatform
ändere in 850 (Windows ANSI), erfolgt die Ausgabe als
„xyz_EC_TEMP
20 ░C“. Aber mit welcher Einstellung erhalte ich das
Grad-Zeichen wieder?
fragende Grüße,

Ralph

Hallo Reinhard,

Du liest eine Datei aus. jede zeile wird nacheinander in die
Variable sLine geschrieben.
Alle 50000 zeilen passiert irgendwas weil statcnt auf 50000
steht.
Dann wird frmAppStatus.lblStat2.Caption mit irgednwas befüllt.
Caption ist ein Text=String,

sorry, da hab ich gepennt. Zur Erklärung: Das Einlesen erfolgt im Hintergrund, vorne steht eine Ausgabemaske, die anzeigt, welche Zeile der einzulesenden Datei gerade gelesen wird. Die für diese Maske benötigten Variablen sind statcnt, msgcnt, und das komplette frmAppStatus-Teil.

du benutzt aber wieder das
Pluszeichen?

Jepp, funktioniert aber hier. Der Teil des Codes ist nicht von mir und ich verstehe maximal die Hälfte davon.

Und bei der Querytable sehe ich keinen Zusammenhang mit sLine.

Mit Wuerytable meinst du

With ActiveSheet.QueryTables.Add(Connection:= \_
 Filstr2$ \_
 , Destination:=Range("$A$1"))

?

Und, du benutzt die, meist für Fremde unbekannt gefüllten
nachfolgenden ZEHN Variablen für nicht mal 20 Zeilen
Code (die Standards von Querytable.Add kann man ja nicht
mitzählen)
vin,sline,ilinecnt,statcnt,msgcnt,puptxt15,Str$,i,filestr$,qrystr

Da stellen sich mir zwei Fragen, braauch man soviel Variablen

Kann ich dir nicht sagen, ich versteh den Code ja selber nicht.

Wenn dein jetziges Problem darin besteht daß in einer datei in
einer zeile das Grad-zeichen steht, aber irgendwie nicht
richtig ausgelesen wird.

Eben nicht, ausgelesen wird es, aber nicht wieder hineingeschrieben.

Na gut, dann bastle eine Txt-datei mit einer zeile wo das
Grad-zeichen drinsteht.

kein Thema

Dann liefere dazu deinen Code der die dateizeile ausliest und
falsch darstellt.
Und zeige uns die Datei und den Code. dann können wir schauen
an was es liegt.

OK. Hier ist der Code (immer noch 190 Zeilen).

Sub OpenDAT()
pubFileName = "einlesen.dat"
pubwsDAT = Worksheets("DAT-File1").Name
FilStr = Worksheets("Results").Name
Dim vIn, sLine As String, iLineCnt As Long
vIn = FreeFile()

' open file
Open pubFileName For Input As vIn

' option to avoid counting records
If LOF(vIn) \> pubLenChk Then
 Response = MsgBox(pubTxt19 + Chr(10) + pubTxt21, vbYesNo)
 If Response = vbNo Then
 Close vIn
 GoTo CreateTempDATs
 End If
End If

' count number of DAT records
Do While Not EOF(vIn): DoEvents
 Line Input #vIn, sLine
 If Len(sLine) \> 0 Then
 iLineCnt = iLineCnt + 1
 statcnt = statcnt + 1
 If statcnt \> 49999 Then
 msgcnt = msgcnt + statcnt
 frmAppStatus.lblStat2.Caption = pubTxt15 + " " + Trim(Str$(Int(msgcnt)))
 statcnt = 0
 End If

 Strx$ = Trim(sLine)

 If Strx$ "" Then
 i = i + 1
 End If
 End If
Loop

' Close DAT file
Close vIn


'
CreateTempDATs:
 Call CreateTempDAT(msgcnt)
 Call ImportTempDAT(msgcnt)
 pubSSCnt = msgcnt
 frmAppStatus.Hide

 pubParmsReady = "Y"
End Sub
Sub CreateTempDAT(msgcnt)

Dim vIn, sLine As String, iLineCnt As Long
vIn = FreeFile()
msgcnt = 0
fnum = 1
statcnt = 0
iLineCnt = 0
rcnt = 0
OutOpenNeeded$ = "Y"



' the root for the input file name is used to form the file name output temporary files
' need to identify where the ".DAT" is located in the string and insert output segment number
FilStr$ = pubFileName
If Len(pubFileName) \> 4 Then
 If Mid$(pubFileName, Len(pubFileName) - 3, 1) = "." Then
 FilStr$ = Mid$(pubFileName, 1, Len(pubFileName) - 4)
 End If
End If

' open input file
Open pubFileName For Input As vIn

' get DAT records from input
Do While Not EOF(vIn): DoEvents
 Line Input #vIn, sLine
 If Len(sLine) \> 0 Then
 iLineCnt = iLineCnt + 1
 If Trim(sLine) "" Then
 statcnt = statcnt + 1
 rcnt = rcnt + 1
 End If

 ' check if open output file needed
 If OutOpenNeeded$ = "Y" Then
 vOutNum = FreeFile()
 Open FilStr$ + "\_X" + Trim(Str$(Int(fnum))) + ".DAT" For Output As #vOutNum
 OutOpenNeeded$ = "N"
 End If

 ' write output line
 Print #vOutNum, sLine


 End If
Loop

' Final status and close temporary output file
If OutOpenNeeded$ = "N" Then
 msgcnt = msgcnt + rcnt
 frmAppStatus.lblStat2.Caption = pubTxt15 + " " + Trim(Str$(Int(msgcnt)))
 Close #vOutNum
End If

' Close input file
Close vIn
msgcnt = fnum
DoEvents
End Sub

Sub ImportTempDAT(msgcnt)

fnum = 1




' one loop for each spreadsheet into which data is to be imported
 Do Until fnum \> msgcnt
 ' determine name for next sheet into which data is to be imported
 ' this name already exists in pubwsDAT for first sheet
 FilStr$ = pubwsDAT
 If fnum \> 1 Then
 Mid$(FilStr$, Len(FilStr$), 1) = Trim(Str$(Int(fnum)))
 frmAppStatus.lblStat1.Caption = pubTxt18
 frmAppStatus.lblStat2.Caption = FilStr$
 DoEvents
 End If
 ' If receiver spreadsheet does not exist, create it
 Call CheckwsDATAvailability(FilStr$)
 ' Select worksheet to receive the import
 Worksheets(FilStr$).Activate
 Worksheets(FilStr$).Select
 ' FilStr2 holds the text string identifying the file to be imported
 ' Example: if original file is DGDATA.DAT then temp files are DGDATA1.DAT, DGDATA2.DAT, etc
 Filstr2$ = Mid$(pubFileName, 1, Len(pubFileName) - 4) + "\_X" + Trim(Str$(Int(fnum))) + ".DAT"
 Filstr2$ = "TEXT;" + Filstr2$
 QryStr$ = FilStr$ + "\_1"

 With ActiveSheet.QueryTables.Add(Connection:= \_
 Filstr2$ \_
 , Destination:=Range("$A$1"))
 .Name = QryStr$
 .FieldNames = True
 .RowNumbers = False
 .FillAdjacentFormulas = False
 .PreserveFormatting = True
 .RefreshOnFileOpen = False
 .RefreshStyle = xlInsertDeleteCells
 .SavePassword = False
 .SaveData = True
 .AdjustColumnWidth = True
 .RefreshPeriod = 0
 .TextFilePromptOnRefresh = False
 .TextFilePlatform = 65001
 .TextFileStartRow = 1
 .TextFileParseType = xlDelimited
 .TextFileTextQualifier = xlTextQualifierDoubleQuote
 .TextFileConsecutiveDelimiter = False
 .TextFileTabDelimiter = True
 .TextFileSemicolonDelimiter = False
 .TextFileCommaDelimiter = False
 .TextFileSpaceDelimiter = False
 .TextFileColumnDataTypes = Array(2)
 .TextFileTrailingMinusNumbers = True
 .Refresh BackgroundQuery:=False
 End With


 ' increment to get next temporary file
 fnum = fnum + 1
 Loop
End Sub
Sub CheckwsDATAvailability(FilStr$)

On Error GoTo CreateDATReceiver
Worksheets(FilStr$).Activate
Worksheets(FilStr$).Select
Exit Sub
CreateDATReceiver:
' insert the Results receiver worksheet and name to parm
 Sheets.Add After:=Sheets(Sheets.Count)
 Sheets(Sheets.Count).Name = FilStr$
End Sub

Damit das Ding läuft, brauchst du ein Arbeitsblatt, das DAT-File1 heißt. Auf den Dateihochlade-Seiten im INternet kann man immer nur Bilder hochladen, deswegen kommt die dat-Datei per mail.

Ralph, hoffnungsvoll

Das dat-file muss auch so gehen, es sind ja nur 2 Zeilen:
EC_TEMP 20 °C
+EOF
Der Name der Datei ist egal, Hauptsache sie heißt .dat

Ralph

Problem gelöst
Hallo Reinhard,

neuer Tag neues Glück:smile:
Ich habe die Zeile .TextFilePlatform = 65001 entfernt und siehe da, es geht, das Grad-Zeichen wird ausgegeben.

Trotzdem danke,

Ralph