Seite 1 von 1

Kein Zugriff auf Objekt. Falsche Verwendung des Objektes

Verfasst: Mi, 04.05.2011 17:13
von MikeRo
Hallo,

ich habe einen komischen Fehler mit meinem Makro, ich Programmiere es an einem PC und es geht ohne Probleme.
Wenn ich das Makro dann auf einen anderen PC installiere und Starte, kommt der Fehler "Kein Zugriff auf Objekt. Falsche Verwendung des Objektes"
Woran kann das liegen?

Re: Kein Zugriff auf Objekt. Falsche Verwendung des Objektes

Verfasst: Do, 05.05.2011 04:14
von komma4
MikeRo hat geschrieben:Woran kann das liegen?
Ohne das Makro und den fehlerwerfenden Befehl zu kennen:

* an den Sicherheitseinstellungen des zweiten PCs (Extras>Optionen...>OpenOffice.org>Sicherheit>Makrosicherheit)
* an auf beiden PCs unterschiedlichen Pfaden
* an unterschiedlichen Programmversionen
* an sonstwas Unterschiedliches



Merke: bei Fragen immer OOo Version, Betriebssystem, ggfs. Datenbank angeben

Re: Kein Zugriff auf Objekt. Falsche Verwendung des Objektes

Verfasst: Mi, 11.05.2011 10:02
von MikeRo
komma4 hat geschrieben:
MikeRo hat geschrieben:Woran kann das liegen?
Ohne das Makro und den fehlerwerfenden Befehl zu kennen:

* an den Sicherheitseinstellungen des zweiten PCs (Extras>Optionen...>OpenOffice.org>Sicherheit>Makrosicherheit)
* an auf beiden PCs unterschiedlichen Pfaden
* an unterschiedlichen Programmversionen
* an sonstwas Unterschiedliches



Merke: bei Fragen immer OOo Version, Betriebssystem, ggfs. Datenbank angeben
An dem PC an dem ich Programmiere habe ich die OpenOffice Version 3.3
Auf dem anderen PC war 3.2 und wieder auf einem anderen 3.1...
Nachdem ich auf die 3.3 geupdatet habe, ging das Makro wieder. Trotzdem sehr komisch das ganze.

Hier hast du mal einen Auszug des Codes (Der ganze ist noch mal 5 mal so lang.)

Code: Alles auswählen

rem-----------------------------------------------------------------------------------------------------------------------------------------------
rem-------------------------------------------------------------------------------------------DB Rabattüberschriften auslesen und Spalten erzeugen
rem-----------------------------------------------------------------------------------------------------------------------------------------------

Sub AnzahlRabattUeberschriften
       	
    Dim aData(0)
    Dim aLine(0)

      oPrepStatement = oCon.prepareCommand(VorhandeneRabatte,2)
      oResult = oPrepStatement.executeQuery
      aColumns = oPrepStatement.Columns.ElementNames
      nColumnCount = UBound(aColumns)
      ReDim aLine(nColumnCount)
      ReDim aData(0)
      aData(0) = aColumns
      nUpperBoundary = 0
      Do While oResult.Next
         nUpperBoundary = UBound(aData)+1
         ReDim Preserve aData(nUpperBoundary)

rem-----------------------------------------------------------------------------------------------------------Rabattüberschrift aus DB in Tabelle

         			s = oResult.getString(1)
        	   	   	RabattUeberschrift = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+nUpperBoundary,9)
        	   	   	RabattUeberschrift.String = s
				   	RabattUeberschrift.isTextWrapped = TRUE

rem-------------------------------------------------------------------------------------------------------Rabattwert aus DB unter die Überschrift

				   	
				   	z = oResult.getString(2)	   	   
        	   	   	Prozentsatz = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+nUpperBoundary,10)
				   	Prozentsatz.Value = z
			   	   	Prozentsatz.NumberFormat = 11	


      Loop
      
AnzahlRabatte = nUpperBoundary

rem-------------------------------------------------------------------------------------------------------Schreiben der Rabattwerte in die Tabelle
rem-----------------------------------------------------------------------------------------------------------------------------------------------
		
	For i = 1 to AnzahlRabatte
	
	  	myCell = oSheet.getCellByPosition(LetzteSpalte+i,10)
       	myValue = (mycell.Value)*100
       	aPercentage = Replace(myValue,",",".")

