Marko funktioniert nach öffnen nicht richtig

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

Moderator: Moderatoren

Piramos
Beiträge: 4
Registriert: Mo, 04.04.2016 11:17

Marko funktioniert nach öffnen nicht richtig

Beitrag von Piramos »

Hallo,

ich habe folgendes Problem mit Open Office Calc. Mein programmiertes Makro funktioniert während der Bearbeitung problemlos, sobald ich die Datei neu öffne funktionieren additionen und "if not" Funktionen nicht mehr. Wenn ich dann nur eine Leerzeile einfüge oder eine Änderung mache die mit dem Code nichts zu tun hat funktioniert alles reibungslos.

Das "if not" konnte ich mit einem "Bool" Zwischenschritt umgehen.

Vorher:

Code: Alles auswählen

  if osheet.getCellByPosition(2,i4).string = "I" and not osheet.getCellByPosition(1,i4).string = "" then
Nacher

Code: Alles auswählen

    
    If oCell2_31_Inhalt = "" then
   bool = 0
   else
   bool = 1
   end if
   
  if  oCell2_32_Inhalt = "I" and bool = True then
Das funktioniert auch nach dem öffnen reibungslos. Der neue Fehler ist, das 1+1 nicht 2 sind sondern 11.
Wenn ich die Datei an einem anderen PC öffne ,habe ich das gleiche Problem.

Hat das Problem schon jemand gesehen und hat eine Lösung dafür?

Gruß und Danke
Sebastian
mikeleb
*******
Beiträge: 1427
Registriert: Fr, 09.12.2011 16:50

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von mikeleb »

Hallo Sebastian,
das 1+1 nicht 2 sind sondern 11
Das deutet auf eine Stringaddition hin.
Der Rest ist schwer nachvollziehbar, da der Rest des Makros fehlt und nur erraten werden kann.
Handelt es sich bei dem Makro um eine Function oder eine Sub?
Erfolgt der Aufruf als benutzerdefinierte Funktion oder über die IDE?
Gruß,
mikeleb
Karolus
********
Beiträge: 7533
Registriert: Mo, 02.01.2006 19:48

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von Karolus »

Hallo

Geht das auch etwas ausführlicher - wie äussert sich dieses ominöse "geht nicht"

Die wenigen gezeigten Codezeilen liefern auch keine wesentlichen Informationen.
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Piramos
Beiträge: 4
Registriert: Mo, 04.04.2016 11:17

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von Piramos »

Der Komplette Code:

Code: Alles auswählen



sub Main

dim Eingaenge as long 'Eingänge 
dim Ausgaenge as long 'Ausgänge
dim ElNr as string 'Eingänge letzte Nummer
dim ElNr_1 'Eingänge letzte Nummer Teil1
dim ElNr_2  'Eingänge letzte Nummer Teil2
dim ElNr_3  'Eingänge letzte Nummer Teil3
dim EWlNr 'Eingänge analog letzte Nummer
dim EWlNr_1 'Eingänge analog letzte Nummer Teil1
dim AlNr  'Ausgänge letzte Nummer 
dim AlNr_1  'Ausgänge letzte Nummer Teil1
dim AlNr_2  'Ausgänge letzte Nummer Teil2
dim AlNr_3  'Ausgänge letzte Nummer Teil3 
dim AWlNr 'Ausgänge analog letzte Nummer
dim AWlNr_1 'Ausgänge analog letzte Nummer 
dim LetzteZeile5 as string 'Welche Modul wird benötigt


dim oSheet
dim oCursor
dim letzteZeile4 as long
dim i4 as long
dim bool as boolean

dim oCell2_31
dim oCell2_32
dim oCell2_33
dim oCell2_34
dim oCell2_35

