Die Verwendung von Class/Instance ist auch immer der ID vorzuziehen, da diese bei vielen Programmen dynamisch generiert wird und dadurch bei jedem Programmstart differiert.
Beiträge von BugFix
-
-
Laut Doku ist FileSetPos auch nur mit einem filehandle einsetzbar ?
Das ist korrekt.
Aber warum zum Teufel willst du die Datei UNBEDINGT zum Lesen UND Schreiben öffnen?!
Dazu besteht doch keine Notwendigkeit, so wie du das umsetzt.
Also
1. sRead = FileRead(Dateipfad)
2. sRead manipulieren
3. hwnd = FileOpen(Dateipfad, Overwrite)
4. FileWrite(hwnd , manipulierte sRead)
5. FileClose(hwnd)
-
-
Da du nur einen Lese- und einen Schreibvorgang hast, spar dir FileOpen und verwende einfach den Dateipfad für Read/Write. Dann hast auch keine Probleme mit den Flags.
Edit:
Das dein Text gelöscht wird, liegt daran, dass du im gemeinsamen Read/Write anders vorgehen musst.
ZitatWhen reading and writing via the same file handle, the FileSetPos() function must be used to update the current file position.
-
wie kann ich denn den geänderten HTML Code wieder abspeichern, das kriege ich irgendwie nicht hin ?
In deinem Kommentar steht zwar: Öffnen zum Lesen und Schreiben - Aber du tust es nicht. Du musst schon das Flag setzen.
-
Daher ist es für die "normale" Word find & replace nicht erreichbar.
Das ist schon klar. Mit "Suchen & Ersetzen" meinte ich schon eine auf das VBA Objekt bezogene, zu implementierende Funktion, die das übernimmt.
Ich wollte nur klarmachen:
Wenn ich sowieso ersetze, dann doch lieber mit Variablen statt Fixwerten.
-
Den Aufwand zu betreiben, die teilweise sehr aufwendigen Vorlagen neu aufzusetzen kann ich derzeit nicht leisten.
Aber wo ist der Unterschied, ob du per Suchen & Ersetzen einfügst:
Suche "Meier" Ersetze "Müller"
oder
Suche "Meier" Ersetze "INIRead(Inipfad, Chef)" - mit entsprechender VBA Umsetzung
Danach hast du alle Vorlagen dynamisch aktualisiert.
-
Excel-Instanz offen bleibt oder nicht ?
Mit ProcessExists auf eine Excelinstanz prüfen. Das Blöde ist aber, dass sich unbegrenzt Excel-Instanzen öffnen lassen.
Aber zum Test: Öffne vor dem Ausführen deines Skripts den Taskmanager. Findest du dort eine/mehrere Excel-Instanzen: Abschießen.
Und nun starte dein Skript in der jetzt Excel-freien Umgebung. Wenn es dann noch nicht klappt: PC aus Fenster werfen.

-
-
Jedoch bekomme ich immer noch die Speichermeldungen,
EDIT: Ich vermute, das ist nicht die Speichermeldung, sondern die ScreenUpdate-Meldung ("..Datei wurde verändert, soll die Datei neu geladen werden" - oder so ähnlich). Das musst du natürlich auch abfangen, siehst du in meiner Close-Funktion. Obwohl das in der normalen _Excel_Open-Funktion, die du kpl. mit False für alle Parameter setzt, ja auch deaktiviert sein sollte.