Call SQL

      oPrepStatement = oCon.prepareCommand(Rabatte,2)
      oResult = oPrepStatement.executeQuery
      aColumns = oPrepStatement.Columns.ElementNames
      nColumnCount = UBound(aColumns)
      ReDim aLine(nColumnCount)
      ReDim aData(0)
      aData(0) = aColumns
      nUpperBoundary = 0
      Do While oResult.Next()
      nUpperBoundary = UBound(aData)+1
         
         ReDim Preserve aData(nUpperBoundary)
         
         			s = oResult.getString(1)
        	   	   	RabattWert = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+i,10+nUpperBoundary)
        	   	   	RabattWert.Value = s
		Loop

	Next i

rem----------------------------------------------------------------------------------------Einfügen der Formeln für die Rabatte & der Rabattsummen
rem-----------------------------------------------------------------------------------------------------------------------------------------------
'LetzteSpalte = 11

For x = 1 to AnzahlRabatte

	For i = 1 to Positionen
	
		mycell = oSheet.getCellByPosition(LetzteSpalte+1,11)
		oColumn = mycell.getColumns.getByIndex(0).getName()
		cellname = oColumn+ltrim(str(11))
		cellname3 = oColumn
				
		mycell = oSheet.getCellByPosition(LetzteSpalte,11)
		oColumn = mycell.getColumns.getByIndex(0).getName()
		cellname2 = oColumn
				
		myCell = oSheet.getCellByPosition(LetzteSpalte+1,10+i)
     	myValue = mycell.Value
	
	   		RabattFormel = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+1,10+i)

RabattFormel = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+1,10+i) Hier war der Fehler bei der Variablen LetzteSpalte

Code: Alles auswählen

        
        	If MyValue = 0 Then
        		
           		RabattFormel.Value = 0
	       		RabattFormel.NumberFormat = 107
			
			Else
        	
        		RabattFormel.FormulaLocal = "=" & cellname2 & i+11 & "*" & cellname & ""
				RabattFormel.NumberFormat = 107
				
			End If

	Next i
			LetzteSpalte = LetzteSpalte+2
			mycolumns = oSheet.getcolumns
			mycolumns.insertbyindex(LetzteSpalte,1)
			
	For i = 1 to Positionen
	
			RabattSummen = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte,10+i)
			RabattSummen.FormulaLocal = "=" & cellname2 & i+11 & "-" & cellname3 & i+11
			RabattSummen.NumberFormat = 107
	
	
	
	Next i
			
Next x	

LetzteSpalte = LetzteSpalte

'MsgBox LetzteSpalte 17
'MsgBox AnzahlRabatte 3

rem------------------------------------------------------------------------------------------------------Überschriften für die Rabattsummenspalten
rem-----------------------------------------------------------------------------------------------------------------------------------------------

			Ueberschrift = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte,9)
			Ueberschrift.String = "Agentur-" & chr(13) & "netto"
			Ueberschrift.isTextWrapped = TRUE
			
			Ueberschrift = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte-2,9)
			Ueberschrift.String = "Kunden-" & chr(13) & "netto"
			Ueberschrift.isTextWrapped = TRUE

			If AnzahlRabatte > 2 Then
			
				x = LetzteSpalte - 2*AnzahlRabatte
			
				For i = 1 to AnzahlRabatte-2
						
					Ueberschrift = oDoc.sheets.getByName("Angebot").getCellByPosition(x+i*2,9)
					Ueberschrift.String = "Zwischen-" & chr(13) & "summe"
					Ueberschrift.isTextWrapped = TRUE
			
				Next i
			
			EndIf
rem---------------------------------------------------------------------------------------------------------------------Skonto Spalten und Formeln
rem-----------------------------------------------------------------------------------------------------------------------------------------------

