Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


Yet again, I seem to have sent my reply directly to the original
poster, sorry again (and again and again…).

Here's my reply that I wrote yesterday (2013-02-07), except that I'll
do some minor corrections before sending it this time:

---------- Forwarded message ----------
From: Johnny Rosenberg <gurus.knugum@gmail.com>
Date: 2013/2/7
Subject: Re: [libreoffice-users] Macro to write a formula
To: "T. R. Valentine" <trvalentine@gmail.com>


2013/2/7 T. R. Valentine <trvalentine@gmail.com>:
Is it possible?

If so, coiuld I get a simple example, something like =TODAY() to go
into the (currently) selected cell? I figure I can probably get it
from there.

If you have a cell object (for instance
oCell=ThisComponent.getSheets().getByIndex(0).getCellByPosition(0,0)
or something like that), there is a method called setFormula().
This should work, I think:
oCell.setFormula("=TODAY()")

Of course there is a getFormula() method to get the current formula:
sMyFormula=oCell.getFormula()


If you didn't install xray, I'll suggest that you do. It's the best
tool that I know of to investigate variables, methods and more of an
object.
Using it, I just found that those methods mentioned are available for
cell selections too:

REM ***** BASIC *****

Option Explicit

Sub Main
    Dim oSelection As Object

    oSelection=ThisComponent.CurrentSelection
    oSelection.setFormula("=TODAY()")
End Sub


You can also create an array of arrays with many formulas and then
copy them to the spreadsheet all at once. This is much faster than
doing them cell by cell. The method for copying an array of arrays to
a cell range is called setFormulaArray().

It's, of course, important to get rows and columns right. Arrays of
arrays can be a bit tricky to work with. Here is a small function that
I use to transpose an array, which I use surprisingly often:
Function TransposeArray(A() As Variant) As Variant
    Dim oCalcFunction As Object

    oCalcFunction=createUnoService("com.sun.star.sheet.FunctionAccess")
    TransposeArray=oCalcFunction.callFunction("TRANSPOSE",Array(A()))
End Function


For instance, when you read a column with the getFormulaArray() method
(or similar, like getDataArray() for reading data from a cell range),
you always end up with an array of arrays that is hard to get data
from:

A=oSelection.getFormula()

As a result:
A(0)(0)=formula of A1
A(1)(0)=formula of A2
A(2)(0)=formula of A3
and so on.
But you can't do things like:
B=A(2)(0)
or
B=A(2,0)

If you transpose the array, however, you will have this:
A(0)(0)=formula of A1
A(0)(1)=formula of A2
A(0)(2)=formula of A3

Then you can just do:
A()=A(0)
and you will end up with this:
A(0)=formula of A1
A(1)=formula of A2
A(2)=formula of A3
which is something you can actually use…

After manipulating the array, you can then copy the result back to the
cell range again:
A()=Array(A())
TransposeArray
(A())
oSelection.setFormulaArray(A())

Well, something like that, anyway. I just typed that right now without
testing it.


Johnny Rosenberg

TIA.



--
T. R. Valentine
Your friends will argue with you. Your enemies don't care.
'When I get a little money I buy books; and if any is left I buy food
and clothes.' -- Erasmus

--
For unsubscribe instructions e-mail to: users+help@global.libreoffice.org
Problems? http://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/
Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
List archive: http://listarchives.libreoffice.org/global/users/
All messages sent to this list will be publicly archived and cannot be deleted

-- 
For unsubscribe instructions e-mail to: users+help@global.libreoffice.org
Problems? http://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/
Posting guidelines + more: http://wiki.documentfoundation.org/Netiquette
List archive: http://listarchives.libreoffice.org/global/users/
All messages sent to this list will be publicly archived and cannot be deleted

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.