Ich verwende bei mir eine eigene Open und Close - Funktion, die jeweils Excel-Objekt erstellen und Workbook öffnen, sowie Workbook speichern und Objekt schließen in einem Rutsch erledigt. Da poppt keine Dialogbox auf.
Vielleicht kannst du es verwenden:
AutoIt
Alles anzeigenFunc _ExcelBookOpen($_sFilePath, $_bVisible=1, $_bReadOnly=False) Local $_oExcel = ObjCreate("Excel.Application") If NOT IsObj($_oExcel) Then Return SetError(1, 0, 0) If NOT FileExists($_sFilePath) Then Return SetError(2, 0, 0) If $_bVisible > 1 Then $_bVisible = 1 If $_bVisible < 0 Then $_bVisible = 0 With $_oExcel .Visible = $_bVisible .WorkBooks.Open($_sFilePath, Default, $_bReadOnly) .ActiveWorkbook.Sheets(1).Select() EndWith Return $_oExcel EndFunc ;==>_ExcelBookOpen Func _ExcelBookClose($_oExcel, $_bSave = 1, $_bAlerts = 0) If NOT IsObj($_oExcel) Then Return SetError(1, 0, 0) If $_bSave > 1 Then $_bSave = 1 If $_bSave < 0 Then $_bSave = 0 If $_bAlerts > 1 Then $_bAlerts = 1 If $_bAlerts < 0 Then $_bAlerts = 0 $_oExcel.Application.DisplayAlerts = $_bAlerts $_oExcel.Application.ScreenUpdating = $_bAlerts If $_bSave Then $_oExcel.ActiveWorkBook.Save EndIf $_oExcel.Application.DisplayAlerts = True $_oExcel.Application.ScreenUpdating = True $_oExcel.Quit Return 1 EndFunc ;==>_ExcelBookClose -
dann findest Du die Werte hier:
Alternativ kann man auch den VBA-Editor nutzen (Excel öffnen, <Alt+F11>) und dort im Objektkatalog (Symbol wie ein Karton) anzeigen lassen.
-
Ist aber sehr hypothetisch
Irgendwie musste ich ja meinen Kopf aus der Schlinge ziehen.

-
Das ist aber schon durch Parameter 2 von _Excel_Open erledigt.
Grundsätzlich ja, aber wenn z.B. das Objekt mit _Attach von einem Excel im Hintergrund "gekapert" wird, kann das durchaus anders sein.
Aber du hast recht - ohne Skript....

-
Aber leider habe ich nichts gefunden, wie man das Speichern Fenster abschalten kann, das wird immer wieder angezeigt ?
Vor dem Aufruf von ..Save:
$oExcel.DisplayAlerts = False
-
Schau dir in der Hilfe die Excel UDF an, alle Funktionen, die mit _Excel... beginnen.
-
Aber als FileCopy-UDF wird das wohl sehr heftig werden, wenn es überhaupt irgendwie geht.
Ich überlege gerade, das mit wChart in Nim zu schreiben und auch dort den async Prozess zu nutzen. Zur Kommunikation mit SciTE hatte ich das schon genutzt (async).
wChart nutzt auch GDIplus, aber halt wesentlich performanter.
Aber das hat keine Eile, werde ich mal immer so nebenbei weiter verfolgen.
-
Auch, wenn Du die Aktualisierung nur z.B. jede Sekunde vornimmst?
Weniger als 0.1 s ist nicht sinnvoll, da dann zu wenig Werte generiert werden und kein an- u. absteigender Graph, sondern eine kurze wilde Zick- Zacklinie entsteht.
Ich mach mir mal Gedanken, wie ich das in einen externen Prozess/anderen Kern auslagern kann.
-
OK, leider ist das Einbinden des Graphen ncht sinnvoll. Dadurch wird die Geschwindigkeit total ausgebremst, von 86 MB/s bis runter auf 12 MB/s.
Schade.
-
Ich würde sowas vorschlagen:
Hey, das gefällt mir. Danke für die Lösung. -
Ich wollte jetzt zu meiner Copy-Funktion auch eine Graph-Anzeige einbauen.
Soweit auch unproblematisch. Ich hatte vor Jahren, um mir den Umgang mit GDI zu vereinfachen, ja mal eine UDF dafür erstellt. Ist sicher für diese Anwendung overdressed, aber läuft.
Mein Problem liegt hier:
Beim Kopieren ist die Kopiergeschwindigkeit ja im Bereich von 0 bis ... MB/s.
Die zu zeichnenden Punkte sind immer als Prozentwerte anzugeben, max. Zeichenbereich = 100%. Nur auf welchen Wert soll ich die 100% referieren? Kopieren auf der Festplatte ist meist um die 80 MB/s, wenn ich da 150MB/s = 100% setze ist das übersichtlich. Auch wenn der Speed auf 10 MB/s absackt. Kopieren auf externe Datenträger kann aber deutlich langsamer sein, im KB-Bereich. Das würde dann gar nicht mehr angezeigt werden.Ich würde jetzt den Speed auswerten und beim Erreichen von Schwellwerten eine neue Grenze für die 100% setzen.
Oder habt ihr andere Ideen?
Hier mal eine lauffähige Simulation. Die erforderliche "LivingGraph.au3" ist angehängt.
BTW: Random() ist schon sehr seltsam. Spätestens nach 3 Minuten sind die simulierten Werte nur noch am Maximum und bleiben dort hängen.
EDIT: Ich hab schon zu lang nicht mehr damit gearbeitet. Es sieht so aus, als ob 0 oben ist?! Was hab ich denn da vergurkt? GDI+ ist nicht wirklich meine Kernkompoetenz.