dim oCell2_31_Inhalt as string
dim oCell2_32_Inhalt as string
dim oCell2_33_Inhalt as Long
dim oCell2_34_Inhalt as Long
dim oCell2_35_Inhalt as Long
dim oCell2_36_Inhalt as string


   oSheet = thisComponent.sheets(1) '2.Blatt
   ocursor = oSheet.createCursor()
   ocursor.gotoStart()   
   ocursor.gotoEndofUsedArea(false)         'letzte Zelle des Bereiches
   letzteZeile4 = ocursor.getRangeAddress.endRow   'index letzte Zeile des Bereichs
   
 ' Eingangsnummern   
 
      For i4 = 3 To letzteZeile4 

   oCell2_31_Inhalt = osheet.getCellByPosition(1,i4).string  ' Suchtext " "
   oCell2_32_Inhalt = osheet.getCellByPosition(2,i4).string ' Suchtext nicht leer
   
      If oCell2_31_Inhalt = "" then
   bool = 0
   else
   bool = 1
   end if
   
  if  oCell2_32_Inhalt = "I" and bool = True then
    ElNr = oCell2_31_Inhalt
    else if osheet.getCellByPosition(2,i4).string = "IW" and bool = True then
    EWlNr = oCell2_31_Inhalt
    end if
    end if
      
		next i4
		
 ' Ausgangsnummern   
 
      For i4 = 2 To letzteZeile4

   oCell2_31_Inhalt = osheet.getCellByPosition(10,i4).string ' Suchtext " "
   oCell2_32_Inhalt = osheet.getCellByPosition(11,i4).string ' Suchtext nicht leer
   
         If oCell2_31_Inhalt = "" then
   bool = 0
   else
   bool = 1
   end if
   AWlNr = "QW 252"' Falls erster Eingang
   
   if oCell2_32_Inhalt = "Q" and bool = True then
    AlNr = oCell2_31_Inhalt
    else if oCell2_32_Inhalt = "QW" and bool = True then
    AWlNr = oCell2_31_Inhalt
    end if
    end if
      
		next i4	
		
  ElNr=replace(ElNr," "," ")
  ElNr_1=Split(ElNr," ", "")  
  ElNr_2=ElNr_1(1)
  ElNr_2=replace(ElNr_2," "," ")
  ElNr_3=Split(ElNr_2,".")  
  EWlNr=replace(EWlNr," "," ")
  EWlNr_1=Split(EWlNr," ", "") 
  AlNr=replace(AlNr," "," ")
  AlNr_1=Split(AlNr," ", "")  
  AlNr_2=AlNr_1(1)
  AlNr_2=replace(AlNr_2," "," ")
  AlNr_3=Split(AlNr_2,".")
  AWlNr=replace(AWlNr," "," ")
  AWlNr_1=Split(AWlNr," ", "")
				
 ' Eingangsnummern  vergeben
 
      For i4 = 3 To letzteZeile4
   oCell2_31 = osheet.getCellByPosition(1,i4)
   oCell2_31_Inhalt = osheet.getCellByPosition(1,i4).string ' Suchtext " "
   oCell2_32_Inhalt = osheet.getCellByPosition(2,i4).string ' Suchtext nicht leer