Call SQL


	oStatement = oCon.createStatement()
    oResult = oStatement.executeQuery(SkontoDatum)
    
    	IF NOT ISNULL(oResult) THEN
			
			Do while oResult.Next
	       	SkontoD = oResult.getString(1)
           	Loop
         	
		End If	


      oPrepStatement = oCon.prepareCommand(Skonto,2)
      oResult = oPrepStatement.executeQuery
      aColumns = oPrepStatement.Columns.ElementNames
      nColumnCount = UBound(aColumns)
      ReDim aLine(nColumnCount)
      ReDim aData(0)
      aData(0) = aColumns
      nUpperBoundary = 0
      Do While oResult.Next()
      nUpperBoundary = UBound(aData)+1
         
         ReDim Preserve aData(nUpperBoundary)
         
         			s = oResult.getString(1)
        	   	   	RabattWert = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+1,10+nUpperBoundary)
        	   	   	RabattWert.Value = s

		Loop
					Ueberschrift = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+1,9)
					'Ueberschrift.String = "Skonto (Bei Voraus-" & chr(13) & "zahlung bis zum " & chr(13) & SkontoD & ")"
					Ueberschrift.String = "Skonto*" & chr(13) & "(" & SkontoD & ")"
					Ueberschrift.isTextWrapped = TRUE
					Prozentsatz = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+1,10)
				   	Prozentsatz.Value = s
			   	   	Prozentsatz.NumberFormat = 11
			   	   	Ueberschrift = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+2,9)
					Ueberschrift.String = "Rechnungs- netto"
					Ueberschrift.isTextWrapped = TRUE


		For i = 1 to Positionen
	
				
		mycell = oSheet.getCellByPosition(LetzteSpalte,11)
		oColumn = mycell.getColumns.getByIndex(0).getName()
		cellname = oColumn
		FuerTKP = cellname
		mycell = oSheet.getCellByPosition(LetzteSpalte+1,11)
		oColumn = mycell.getColumns.getByIndex(0).getName()
		cellname2 = oColumn
		mycell = oSheet.getCellByPosition(LetzteSpalte,11)
		oColumn = mycell.getColumns.getByIndex(0).getName()
		cellname3 = oColumn

				
		myCell = oSheet.getCellByPosition(LetzteSpalte+1,10+i)
     	myValue = mycell.Value
	
	   		RabattFormel = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+1,10+i)
        
        	If MyValue = 0 Then
        		
           		RabattFormel.Value = 0
	       		RabattFormel.NumberFormat = 107
			
			Else
        	
        		RabattFormel.FormulaLocal = "=" & cellname & i+11 & "*" & cellname2 & "11"
				RabattFormel.NumberFormat = 107
				
			End If
			
			
		RabattSummen = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+2,10+i)
		RabattSummen.FormulaLocal = "=" & cellname3 & i+11 & "-" & cellname2 & i+11
		RabattSummen.NumberFormat = 107
		
			Next i

		mycell = oSheet.getCellByPosition(LetzteSpalte+2,11)
		oColumn = mycell.getColumns.getByIndex(0).getName()
		RechNett = oColumn
		

Call SummenFormeln
End Sub 

Re: Kein Zugriff auf Objekt. Falsche Verwendung des Objektes

Verfasst: Mi, 11.05.2011 13:57
von balu
Hallo

bin ja selbst noch Makro-Anfänger, aber dennoch möcht ich dir antworten. Zumal mir da noch ein paar Dinge aufgefallen sind.
kommt der Fehler "Kein Zugriff auf Objekt. Falsche Verwendung des Objektes"

[...]

RabattFormel = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+1,10+i) Hier war der Fehler bei der Variablen LetzteSpalte
Und wie lautete der Fehler denn jetzt genau?
Und wie kommst Du darauf das es die Variable betrifft?

Zur sicherheit würde ich dir aber empfehlen, Variablen am Makroanfang zu deklarieren. Hatte nämlich selber vor kurzem das Problem, dass eine Datei hier bei mir unter OOo 3.2.1 fehlerfrei lief, jedoch aber unter OOo 3.3.0 nicht. Der Grund war schnell gefunden. Variablen a, b und c waren nicht deklariert. Und nachdem ich sie deklariert hatte, gabs keine Probleme mehr.

Der Makroanfang sah dann wie folgt aus.

Code: Alles auswählen

Sub ...
Dim a as object
Dim b as object
Dim c as object
Und in diesem deinem Falle würde ich vorschlagen.

Code: Alles auswählen

