Komma aus Ergebinis an Excel senden

09/06/2010 12:33 BotofWar#1
Hallo zusammen.

Habe folgende Situation:

Code:
$dist=sqrt(($CenterX-$AktX)*($CenterX-$AktX)+($CenterY-$AktY)*($CenterY-$AktY))

WinActivate("Microsoft Excel")

send(Round($dist, 2))
Das Problem ist jetzt das anstatt des Kommas, welches in Excel für die Nachkommastellen benötigt wird, der Sting mit Punkt als Seperator übergeben wird.
Das führt natürlich zu einem Datumsformat in Excel.
Wie mache ich es das mir in Excel eine richtige Zahl angezeigt wird?

THX
09/06/2010 14:42 mydoom#2
Pack die Zahl doch in einen String und ersetze den Punkt mit nem Komma. Ich denke irgendeine StringReplace-Funktion wird es in AutoIt geben.
09/06/2010 21:46 BotofWar#3
Danke schonmal für die Antwort.
Was ich mit meinen bescheidenen AI Kenntnissen versucht habe ist folgendes:

Code:
send(StringReplace((Round($dist, 2)), ".", ","))
Kommt aber nur Mist bei raus.
09/07/2010 23:05 mydoom#4
Quote:
Originally Posted by BotofWar View Post

Code:
send(StringReplace((Round($dist, 2)), ".", ","))
Kommt aber nur Mist bei raus.
Das könnte daran liegen, dass Round() keinen String sondern eine Zahl mit Nachkommastellen zurückliefert. Vielleicht musst du diese Zahl erst in einen String umwandeln. Wie AutoIT das handelt kann ich jedoch nicht beantworten, da ich selber kein AutoIT nutze.
09/07/2010 23:19 lolkop#5
autoit kann ohne etwas zu machen automatisch zwischen zahlen und strings hin und her springen...


aber ihr solltet euch mal die excel udf anschauen. _ExcelWriteCell($oExcel, $sValue, $sRangeOrRow [, $iColumn = 1]) sollte den job deutlich besser erledigen als send.
09/08/2010 14:25 BotofWar#6
lol.... natürlich...

manchmal sieht man den Wald vor lauter Bäumen nicht...

Aber dadurch hat sich mir ein anderes Problem aufgetan:
.
wie schaffe ich es das mir der Wert in die momentan aktive Zelle geschrieben wird?

Semi: _ExcelWriteCell($oExcel, $sValue, .activecell)
09/08/2010 15:55 lolkop#7
es gibt absolut keinen logischen nutzen, autoit in die zu letzte markierte zelle schreiben zu lassen.

warum sollte man ein script schreiben wo der user die zellen erst noch auswählen muss?
09/09/2010 12:21 BotofWar#8
Deswegen:

Code:
	WinActivate("Microsoft Excel")
	WinWaitActive("Microsoft Excel")

	send("^v")
	sleep(50)
	send("{RIGHT}")
	sleep(50)
	send($AktX)
	sleep(50)
	send("{RIGHT}")
	sleep(50)
	send($AktY)
	;sleep(50)
	;send("{RIGHT}")
	;sleep(50)
	;send(StringReplace((Round($dist, 2)), ".", ","))
	;send(Round($dist, 2))
	sleep(50)
	send("{DOWN}")
	sleep(50)
	send("{HOME}")
	sleep(50)
09/09/2010 12:35 lolkop#9
und warum wuselst du dich da mit tastendrücken durch wenn du die zeilen auch direkt beschreiben kannst ohne eine taste zu senden?

Edit:
wenn du unbedingt ineffizient arbeiten willst, kannst du dir auch eine funktion schreiben die für dich die aktive zelle bestimmt:
Code:
Func GetActiveCell($oExcel)
	Return $oExcel.ActiveCell.Address
EndFunc
09/09/2010 13:27 BotofWar#10
Ok, ich glaub jetzt hab ichs geschnallt...

Wenn du mir jetzt noch bei dem Rest auf die Sprünge helfen könntest wärst du mein absoluter Held ;-)

Code:
	$Zeile=1
	$Spalte=1
	
	WinActivate("Microsoft Excel") ;geht das auch ohne?
	WinWaitActive("Microsoft Excel")

	send("^v")	; gibts ne Möglichkeit das anders zu lösen?
	_ExcelWriteCell($oExcel, $AktX, $Zeile , $Spalte) 
	$Spalte=$Spalte+1
	_ExcelWriteCell($oExcel, $AktY, $Zeile , $Spalte)
	$Spalte=$Spalte+1
	_ExcelWriteCell($oExcel, (Round($dist, 2)), $Zeile , $Spalte)
	$Spalte=1
	$Zeile=$Zeile+1


Edit: Habs selbst hinbekommen:

;WinActivate("Microsoft Excel") ;geht das auch ohne? Ja geht
;WinWaitActive("Microsoft Excel")

$cache = ClipGet ()
$oExcel.Cells($Zeile , $Spalte).Value=$cache
$Spalte=$Spalte+1
$oExcel.Cells($Zeile , $Spalte).Value=$AktX
$Spalte=$Spalte+1
$oExcel.Cells($Zeile , $Spalte).Value=$AktY
$Spalte=$Spalte+1
$oExcel.Cells($Zeile , $Spalte).Value=Round($dist, 2)
$Spalte=1
$Zeile=$Zeile+1


Hast mir aber sehr geholfen. Herzlichen THX
09/09/2010 15:19 lolkop#11
mit clipget kannst du die daten aus der zwischenablage direkt abrufen und dann wieder per _ExcelWriteCell schreiben.

dann kannst du auch die ersten beiden WinActivate und WinWaitActive weglassen und das ganze im hintergrund oder sogar ganz versteckt ablaufen lassen.

und als kleiner tipp statt $Spalte=$Spalte+1 kann man auch $Spalte+=1 schreiben.
bzw wenn du sowieso immer die spalten 1-3 nutzt kannst du die auch direkt eintagen und ersparst deinem rechner damit das gerechne :P
09/09/2010 17:25 | Moep |#12
wieso machst du es nicht mit den excel internen makros?..