On Mon, Sep 04, 2006 at 01:44:49PM +0200, Andreas Saeger wrote:
> Armin Barth wrote:
> >On Sun, Sep 03, 2006 at 11:39:29PM +0200, Andreas Saeger wrote:
> >Danke Andreas für die Schnelle Antwort.
> >Ein paar Fragen habe ich jedoch noch.
> >
> >[...]
> >Wo muss ich diese SELECT-Anweiseung eintragen?
> >
>
> Im Kontextmenü der Datenquelle:"Bearbeiten ..."
> odb-Dokument wird geöffnet.
> Abfrage erstellen.
o.k. -- kein Problem
>
> >
> >Hiermit (=VERSCHIEBUNG) bin ich noch am testen. Ich melde mich dazu noch
> >einmal.
> >
> Sorry, mein Fehler.Es sollte heißen
> =VERSCHIEBUNG(Lieferanten;1;0;ZEILEN(Lieferanten)-1;1)
Hierbei kommt immer der Fehler 504.
> Die Formel gibt Lieferanten ohne Kopfzeile als Matrix (mehr als ein
> Wert) zurück. Extras>Zellinhalte>"Automatische Berechnung" eingeschalten
> und die Formel mit Strg+Shift+Enter eingegeben.
>
> >Ein Makro wäre nicht schlecht.
> >
> Schön, vergiss das mit der VERSCHIEBUNG und kopiere dieses Makro in das
> Dokument, wobei die Helferlein "getRangeFromAddress" und "getRangeName"
> evtl. in die globale Standard-Bibliothek gehören, weil sie zu vielen
> anderen denkbaren Calc-Makros eine sinnvolle Ergänzung sein können.
> "CopyDBRg2valList" ist wohl eher spezifisch für das Dokument.
> Es aktualisiert den Datenbankbereich, kopiert den neuen Datenbankbereich
> (ohne die Kopfzeile) zu einem benannten Bereich(löscht vorher dessen
> Inhalte) und ändert den Bezug des benannten Bereichs.
> Eigentlich müssen nur die beiden Konstanten am Anfang angepasst werden.
> Vorsicht mit den Zeilenumbrüchen, wenn dies aus einem Mailprogramm
> kopiert wird.
> REM ***** BASIC *****
> Option Explicit
> Sub CopyDBRg2valList
> REM Diese zwei Konstanten anpassen:
> 'Name des importierten Datenbankbereichs
> Const dbRange = "Lieferanten"
muss hier nur der Tabellenname hin oder der kompltte Name mit Datenbank
z.b. "meinedb:lieferanten" ?
> 'Validierungsliste ohne Kopfzeile (benannter Bereich Strg+F3)
> Const Validation = "valList"
Erklär mal bitte "Validierungsliste"
Ist das das Ergebis meiner SELECT... Abfrage?
> Dim oDB,oNamed,lFlags&,oSrc,oTgt,oAdr,sNewAdr$,oNewRg
> REM Neuen Datenbankbereich holen ("Zellen einfügen/löschen" sollte
> gesetzt sein)
> oDB = thisComponent.DatabaseRanges.getByName(dbRange)
Hier bleibt das Makro hängen mit der Fehlerausschrift
BASIC-Laufzeitfehler. Es ist eine Exception aufgetreten.
Typ: com.sun.star.container.NoSuchElementExeption
Message:.
> oDB.refresh
> oSrc = oDB.getDataArea
> REM ohne Kopfzeile:
> oSrc.StartRow = oSrc.StartRow +1
> REM Zielbereich vorbereiten
> oNamed = thisComponent.NamedRanges.getByName(Validation)
> With com.sun.star.sheet.CellFlags
> lFlags = .VALUE + .STRING + .FORMULA
> End With
> With oNamed.getReferredCells
> .clearContents(lFLags)
> oAdr = .getRangeAddress
> oTgt = .getCellByPosition(0,0).getCellAddress
> End With
> REM kopiere Datenbankbereich ohne Kopfzeile zur ersten Zelle der
> Validierungsliste
> thisComponent.getSheets.getByIndex(oSrc.Sheet).copyRange(oTgt,oSrc)
> REM Ändere die Adress-Struktur der Validierungsliste:
> oAdr.EndColumn = oAdr.StartColumn + oSrc.EndColumn - oSrc.StartColumn
> oAdr.EndRow = oAdr.StartRow + oSrc.EndRow - oSrc.StartRow
> REM ... und hier beginnt der API-Stress, wenn man nicht geeignete
> Funktionen in Petto hat:
> REM Hole den Bereich zur Adress-Struktur:
> oNewRg = getRangeFromAddress(thisComponent,oAdr)
> REM Hole die String-Adresse des Bereichs:
> sNewAdr = getRangeName(oNewRg,63)
> REM setzte die String-Adresse als Inhalt des benannten Bereichs:
> oNamed.setContent(sNewAdr)
> End Sub
> REM ------------Kopiert aus meiner Standard-Bibliothek----------------
> 'pass a spreadsheet-document or sheet. the latter ignores the sheet-part of
> the address
> 'return empty if oAddr out of bounds
> Function getRangeFromAddress(oObj,oAddr as
> com.sun.star.table.CellRangeAddress)
> Dim oSheet
> If oObj.supportsService("com.sun.star.sheet.SpreadsheetDocument")
> then
> oSheet = oObj.getSheets.getByIndex(oAddr.Sheet)
> else
> oSheet = oObj
> endif
> on error resume next
> getRangeFromAddress =
> oSheet.getCellRangeByPosition(oAddr.StartColumn,oAddr.StartRow,oAddr.EndColumn,oAddr.EndRow)
> End Function
> 'returns: any variant of string-address (eg.
> A1:B5,sheet.A1:B5,$sheet.A1:B5,sheet.$A1:$B5,...,$sheet.$A$1:$B$5)
> 'takes a spreasheet-doc, a range and optional flags(default returns
> relative A1:B5 without sheet name)
> Function getRangeName(oRg,Optional iFlag%)as string
> on error goto exitErr
> const iSh% = 1
> const iShAbs% = 2
> const iC1% = 4
> const iR1% = 8
> const iC2% = 16
> const iR2% = 32
> Dim oAddr, oSh
> dim s$,sSh$,sC1$,sC2$,sR1$,sR2$,bR1 as boolean,bC2 as boolean,bR2 as
> boolean
> oAddr = oRg.getRangeAddress
> oSh = oRg.getSpreadSheet
> sSh = oSh.getName
> sC1 = oSh.Columns.getByIndex(oAddr.StartColumn).getName
> sC2 = oSh.Columns.getByIndex(oAddr.EndColumn).getName
> sR1 = cStr(oAddr.StartRow +1)
> sR2 = cStr(oAddr.EndRow +1)
> if not isMissing(iFlag) then
> if iFlag AND iSh then
> if (iFlag AND iShAbs)=iShAbs then s = "$"
> s = s & sSh &"."
> end if
> if iFlag AND iC1 then s = s &"$"
> bR1 = iFlag AND iR1
> bC2 = iFlag AND iC2
> bR2 = iFlag AND iR2
> end if
> s = s & sC1
> If bR1 then s = s & "$"
> s = s & sR1
> If NOT(oRg.supportsService("com.sun.star.sheet.SheetCell")) then
> s = s &":"
> if bC2 then s = s & "$"
> s = s & sC2
> if bR2 then s = s &"$"
> s = s & sR2
> endif
> getRangeName = s
> exitErr:
> end function
>
Gruß
Armin
--
[EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]