Dim LetzteSpalte as Integer
Meine Erfahrung diesbezüglich war: OOo 3.3.0 nimmt es sehr genau mit der Variablendeklaration. Und wenn da eine fehlt, kann es schon mal zu Problemen kommen. Auch wenn Du unter der eben genannten Version programmiert hast, so solltest Du auf die Variablendeklaration achten.

Code: Alles auswählen

oDoc.sheets.getByName("Angebot")
Wie oft willst Du denn das noch schreiben?
Ich sage es mal so.
Mehr als 2 mal, dann komprimieren. Und zwar gehst Du am besten so vor.

Code: Alles auswählen

Sub blablabla
Dim oBlattAngebot as Object
oBlattAngebot = oDoc.sheets.getByName("Angebot")
Dann sehen deine Codezeilen beispielsweise nicht mehr so aus

Code: Alles auswählen

RabattUeberschrift = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+nUpperBoundary,9)
RabattFormel = oDoc.sheets.getByName("Angebot").getCellByPosition(LetzteSpalte+1,10+i)
sondern so.

Code: Alles auswählen

RabattUeberschrift = oBlattAngebot.getCellByPosition(LetzteSpalte+nUpperBoundary,9)
RabattFormel = oBlattAngebot.getCellByPosition(LetzteSpalte+1,10+i)
Ich find das sieht etwas übersichtlicher aus.

Code: Alles auswählen

RabattFormel.FormulaLocal = "=" & cellname2 & i+11 & "*" & cellname & ""
RabattFormel.NumberFormat = 107 
Wäre es nicht vielleicht sinnvoler erst das Zellformat (NumberFormat) zu setzen, und dann die Formel eintragen? Ist nur mal so eine Überlegung. Und außerdem bin ich wirklich am Grübeln ob es auf die Reihenfolge drauf ankommt.

Code: Alles auswählen

LetzteSpalte = LetzteSpalte+2
mycolumns = oSheet.getcolumns
mycolumns.insertbyindex(LetzteSpalte,1)
Ist das wirklich so gut?
Was hälst Du denn von folgendem?

Code: Alles auswählen

mycolumns = oSheet.getcolumns
mycolumns.insertbyindex(LetzteSpalte+2,1)

Code: Alles auswählen

mycell = oSheet.getCellByPosition(LetzteSpalte,11)
oColumn = mycell.getColumns.getByIndex(0).getName()
cellname = oColumn
FuerTKP = cellname
mycell = oSheet.getCellByPosition(LetzteSpalte+1,11)
oColumn = mycell.getColumns.getByIndex(0).getName()
cellname2 = oColumn
mycell = oSheet.getCellByPosition(LetzteSpalte,11)
oColumn = mycell.getColumns.getByIndex(0).getName()
cellname3 = oColumn
Diese Zeilen hast Du ja auch mehr als einmal. Auch das würd ich vereinfachen und übersichtlicher machen.

Das an den Makroanfang.

Code: Alles auswählen

Dim mycell1 as Object
Dim mycell2 as Object
Dim mycell3 as Object
Dim oColumn1 as Object
Dim oColumn2 as Object
Dim oColumn3 as Object
mycell1 = oSheet.getCellByPosition(LetzteSpalte,11)
mycell2 = oSheet.getCellByPosition(LetzteSpalte+1,11)
mycell3 = oSheet.getCellByPosition(LetzteSpalte,11)
oColumn1 = mycell1.getColumns.getByIndex(0).getName()
oColumn2 = mycell2.getColumns.getByIndex(0).getName()
oColumn3 = mycell3.getColumns.getByIndex(0).getName()
Und dann dort wo Du es brauchst nur noch das.

Code: Alles auswählen

cellname = oColumn1
FuerTKP = cellname
cellname2 = oColumn2
cellname3 = oColumn3
Das sind nur einfache Vorschläge meinerseits, die sich vielleicht auch noch verbessern ließen.
Hier hast du mal einen Auszug des Codes (Der ganze ist noch mal 5 mal so lang.)
Hast Du das auf mehrere Module aufgeteilt? Soll nämlich besser sein, und außerdem erhöht es die Übersichtlichkeit.


Ach ja, noch eins.

Code: Alles auswählen

Call SummenFormeln
Es reicht ganz einfach: SummenFormeln
Das Call brauchst Du nicht, ist überflüssig.



Gruß
balu