'   oCell2_32_Inhalt = osheet.getCellByPosition(2,i4).string ' Suchtext nicht leer
    
    dim test as double
      
   if oCell2_32_Inhalt = "I" and oCell2_31_Inhalt = "" then
   			if ElNr_3(1)< "7" then
  			   ElNr_3(1)= ElNr_3(1)+1
  			elseif ElNr_3(1)> "6" then  
  			   ElNr_3(0)= ElNr_3(0)+1
  			   ElNr_3(1)="0"    
    end if
       oCell2_31.string = "I " & ElNr_3(0) & "." &  ElNr_3(1)

    
    else if oCell2_32_Inhalt = "IW" and oCell2_31_Inhalt = "" then
    
 			   EWlNr_1(1)= EWlNr_1(1)+2			   
       		   oCell2_31.string = "IW " & EWlNr_1(1)
    
	end if 
    end if
      
		next i4	
		
 ' Ausgangsnummern  vergeben
 
      For i4 = 3 To letzteZeile4
   oCell2_31 = osheet.getCellByPosition(10,i4)
   oCell2_31_Inhalt = osheet.getCellByPosition(10,i4).string ' Suchtext " "
   oCell2_32_Inhalt = osheet.getCellByPosition(11,i4).string ' Suchtext nicht leer
   oCell2_36_Inhalt = osheet.getCellByPosition(10,i4-"1").string ' Abfrage ob Zeile darüber leer, dann neues Modul
   
   If oCell2_36_Inhalt = "" then
   bool = 0
   else
   bool = 1
   end if
   
   if oCell2_32_Inhalt = "Q" and oCell2_31_Inhalt = "" and bool = True then
   			if AlNr_3(1)< "7" then
  			   AlNr_3(1)= AlNr_3(1)+1
  			elseif AlNr_3(1)> "6" then  
  			   AlNr_3(0)= AlNr_3(0)+1
  			   AlNr_3(1)="0"  
    end if
       oCell2_31.string = "Q " & AlNr_3(0) & "." & AlNr_3(1)
       
    elseif   oCell2_32_Inhalt = "Q" and oCell2_31_Inhalt = "" and oCell2_36_Inhalt = ""then 'Wenn neues Modul, dann erste laufende Nummer +1 & zweite  auf 0
  			   AlNr_3(0)= AlNr_3(0)+1
  			   AlNr_3(1)="0"   
		oCell2_31.string = "Q " & AlNr_3(0) & "." & AlNr_3(1)
    
    else if oCell2_32_Inhalt = "QW" and oCell2_31_Inhalt = "" then
    
  			   AWlNr_1(1)= AWlNr_1(1)+2			   
       		   oCell2_31.string = "QW " & AWlNr_1(1)
    
	end if 
    end if      
		next i4	
End Sub


' ----------------------------------------------------------------------
sub Wechsel_Blatt_DE_DA
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 2
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
End sub
Die Funktion des Makros ist die Eingangnummern in Spalten "B" und "K" entsprechend der Eingangsart "E/A" fortlaufen zu nummerieren. Bei der Art "I" und "Q" bis Beispielsweise 0.7 und dann mit 1.0 weitermachen. Bei "IW" und "QW" in Schritten jeweils +2.
Im ersten Teil des Makros suche ich die höchste vergebene Nummer für ein und Ausgäng gesucht. Danach Teile ich die Nummern auf um die Bedinungen zu prüfen und addieren zu können.
Anschließend fülle ich die leern Nummern auf.

Wenn ich das Makro nach dem öffnen ausführe steht in Spalte B Zeile 13 bis 17 :
I 1.01
I 1.011
I 1.0111
I 1.01111
I 1.011111

richtig wäre aber

I 1.1
I 1.2
I 1.3
I 1.4
I 1.5

Das Makro wird falsch ausgeführt, bis ich irgent etwas im Makro Code ändere. z.B einfach am Anfang oder Ende eine Leerzeile einfüge.
Dann funktioniert das ganze Problemlos bis zum speichern und wieder öffnen, da geht es wieder von vorne los.

[img]I[/img]

Irgentwie kann ich keine Datei/Bilder anhängen.

Gruß
Sebastian
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von balu »

Hallo Sebastian,

dein Code ist sehr schwer zu lesen. Die ganzen "If ... then" und "For ... next" sind sehr schwer zu entschlüsseln.

Und außerdem: Der Code, so wie Du ihn hier gepostet hast, kann nie-und-nimmer laufen. Dafür lege ich meine Hand ins Feuer.

Übrigens. Welches Office hast Du genau, mit der Versionsnummer, AOO oder LO?
Wenn ich das Makro nach dem öffnen ausführe steht in Spalte B Zeile 13 bis 17 :
I 1.01
I 1.011
I 1.0111
I 1.01111
I 1.011111
Klingt logisch, da Du hiermit

Code: Alles auswählen

       oCell2_31.string = "I " & ElNr_3(0) & "." &  ElNr_3(1)
keine addition, sondern eine Text (String) Verkettung durchführst. Also gehst Du dort schon mal den Falschen Weg.

Aber bis dahin komme ich erst gar nicht, wenn ich deinen Code ausführen will, da ich Fehlermeldungen bekomme.

Code: Alles auswählen

ElNr_2=ElNr_1(1)
Fehlermeldung hat geschrieben: Unzulässiger Wert oder Datentyp
Index außerhalb des definierten Bereichs
Und ich glaube kaum das Du weißt was Du da gemacht hast. Oder ist dir bewusst das Du auf ein Array zugreifen willst?

