Thema Datum  Von Nutzer Rating
Antwort
02.04.2009 09:22:36 Michaela
NotSolved
02.04.2009 14:48:46 Holger
NotSolved
02.04.2009 16:27:32 Michaela
NotSolved
02.04.2009 20:46:05 Holger
NotSolved
Rot Danke!
03.04.2009 09:15:27 Michaela
NotSolved
02.04.2009 16:57:26 Michaela
NotSolved

Ansicht des Beitrags:
Von:
Michaela
Datum:
03.04.2009 09:15:27
Views:
1144
Rating: Antwort:
  Ja
Thema:
Danke!
Danke Holger, deine Erklärung hat mir sehr weiter geholfen!

Gruß, Michi

Holger schrieb am 02.04.2009 20:46:05:

Hallo Michaela,
es ist immer gut, wenn man sich seine Spezifikation richtig überlegt und genau das aufschreibt, was man als Ergebnis haben will. Wie soll ein unvoreingenommener Leser erraten, dass du keine führenden Nullen haben willst, sondern Dezimalstellen benötigst.
Der Fehler in deinem 2. Makro, das ich mir gar nicht angesehen hatte, tritt wohl ein, weil du die Zellen als Text deklariert hast, aber Rechenoperationen darauf anwenden willst. In Excel 2007 macht das keine Schwierigkeiten, in älteren kann das aber passieren. Die Multipikation mit 1 soll die Umwandlung in eine nummerische Variable bewirken. Je nachdem, welches Dezimalzeichen du verwendest, kannst mit Val oder CDbl die Zeichenkette wieder in eine Zahl verwandeln. Die Multiplikation wird so überflüssig. Wie soll eine leere Zelle umgeformt werden: 0.000000 oder .0000000?
Dezimalzeichen Punkt: If Int(val(Cells(i, j))) = val(Cells(i, j)) Then
Dezimalzeichen Komma: If Int(cdbl(Cells(i, j))) = cdbl(Cells(i, j)) Then
Du kannst auch feststellen, ob die Zelle einen Punkt oder ein Kamma enthält, z.B. mit
if instr(cells(i,j),".")=0 then oder if instr(cells(i,j),",")=0
...
Also z.B.
Sub n()
Dim i As Long,j
Application.ScreenUpdating = False
Columns("A:C").NumberFormat = "@"
For i = 1 To 43825
For j = 1 To 6
if cells(i,j)="" then cells(i,j)="0" 'streichen, falls Umsetzung in .0000000 gewünscht
if instr(cells(i,j),".")=0 then cells(i,j)=cells(i,j) & "."
Cells(i, j) = Left(Cells(i, j) & "00000000", 8)
Next j
Next i
Application.ScreenUpdating = True
End Sub

Gruß
Holger



Michaela schrieb am 02.04.2009 16:27:32:

Hallo Holger,

vielen Dank für deine Hilfe.
Eigentlich wäre es schon besser, wenn er die Nullen hinten dran hängt:
aus 12 wird 12.00000
Ich befürchte, dass das Programm, was die .txt als Input-Datei ließt mit einer Zahl 00000012 so seine Probleme hat.
Aber ich probier es mal aus.

Allerdings hab ich immer noch das Problem, dass er mit der Zeile

If Int(Cells(i, j) * 1) = Cells(i, j) * 1 Then

immer noch ein Problem hat (Typen unverträglich). Wie kann man das beheben?

Danke für deine Hilfe!

Gruß,
Michi

PS: und ja, es ist schwierig für jemanden der keinen blassen Dunst von VBA hat - oder dachtest du, ich hätte den code selber geschrieben ;o)?


Holger schrieb am 02.04.2009 14:48:46:

Hallo Michaela,
ich gehe davon aus, dass aus 10 00000010, aus 1.2 000001.2 oder aus 0.03 00000.03 werden soll.
Ersetze in deinem ersten Makro
Cells(i, j) = Left(CStr(Cells(i, j)) & "00000000", 8)
durch
Cells(i, j) = right("00000000" & CStr(Cells(i, j)) , 8)
War das wirklich schwierig?
Gruß
Holger


Michaela schrieb am 02.04.2009 09:22:36:

Hallo zusammen,

ich habe leider absolut keinen Schimmer von VBA und hoffe, dass ihr mir weiterhelfen könnt.
Ich habe folgendes Problem. Ich muss eine .txt erstellen, die ein bestimmtes Format einhalten muss. Das Format heißt F8.0 (Fortran), d.h. er ließt immer acht Zeichen, dann muss die nächste Zahl beginnen. Das sieht dann ungefähr so aus:
123456781234567812345678
-2.02 100.520 0.00001
Leerzeichen, (-) und (.) werden hier ebenfalls als Zeichen gelesen.
So, nun möchte ich allerdings die .txt über ein Excelsheet generieren, da meine Daten natürlich in einer Excel stehen und einen Umfang von 6x43825 Zellen besitzt. Nun wollte ich also über einen VBA-Code die Zeichenanzahl festlegen. Mir hat dann jemand aus einem anderen Forum folgende Syntax gegeben:

Sub n()
Dim i As Long
Application.ScreenUpdating = False
Columns("A:C").NumberFormat = "@"
For i = 1 To 43825
For j = 1 To 6
Cells(i, j) = Left(CStr(Cells(i, j)) & "00000000", 8)
Next j
Next i
Application.ScreenUpdating = True
End Sub

Das klappte ganz gut, aber nur für Dezimalzahlen. Bei ganzen Zahlen hat er einfach nur die Nullen drangehängt:
aus 0.253 wurde 0.253000
aus -25.52 wurde -25.5200
aber
aus 10 wurde 10000000
aus 123 wurde 12300000

Für dieses Problem wurde mir nun folgende Syntax vorgeschlagen:

Sub n()
Dim i As Long, j As Long
Application.ScreenUpdating = False
Columns("A:F").NumberFormat = "@"
For i = 1 To 43825
For j = 1 To 6
If Cells(i, j) <> "" Then
If Int(Cells(i, j) * 1) = Cells(i, j) * 1 Then
Cells(i, j) = Left(Cells(i, j) & ".00000000)", 8)
Else
Cells(i, j) = Left(CStr(Cells(i, 1)) & "00000000", 8)
End If
End If
Next j
Next i
Application.ScreenUpdating = True
End Sub

er gibt mir aber für die Zeile

If Int(Cells(i, j) * 1) = Cells(i, j) * 1 Then

einen "Laufzeitfehler '13': Typen unverträglich" an.
Könnte mir jemand sagen, was der Fehler ist? Wie schon erwähnt, habe ich null Ahnung von VBA, deshalb ist mir eine Erklärung in Baby-blabla lieber, als wenn ihr mir Fachbegiffe um die Ohren haut.

Vielen Dank im Voraus und schönen Tag noch.

Gruß,
Michi

Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
02.04.2009 09:22:36 Michaela
NotSolved
02.04.2009 14:48:46 Holger
NotSolved
02.04.2009 16:27:32 Michaela
NotSolved
02.04.2009 20:46:05 Holger
NotSolved
Rot Danke!
03.04.2009 09:15:27 Michaela
NotSolved
02.04.2009 16:57:26 Michaela
NotSolved