Prozentwerte war Quatsch, Pixelposition wie üblich, nach unten größer werdend. - OK, das ist dann nur ein Umrechnungsproblem.
EDIT 2: Also die _RandomTransferSpeed() ist so nicht sehr sinnvoll, muss ich nochmal überdenken. - Ist aber nicht das Kernproblem.
EDIT 3: Die Funktion _RandomTransferSpeed() ist jetzt angepasst, aber läuft nach einiger Zeit gegen 0. Seltsam.
AutoIt
Alles anzeigen#include <ProgressConstants.au3> #include <GuiStatusBar.au3> #include <StaticConstants.au3> #include 'LivingGraph.au3' Global $hGui, $lbPercent, $lbSpeed, $lbFile, $lbRestFiles, $lbRestSize, $lbRestTime, $hStatus, $idProgress Global $idGraph _CreateCopyGui() GUISetState(@SW_SHOW, $hGui) Do _GraphCtrl_Draw($idGraph, _RandomTransferSpeed(95)) Until GUIGetMsg() = -3 Func _RandomTransferSpeed($_iMax) Local Static $100Percent = 85 ; Höhe Graph Local $1MBperSec = $_iMax / $100Percent Local Static $iMBPerSec = 50 $iMBPerSec += (Random(-1,1,1) * Random(1,3,1) * ($iMBPerSec / 100)) If $iMBPerSec >= $_iMax Then $iMBPerSec -= (3*($iMBPerSec / 100)) If $iMBPerSec < 1 Then $iMBPerSec = 1 Local $iShowPx = $100Percent - ($iMBPerSec / $1MBperSec) GUICtrlSetData($lbSpeed, Round($iMBPerSec) & ' MB') Return $iShowPx EndFunc Func _CreateCopyGui() $hGui = GUICreate('Copy with Progress', 400, 260) GUISetBkColor(0xF0F8FF) GUISetFont(10, 400, Default, 'Courier New') ; Prozent GUICtrlCreateLabel('Fortschritt:', 10, 10, 115, 17) $lbPercent = GUICtrlCreateLabel('0', 320, 10, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) GUICtrlCreateLabel('%', 380, 10, 10, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; Speed GUICtrlCreateLabel('Geschwindigkeit:', 10, 32, 125, 17) $lbSpeed = GUICtrlCreateLabel('0 MB', 300, 32, 70, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) GUICtrlCreateLabel('/s', 370, 32, 20, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; akt. Datei GUICtrlCreateLabel('Name:', 10, 54, 40, 17) $lbFile = GUICtrlCreateLabel('', 55, 54, 335, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Elemente GUICtrlCreateLabel('Verbleibende Elemente:', 10, 76, 180, 17) $lbRestFiles = GUICtrlCreateLabel('', 330, 76, 60, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Größe GUICtrlCreateLabel('Verbleibende Größe:', 10, 98, 180, 17) $lbRestSize = GUICtrlCreateLabel('', 280, 98, 110, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; verbleibende Zeit GUICtrlCreateLabel('Restdauer ungefähr:', 10, 120, 180, 17) $lbRestTime = GUICtrlCreateLabel('', 250, 120, 140, 17, BitOR($GUI_SS_DEFAULT_LABEL, $SS_RIGHT)) GUICtrlSetColor(-1, 0x000080) ; Graph hellgrün: 0xF0F0F0, dunkelgrün: 0x05B024 $idGraph = _GraphCtrl_Create($hGui, 10, 142, 380, 85, 20) _GraphCtrl_SetHelpline($idGraph, -1, '30,60') ; Statusbar $hStatus = _GUICtrlStatusBar_Create($hGui) _GUICtrlStatusBar_SetMinHeight($hStatus, 20) $idProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH) GUICtrlSetColor(-1, 0x008B00) ; grün _GUICtrlStatusBar_EmbedControl($hStatus, 0, GUICtrlGetHandle($idProgress)) EndFunc