Und da wir schon mal in der Gegend sind.

Code: Alles auswählen

  ElNr=replace(ElNr," "," ")
Was soll denn das? Leerzeichen durch Leerzeichen ersetzen. Den Sinn versteh ich absolut nicht.


Und wenn ich die Codezeile mit der Fehlermeldung auf das hier ändere,

Code: Alles auswählen

ElNr_2=ElNr_1'(1)
kommt in der darauffolgende CodeZeile

Code: Alles auswählen

  ElNr_2=replace(ElNr_2," "," ")
schon die nächste Fehlermeldung
Fehlermeldung hat geschrieben: BASIC-Laufzeitfehler.
Objektvariable nicht belegt.
Klar! Ist doch so etwas von logisch!
Die Variable *ElNr_2* soll das Ergebnis der Ersetzung der Variable *ElNr_2* aufnehmen. Wie soll denn das gehen?
Und ab hier hatte ich absolut keinen Bock mehr deinen Code irgendwie ans Laufen zu bekommen.


So, und nun noch was generelles zu der Variablen deklaration.

Code: Alles auswählen

dim ElNr_1 'Eingänge letzte Nummer Teil1
dim ElNr_2  'Eingänge letzte Nummer Teil2
dim ElNr_3  'Eingänge letzte Nummer Teil3
dim EWlNr 'Eingänge analog letzte Nummer
dim EWlNr_1 'Eingänge analog letzte Nummer Teil1
dim AlNr  'Ausgänge letzte Nummer
dim AlNr_1  'Ausgänge letzte Nummer Teil1
dim AlNr_2  'Ausgänge letzte Nummer Teil2
dim AlNr_3  'Ausgänge letzte Nummer Teil3
dim AWlNr 'Ausgänge analog letzte Nummer
dim AWlNr_1 'Ausgänge analog letzte Nummer
Von welchen Typ sind denn diese Variablen?

Code: Alles auswählen

dim oSheet
dim oCursor
Auch hier wieder: Welcher Typ?
Wenn Du schon ein Blatt (oSheet) deklarierst, dann aber auch richtig, nämlich als Object.

Code: Alles auswählen

dim oSheet as Object

Code: Alles auswählen

dim oCell2_31
dim oCell2_32
dim oCell2_33
dim oCell2_34
dim oCell2_35
Auch hier wieder: Welcher Typ? Text, String oder was?

Wenn Du bei der Variablendeklaration nicht aufpasst, und dementsprechend Fehler einbaust, dann wird sich das früher oder später negativ bemerkbar machen. Du wirst dann auf Probleme und Fehlermeldungen stoßen die dir nicht sofort erklärlich sind. Darauf hast Du mein Wort, das garntiere ich dir.

Code: Alles auswählen

   if oCell2_32_Inhalt = "I" and oCell2_31_Inhalt = "" then
            if ElNr_3(1)< "7" then
Wenn die 7 ein String (Text) ist, dann ist das akzeptabel das sie in doppelten Anführungszeichen stehen. Wenn sie aber eine Zahl ist, dann sind die doppelten Anführungszeichen überflüssig.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
mikeleb
*******
Beiträge: 1427
Registriert: Fr, 09.12.2011 16:50

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von mikeleb »

Hallo,

danke @balu, dass du dich soweit durchgekämpft hast. Ich habe schon vorher aufgegeben und kann deine Ausführungen nur bestätigen/unterstreichen.
Gruß,
mikeleb
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von balu »

Ave mikeleb,

gern geschehen. :D


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Piramos
Beiträge: 4
Registriert: Mo, 04.04.2016 11:17

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von Piramos »

Guten Morgen,

Danke Balu, das du dich schon mal soweit durchgekämpft hast. Meine Erfahrungen mit OO sind nicht besonders groß. Vorher habe ich etwas mit VBA in Ecxel programmiert, ich verwende AOO 4.1.2.

