Fehler bei Funktionsaufruf "Argument nicht optional"

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

Moderator: Moderatoren

nobijohn
*
Beiträge: 19
Registriert: Do, 30.05.2024 00:30

Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von nobijohn »

Hallo zusammen,
um eine größere importierte Tabelle in der eigenen Struktur konsistent benutzbar zu machen werden etliche Anpassungen (Doppel entfernen, Leerzeilen aus- und einbauen, etc.) Dies ist teils in Basic, teils mit Uno gemacht und funktioniert.
Dabei entstehen Arrays in die Rechenfunktionen eingebaut werden. Soweit kein Problem...
Allerdings werden auch Summenformeln benötigt. Hiebei scheitere ich an den CellNames die für die Formeln notwendig sind. Mit CellAdress kann ich umgehen brauch aber die SpaltenNamen.
Habe das mit .CellAdressConversation (s.U.) probiert, macht aber gar nichts, nicht einmal einen Fehler.
Dann habe ich mir die Function AdressString etwas modifiziert abgeschrieben.
Die Function ist gespeichert. Beim Aufruf kommt allerdings der Fehler "Argument nicht optional", die Zeile s=Chr$((.... ist markiert...
Bitte um verständliche Hilfe, habe nicht wirklich viel Ahnung. Etliche Stunden gebastelt, weiß nicht mehr weiter...
Danke schon mal vorab.

Function AdressString(oCol as long, oRow)
Dim s$
Do
s = Chr$((oCol Mod 26) + 65) & s
oCol = oCol \ 26 - 1
Loop Until oCol = -1
If bWithSheet Then
AdressString = s & CStr(oRow + 1)
End If
End Function

'' Das folgende macht einfach überhaupt nichts
' Dim oConv
' oConv = ThisComponent.createInstance("com.sun.star.table.CellAdressConversation")
' oCelle=mySheet.getCellByPosition(ocolumn + 1,startSum)
' oConv.Adress = oCelle.getCellAdress ()
' startCell = oConv.UserInterfaceRepresentation
'MsgBox startcell
' oCelle=mySheet.getCellByPosition(ocolumn + 1,endSum)
' oConv.Adress = oCelle.getCellAdress ()
' endCell = oConv.UserInterfaceRepresentation
'MsgBox endCell

'......
startRow = oRow
oCelle=mySheet.getCellByPosition(ocolumn,orow)
'MsgBox startRow
myView.Select(oCelle)

dim args13(1) as new com.sun.star.beans.PropertyValue 'Nur zum testen
args13(0).Name = "By"
args13(0).Value = 1
args13(1).Name = "Sel"
args13(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoRightToEndOfData", "", 0, args13())
oCelle=mySheet.getCellByPosition(ocolumn,orow)
startSum = oRow

dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Sel"
args1(0).Value = false
dispatcher.executeDispatch(document, ".uno:GoDownToEndOfData", "", 0, args1())
oCelle=mySheet.getCellByPosition(ocolumn,orow)
endSum = oRow

oCol = oColumn

AdressString()

MsgBox AdressString
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von Karolus »

Hallo
Vergiss den Müll, und beschreibe/zeige einfach um was es eigentlich geht!

Code: Alles auswählen

function col_name( col_index )
   with ThisComponent.Sheets(0)
      col_name = .Columns( col_index ).Name
   end with
end function

sub main
    print(col_name( 24 ) )
end sub


LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
nobijohn
*
Beiträge: 19
Registriert: Do, 30.05.2024 00:30

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von nobijohn »

Vielen Dank für den Code. Macht genau was ich brauche, allerdings nur in vitro. Vermute dass ich mangels Kompetenz nicht den Bezug auf meine Tabelle hinkrieg. Funktion ist eingebaut. Beim Funktionsaufruf kommt der Fehler wie gehabt.
ScrColName.PNG
ScrColName.PNG (13.48 KiB) 20378 mal betrachtet
mikeleb
*******
Beiträge: 1400
Registriert: Fr, 09.12.2011 16:50

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von mikeleb »

Hallo,
Im konkreten Beispiel kannst du die function nicht direkt starten, sondern die sub "main". Woher sollte die die function sonst wissen, welchen Wert col_index hat.
Gruß,
mikeleb
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von Karolus »

Hallo
Aufruf der Funktion direkt:
run_col_name.png
run_col_name.png (29.81 KiB) 20227 mal betrachtet
Aufruf indirekt via main:
run_main.png
run_main.png (25.01 KiB) 20227 mal betrachtet
Du solltest IMHO aber ein paar Schritte zurückgehen und deine eigentliche Aufgabenstellung beschreiben, anstatt nach einer Lösung für ein Teilproblem zu fragen, das du gar nicht hättest …
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
nobijohn
*
Beiträge: 19
Registriert: Do, 30.05.2024 00:30

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von nobijohn »

Danke für eure Antworten,
@mikeleb: gerade das funktioniert bei mir nicht. Die Funktion befindet sich in Meine Makros\Standard\Module_Funktion und sollte laut Hilfe allen Makros zugänglich sein, zumindest auf diesem Rechner. Aber beim Funktionsaufruf kommt der o.g. Fehler.
@Karolus: Das Makro richtet die Tabelle so wie sie gebraucht wird. Hinter jedem Kunden entsteht ein Array um monatliche Zahlen zu ermitteln. Dazu wird vom Makro eine Universalformel in eine Helferzelle geschrieben und später in die Arrays kopiert. [oCelle.formulaLocal = "=WENN(UND(JAHR($K2)=AW$1;MONAT($K2)=AW$2);$L2*$N2;"")"]
Über jedem Array soll die Spaltensumme stehen. Für die Summenformel brauch ich die Abfangs- und Endzeile sowie den col_name.
Hier der Abschnitt:

myDoc = thisComponent
mySheet = myDoc.sheets(0)
myView = myDoc.CurrentController

oCelle=myDoc.getCurrentSelection().getCellAddress()
oRow=oCelle.Row
oColumn=oCelle.column
oCelle=mySheet.getCellByPosition(ocolumn,orow)
ActKdNr = oCelle.value

'MsgBox ActKdNr

Dim EOF as integer 'Nur zum testen!
EOF = 15 'Nur zum testen!
Do While oRow < EOF
oRow = oRow + 1
oCelle=mySheet.getCellByPosition(ocolumn,orow)
NextKdNr = oCelle.value
Do While NextKdNr = 0
oRow = oRow + 1
oCelle=mySheet.getCellByPosition(ocolumn,orow)
NextKdNr = oCelle.value
'MsgBox NextKdNr
Loop

startRow = oRow
oCelle=mySheet.getCellByPosition(ocolumn,orow)
'MsgBox startRow
myView.Select(oCelle)

dim args13(1) as new com.sun.star.beans.PropertyValue 'Nur zum testen
args13(0).Name = "By"
args13(0).Value = 1
args13(1).Name = "Sel"
args13(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoRightToEndOfData", "", 0, args13())
oCelle=mySheet.getCellByPosition(ocolumn,orow)
startSum = oRow

dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Sel"
args1(0).Value = false
dispatcher.executeDispatch(document, ".uno:GoDownToEndOfData", "", 0, args1())
oCelle=mySheet.getCellByPosition(ocolumn,orow)
endSum = oRow

oCol = oColumn

col_name (oCol)

MsgBox col_name

Loop
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von Karolus »

Hallo

Die ersten 7 Zeilen deines gezeigten Codes kann man schlicht durch:

Code: Alles auswählen

doc = thisComponent
sheet =  doc.sheets(0)
cell = doc.getCurrentSelection()
ActKdNr =  cell.Value 
ersetzen …ohne zuerst die »Koordinaten« der aktuell selektierten Zelle zu ermitteln, um dann über die »Koordinaten« wieder auf diese Zelle zuzugreifen.
wie du siehst gehts auch ohne sinnfreie Prefixe wie my … o
Die Kundennummern würde ich nicht als numerische Werte festhalten sondern als Text, genauso wie Postleitzahlen oder Telefonnummern

Aus dem Rest deines zusammengeklaubten Wurstelcodes kann ich beim besten Willen nicht auf die konkrete Tabellenstruktur zurückschliessen, um einen passenden Lösungsansatz zu entwerfen.
Es braucht hier einfach ein Beispielsdokument ( mit anonymen Kundendaten) aus dem klar hervorgeht was da eigentlich gemacht werden soll
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
mikeleb
*******
Beiträge: 1400
Registriert: Fr, 09.12.2011 16:50

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von mikeleb »

Hallo,
Die Funktion befindet sich in Meine Makros\Standard\Module_Funktion und sollte laut Hilfe allen Makros zugänglich sein, zumindest auf diesem Rechner. Aber beim Funktionsaufruf kommt der o.g. Fehler.
Wie rufst du denn die Funktion auf?
Ich habe es so nachgebaut:
function col_name in Meine Makros\Standard\Module_Funktion
Aufruf über sub main (im Dokument)
funktioniert.
Gruß,
mikeleb
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von Karolus »

etwas offtopic:

Die Funktion »col_name« in rekursiv:

Code: Alles auswählen

'# basic '
function col_name(i)
    if i < 26 then
        col_name = chr( i + 65 )
        exit function
    end if
    r = i mod 26
    i = i \ 26 -1
    col_name = col_name( i ) & chr( r + 65 )
end function

'###################'

# python:
def col_name(i):
    if i < 26:
        return f"{i+65:c}"
    i, r = divmod(i, 26)
    return f"{col_name(i-1)}{r+65:c}"
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
nobijohn
*
Beiträge: 19
Registriert: Do, 30.05.2024 00:30

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von nobijohn »

@mikeleb: So gehts bei mir auch. Nur nicht in meinem Makro. Der Aufruf steht in der drittletzten Zeile von meinem peposteten Codegebastel.
@Karolus: Wenn du dir das antun willst...
Das gelieferte xlsx wird ins die AOOCalc Tabelle kopiert (Soll auch später automatisiert werden.)
Wenn CheckDS ausgeführt wird geschieht folgendes:
eventuelle ' werden entfernt. (KdNr soll numerisch sein)
Tabelle wird überprüft ob Zeile 1 -4 so sind wie erwartet und in Zeile 5 die erste KdNr steht.
Leerzeilen 2 u. 4 werden entfernt
EOF letzte Zeile wird ermittelt
Headlines (Jahr, Monat) über den späteren Arrays schreiben. (Hier sollte 2024 dynamisch werden damit das Ding nächstes Jahr noch geht)
Formeln in die Helferzellen schreiben. !!! Hier fällt auf dass das Makro ein " zu wenig und eine Klammer zuviel schreibt ???? Größeres Problem?
Dann werden über der KdNr 2 Leerzeilen eingefügt und die Doppeleinträge darunter entfernt. Für alle KdNr's
Jetzt werden startRow und endRow für die Summenformeln ermittelt. Bis hier funktioniert das Gebastel.
Und jetzt brauchts die colNames...
Damit wäre das Ding eigentlich fast fertig...........
Das Makro wird einmal pro Monat zum Update gebraucht (Update automatisieren und auf integrität prüfen: Nächste Baustelle)
Dein offtopic Beitrag ist noch nicht ganz verstanden, werde mich aber damit beschäftigen wenn das Ding hier fertig ist
Dateianhänge
KdArtStat_soll.ods
(27.23 KiB) 214-mal heruntergeladen
KdArtStat_ist.ods
(18.52 KiB) 200-mal heruntergeladen
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von Karolus »

Hallo

Kaum hat man aus der »IST«tabelle alle sinnlosen Leerzeichen in den nur scheinbar leeren Zellen entfernt, bekommt man mit ein paar Mausklicks und Mausschubserei eine wunderhübsche Pivottabelle die IMHO wesentlich besser die Daten zusammengefasst darstellt als deine Versuche…
Kd_stat_per_pivot_gruppiert_nach_jahren_und_Monaten.ods
(32.6 KiB) 208-mal heruntergeladen
mit nachträglich noch einer berechnete Gesamtspalte mit »Menge x Einzelpreis«
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
nobijohn
*
Beiträge: 19
Registriert: Do, 30.05.2024 00:30

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von nobijohn »

Hallo Karolus, dein Ansatz ist gut gemeint hilft mir aber nicht weiter. Mit ein paar Mausclicks eine Tabelle schön zu machen kann ich schon, ist aber nicht Gegenstand meiner Aufgabe.
Ich will nicht rumlabern aber hier ein paar Infos: Meine erste TBC war Quattro Pro unter Win 3.11. Das war 1993. Habe damals mit Makros experimentiert, allerdings mangels Dokumentation aufgegeben. Seit ein paar Jahren benutze ich AOO Calc. Ich bin kein Progammierer und außer ein Bissl Kenntnisse in VB6 ist nicht viel da.
Das aktuelle Projekt mache ich um meine LGin bei ihrem lausigen Aussendienstjob zu helfen. Da sie mit Ctrl C und Ctrl V bereits ihre Probleme hat muss das Dokument möglichst "unkaputtbar" sein. Es gibt ein xlsx mit Kundendaten (KdNr.,Adr., Tel, Fax) ca.1000 Zeilen. Und ein xlsx mit Verkaufszahlen (KdNr., Art, Stk., Dat.) Das kommt monatlich und muss später ohne mein Eingreifen als Update rein. Die Zahlen sind wichtig um die fälligen Kontakte zu planen. Alle Änderungen der Kundendaten werden via Tabelleneintrag im Table Kundendetails via MakroButton erledigt. Ansonsten bleibt das Dokument zu jeder Zeit geschützt.
Falls du zur Veranschaulichung ein KomlettDummy brauchst mach ich noch eins.

Die Aufbereitung der KdArtStat ist zu 98,5% fertig und scheitert nur and der Funktion colName! Bitte hilf mir da!!!!!

Ebenso muss das Problem gelöst werden dass das Makro beim Schreiben der Rechenfunktionen statt des letzten " eine ) schreibt. S.o.

Wäre wirklich dankbar für zielführende Unterstützung!
nobijohn
*
Beiträge: 19
Registriert: Do, 30.05.2024 00:30

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von nobijohn »

Hallo zusammen, das Problem Funktionsaufruf ist zwar nicht gelöst aber etwas entschäft. Für die cellNames zumindest bis AZ habe ich ein Workarond gebastel. Hätte ich auch mal früher draufkommen können:
Dim oColString as String
if oCol < 26 Then
oColValue = oCol + 65
oColString = chr (oColValue)
else If oCol > 25 <64 Then
oColValue = oCol + 39
oColString = "A" & chr (oColValue)
end If
end If

Ungelöst aber wichtig: Wenn das Makro die Formel oCelle.formulaLocal = "=WENN(UND(JAHR($K2)=AW$1;MONAT($K2)=AW$2);$L2*$N2;"")" schreibt wird das letzte " offensichtlich durch ) ersetzt. Das geschieht auch bei anderen Formeln. Das darf keinesfalls sein.
Weiß jemand wie man das abstellt?
Karolus
********
Beiträge: 7517
Registriert: Mo, 02.01.2006 19:48

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von Karolus »

Hallo
Deine Funktion »ColString« ist jetzt komplett kaputt, das hattest du schon besser gemacht in deinem Ausgangsbeitrag.

Die Quotes innerhalb müssen verdoppelt werden, wenn du also »""« möchtestet musst du an der Stelle »""""« schreiben.

Code: Alles auswählen

 …  "=WENN(UND(JAHR($K2)=AW$1;MONAT($K2)=AW$2);$L2*$N2; """" )"
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
mikeleb
*******
Beiträge: 1400
Registriert: Fr, 09.12.2011 16:50

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

Beitrag von mikeleb »

Hallo,
das Problem Funktionsaufruf ist zwar nicht gelöst
Ich habe mir den ursprünglichen Code noch einmal angesehen.

Code: Alles auswählen

Function AdressString(oCol as long, oRow)
...
End Function
Die Funktion erwatrtet also zwei Argumente.
Der Aufruf erfolgt dann aber nur über

Code: Alles auswählen

AdressString()
Es fehlen also die erwarteten Argumente.
Gruß,
mikeleb
Antworten