Fehler bei Funktionsaufruf "Argument nicht optional"

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Fehler bei Funktionsaufruf "Argument nicht optional"

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von nobijohn » Do, 25.07.2024 14:39

Sorry Karolus. Deine Funktion funktioniert sehr gut. Hatte einen Schreibfehler drin.

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von Karolus » Mi, 24.07.2024 18:37

@Karolus: Deine Funktion liefert fälschlich A zurück.
Welche Funktion, wie, und mit welchen Argument rufst du die auf?
Aber ist auch egal… spiel weiter!

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von nobijohn » Mi, 24.07.2024 17:42

@mikeleb: Danke für den Hinweis.
@Karolus: Deine Funktion liefert fälschlich A zurück.

Hier mein bisheriges Ergebnis:
Die von mir pepostete Version funktioniert korrekt wenn man das If auskommentiert. Weiß jemand was es mit "bWithSheet" auf sich haben könnte?
Ich glaube nicht dass Pitonyak/Lenhardt 700 Seiten Stuss geschrieben haben. Google konnte mir nicht helfen.

sub main
Col = 123
Row = 4
print col_name(Col)
print AdressString(Col,Row)
print Colstring (Col)
end sub


Function AdressString(Col as long, Row)
Dim s$
Do
s = Chr$((Col Mod 26) + 65) & s
Col = Col \ 26 - 1
Loop Until Col = -1
'If bWithSheet Then 'Was bedeutet WithSheet???????????
AdressString = s & CStr(Row + 1)
'End If
End Function

function col_name( col_index ) '@Karolus: Das liefert A zurück!
with ThisComponent.Sheets(0)
col_name = .Columns( Col ).Name
end with
end function

Function ColString(Col as long )
Dim s$
Do
s = Chr$((Col Mod 26) + 65) & s
Col = Col \ 26 - 1
Loop Until Col = -1
'If bWithSheet Then
ColString = s
'End If
End Function

Und es geht auch ganz ohne Funktion:

Cell=Doc.getCurrentSelection().getCellAddress()
Row=Cell.Row
Col=Cell.column
Cell=Sheet.getCellByPosition(Col,Row)
Colname=Cell.getColumns.getByIndex(0).getName()
cellname=Colname+ltrim(str(Row+1))
startSum = Row
Print "Colname= "&Colname

Danke für eure Hilfe.

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von mikeleb » Fr, 19.07.2024 19:08

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.

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von Karolus » Fr, 19.07.2024 09:23

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; """" )"

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von nobijohn » Do, 18.07.2024 23:48

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?

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von nobijohn » Do, 18.07.2024 05:14

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!

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von Karolus » Mi, 17.07.2024 11:27

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«

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von nobijohn » Mi, 17.07.2024 00:11

@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

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von Karolus » Di, 16.07.2024 20:03

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}"

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von mikeleb » Di, 16.07.2024 11:30

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.

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von Karolus » Di, 16.07.2024 10:56

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

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von nobijohn » Mo, 15.07.2024 18:50

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

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von Karolus » Mo, 15.07.2024 07:06

Hallo
Aufruf der Funktion direkt:
run_col_name.png
run_col_name.png (29.81 KiB) 20229 mal betrachtet
Aufruf indirekt via main:
run_main.png
run_main.png (25.01 KiB) 20229 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 …

Re: Fehler bei Funktionsaufruf "Argument nicht optional"

von mikeleb » Mo, 15.07.2024 06:55

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.

Nach oben