Makro von Excel in OO - Basic

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Bembel
*
Beiträge: 14
Registriert: Fr, 01.10.2004 08:14
Wohnort: Breidenbach

Makro von Excel in OO - Basic

Beitrag von Bembel »

Hi
habe unter Excel ein Programm am laufen , nun möchte
ich es unter OO haben.
Kann mir jemand Helfen wie dieser Befehl übersetzt in oobasic lautet?
Dies ist nur ein Teil des Makros der Rest Funktioniert.
Danke schon mal im voraus .
Gruß Bembel

Sub Speichern()
Meldung = "Haben Sie Ihre diverse Zeiten eingegeben ?"
DialogArt = vbYesNo + vbDefaultButten2
Titel = "Hinweis"
Anwt = MsgBox(Meldung, DialogArt, Titel)
If Anwt = vbNo Then
Sheets("Diverse").Select
Range("F14").Select
Else
Anwt = vbJa
Application.ScreenUpdating = False 'Bildschirm ausgeschaltet ( Einfrieren))
Range("E52:AD52").Select
Selection.Copy
Sheets("Datenbank").Select
ActiveWindow.ScrollColumn = 20
Range("A5").Select
Selection.EntireRow.Insert
Range("A5:A6").Select
Selection.NumberFormat = "mmmm yy
Range("A5").Select
With Selection
.HorizontalAlignment = xlRight
End With
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

der Rest Funktioniert
das ist zumindest ein Lichtblick, denn der Code den Du hier postest funktioniert nicht :wink: .
Abgesehen von Syntax-Fehlern im Code, müßtest Du mal verraten was hiermit erreicht werden soll, denn ich weiß es nicht:

<1> Range("E52:AD52").Select
<2> Selection.Copy
<3> Sheets("Datenbank").Select
<4> ActiveWindow.ScrollColumn = 20
<5> Range("A5").Select
<6> Selection.EntireRow.Insert


wenn Zeile 1,2,(3,4),5 ausgeführt werden führt Zeile 6 zu Fehlermeldung (Excel 97) --> als Zeile 6 sollte funktionieren Selection.insert. Allerdings weiß ich nicht wirklich was nun gemeint sein soll da doch Selection.EntireRow.Insert bedeutet leere Zeile einfügen oder nicht? Also entweder bei A5 leere Zeile einfügen und dann die Selektion in diese Zeile kopieren oder gleich die Selektion in die Zeile 5 (beginnend Spalte A) kopieren? Und welchen konkreten Zweck verfolgt Zeile 4 (ich kenne nicht den gesamten Code)?

Hast Du denn schon mal versucht das mit dem Makrorecorder aufzuzeichen? ("if" und "then"-Teil getrennt)

Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Hartmut,
es sollte auch unter Excel 97 laufen
das tut es aber nicht, es hängt mit Laufzeitfehler 1004 bei Zeile:

Selection.EntireRow.Insert

und auch wenn Du mir den gesamten Code postest, weiß ich immer noch nicht was diese Zeile bewirken soll. Meine Recherchen sagen das ist das Einfügen einer leeren Zeile, aber ich weiß das nicht genau. Mit dem Recorder kann ich das nicht so aufzeichnen das ich den exakt selben Code bekomme (?)
Vorbehaltlich das ich somit nicht weiß wo eingefügt werden soll (bei A5 direkt oder dort Leerzeile und dann in diese Zeile) ist das soweit der Code:

Code: Alles auswählen

Sub Speichern()
document   = ThisComponent.CurrentController.Frame 
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
Meldung = "Haben Sie Ihre diverse Zeiten eingegeben ?" 
DialogArt = 260
Titel = "Hinweis" 
Anwt = MsgBox(Meldung, DialogArt, Titel)
 
If Anwt = 7 Then 
	myDoc = ThisComponent
	myView = myDoc.CurrentController
	mySheet = myDoc.Sheets.getByName("Diverse")
	myView.setActiveSheet(mySheet)
	oCtl = myDoc.getCurrentController 
	oSheet = oCtl.ActiveSheet 
	oCell = oSheet.getCellRangeByName("F14") 
	oCtl.select(oCell) 