Ich versuche im laufe des Tages den Code zu überarbeiten, hier aber schon ein paar Antworten bzw. Erzänzungen.
Klingt logisch, da Du hiermit

Code: Alles auswählen
oCell2_31.string = "I " & ElNr_3(0) & "." & ElNr_3(1)

keine addition, sondern eine Text (String) Verkettung durchführst. Also gehst Du dort schon mal den Falschen Weg.
Der Fehler in der Addition bezieht sich ja nur auf "ElNr_3(1)". In diesem Schritt solten eigentlich nur die fertigen Variablen ,wie du schreibst ,verkettet werden.

Code: Alles auswählen

  ElNr=replace(ElNr," "," ")
  ElNr_1=Split(ElNr," ", "") 
  ElNr_2=ElNr_1(1)
  ElNr_2=replace(ElNr_2," "," ")
  ElNr_3=Split(ElNr_2,".")  
Hiermit möchte ich eigentlich die ermittelte letzte Eingangsnummer z.b. "I 0.7" aufteilen in
"I"
"0"
"7"
um dann mit "0" und "7" weiter zu arbeiten. Den Code habe ich aus dem PDF"Andrew Pitonyak
OpenOffice.org-Makros Erklärt" Seite 143 Tabelle 49 bzw. einer Google Suche und so lange parobiert bzw. angepasst bis es funktioniert hat.

Code: Alles auswählen

Code: Alles auswählen
   if oCell2_32_Inhalt = "I" and oCell2_31_Inhalt = "" then
            if ElNr_3(1)< "7" then

Wenn die 7 ein String (Text) ist, dann ist das akzeptabel das sie in doppelten Anführungszeichen stehen. Wenn sie aber eine Zahl ist, dann sind die doppelten Anführungszeichen überflüssig.
Wenn ich mein oben genanntes Beispiel aufteile und die Variable beobachte, steht für die "7" als Typ Variant/String daher "7". Wenn ich vorher die Variable "ElNr_1" als string deklariert habe, kommt die Fehlermeldung "Laufzeitfehler 91". Daher hatte ich es weg gelassen, da es funktionierte.

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

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von Stephan »

Tue uns doch einen Gefallen, mache eine Beispieldatei und packe da auch das Makro rein und sorge dafür das es insoweit funktioniert wie Du es bereits beschrieben hast, nämlich:
Wenn ich das Makro nach dem öffnen ausführe steht in Spalte B Zeile 13 bis 17 :
I 1.01
I 1.011
I 1.0111
I 1.01111
I 1.011111
denn an diese Stelle kommt doch bisher von uns niemand weil die von Balu genannten Fehlermeldungen auftauchen.


GRuß
Stephan
Piramos
Beiträge: 4
Registriert: Mo, 04.04.2016 11:17

Re: Marko funktioniert nach öffnen nicht richtig

Beitrag von Piramos »

So
Habe das Makro überarbeitet. Jetzt funktioniert es auch nach dem öffen :-). vielen Dank für die Denkanstöße!
Komischerweise hatte ich das Ergebinss

Code: Alles auswählen

Wenn ich das Makro nach dem öffnen ausführe steht in Spalte B Zeile 13 bis 17 :
I 1.01
I 1.011
I 1.0111
I 1.01111
I 1.011111
Als ich meine Tabelle und das Modul in eine neue Datei kopiert habe. Ich hoffe da ist nicht grundsätzlich in meiner Datei der Wurm drin.
Gibt es eigentlich eine Empfehlung wie viele Module in einer Datei sein düfen?

Eines ist mir allerding noch nicht klar.

Code: Alles auswählen

dim ElNr_1(0 to 1) as variant 
dim ElNr_2(0 to 1) as integer 
ElNr_1=Split(ElNr," ", "")   
ElNr_2=Split(ElNr_1(1),".")  
Wenn ich die Variable "ElNr_2" vorher als integer deklariert habe, ändert das Makro beim ausführen die Variablen in ein sting. Warum? Es sind jeweils zwei Zahlen.

Die funktionieren Datei ist Jetzt im Anhang.

Gruß und Danke
Sebastian
Beispiel.ods
(15.46 KiB) 126-mal heruntergeladen
Antworten