Else 
	Anwt = 6 
	myDoc = ThisComponent
	oCtl = myDoc.getCurrentController 
	oSheet = oCtl.ActiveSheet 
	oCell = oSheet.getCellRangeByName("E52:AD52") 
	oCtl.select(oCell)
	dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array()) 
	mySheet = myDoc.Sheets.getByName("Datenbank")
	myView = myDoc.CurrentController	
	myView.setActiveSheet(mySheet)
	oCtl = myDoc.getCurrentController 
	oSheet = oCtl.ActiveSheet 
	oCell = oSheet.getCellRangeByName("A5") 
	oCtl.select(oCell)
	dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
	oCell = oSheet.getCellRangeByName("A5:A6") 
	dim args2(0) as new com.sun.star.beans.PropertyValue
	args2(0).Name = "NumberFormatValue"
	args2(0).Value = 109
	dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args2())
	oCell = oSheet.getCellRangeByName("A5") 
	oCell.HoriJustify = com.sun.star.table.CellHoriJustify.RIGHT
	
End if
End Sub
Leider kann ich hierzu garnichts sagen:
'Application.ScreenUpdating = False 'Bildschirm ausgeschaltet ( Einfrieren))

Bei mir läuft das ganz gut. Da Du sagst der gesamte Rest läuft bei Dir schon, füge erstmal den Code ein und teste mal was insgesamt passiert.


Gruß
Stephan
Bembel
*
Beiträge: 14
Registriert: Fr, 01.10.2004 08:14
Wohnort: Breidenbach

Beitrag von Bembel »

Hi Stephan

Danke für deine Mühe
Die Meldebox läuft ( Super)

Das Makro läuft bis Datenbank A5. Daten aus Zeiterfassung einfügen
Ab Zeile B5 steht dann #REF!

Zum Thema „ Einfrieren „ beim Ablauf eines Makros kann es vorkommen, das
bei schnellen Ablauf der einzelnen Aktionen der Bildschirm sehr unruhig
wird. Das kann man dadurch abstellen , das die Bildschirmanzeige der
Aktionen so lange unterbunden wird bis das Makro ausgeführt ist.
Anwendung .BildschirmAktualisierung = Falsch (Am Anfang ) eines Makros
Anwendung .BildschirmAktualisierung = Wahr ( Am Ende ) eines Makros

Gruß Hartmut (Bembel)
javascript:emoticon(':lol:')
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Hallo Hartmut,
Das Makro läuft bis Datenbank A5. Daten aus Zeiterfassung einfügen
Ab Zeile B5 steht dann #REF!


Ups - der Grund dafür dürfte sein das die kopierten Zellen Formeln enthalten, welche z.B. auf einen (namentlich benannten) Bereich im ursprünglichen Tabellenblatt bezugnehmen. Da dieser Bezug auf dem Zieltabellenblatt nicht vorhanden ist und keine automatische Konvertierung der Formel erfolgt existiert die Referenz nicht mehr. Im Prinzip gibt es zwei Lösungen:
(a)durch zusätzlichen Code innerhalb des Makros alle Formeln entsprechend anzupassen
(b)in der Quelltabelle die Formeln entsprechend abzuwandeln, z.B. statt: "=A1" "$Tabelle1.A1" verwenden so das bezüglich der Tabelle ein absoluter Bezug vorhanden ist.

Falls Du hierzu Hilfe benötigst, melde Dich nochmal.

Das mit der Bildschirmaktualisierung war mir schon klar, ich weiß nur nicht wie ich das in StarBasic-Code übersetzen kann.

Gruß
Stephan
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Stephan hat geschrieben:
Das mit der Bildschirmaktualisierung war mir schon klar, ich weiß nur nicht wie ich das in StarBasic-Code übersetzen kann.

Gruß
Stephan
Es wird zwar vermutlich nicht mehr von Bedeutung sein, aber falls mal jemand anderes an dieser Stelle darauf stößt:
Die gesuchte Funktion nennt sich "lockControllers" (=Application.ScreenUpdating = False) zum "Einfrieren" und "UnlockControllers" (=Application.ScreenUpdating = False) zum "Auftauen".
Näheres dazu gibt es dort: http://www.oooforum.org/forum/viewtopic.php?t=5722

Benutzt wird es mit dem Objekt "ThisComponent".

Viele Grüße,
Vanished
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Beitrag von Stephan »

Es wird zwar vermutlich nicht mehr von Bedeutung sein
nein, wird dankend entgegengenommen. Ich hatte es wohl im englischen Forum übersehen.

Gruß
stephan
Antworten