Hello all,

I have been trying to add support for assigning to named ranges in
VBA. There are a couple of ways VBA does this but for now I'm focusing
on something like:

Range("A1:H8").Name = "TestRange"

Currently the Name property on [X/ScVba]Range is readonly. I've
attached a patch which is my first attempt to try and add a setter but
it was suggested that I also attach an xls with a test macro. I know
there is some changing going on with regards to VBA tests; is there a
place I should stick this to execute for now? I would also really
appreciate someone taking a quick look at the patch because I'm very
new to working with uno.

Thanks Michael and Markus for helping me out so much on IRC :)

August Sodora
aug...@gmail.com
(201) 280-8138
From 1f51f50dda79d2db9430aa52e233ce0b56cd1268 Mon Sep 17 00:00:00 2001
From: August Sodora <aug...@gmail.com>
Date: Wed, 26 Oct 2011 15:32:55 -0400
Subject: [PATCH] Add vba support for assigning names to cell ranges

---
 oovbaapi/ooo/vba/excel/XRange.idl |    2 +-
 sc/source/ui/vba/vbarange.cxx     |   23 +++++++++++++++++++++++
 sc/source/ui/vba/vbarange.hxx     |    1 +
 3 files changed, 25 insertions(+), 1 deletions(-)

diff --git a/oovbaapi/ooo/vba/excel/XRange.idl b/oovbaapi/ooo/vba/excel/XRange.idl
index 62a0994..015c68c 100644
--- a/oovbaapi/ooo/vba/excel/XRange.idl
+++ b/oovbaapi/ooo/vba/excel/XRange.idl
@@ -64,7 +64,7 @@ interface XRange
     interface ::ooo::vba::excel::XFormat;
     //interface ::ooo::vba::XHelperInterface;
 
-    [attribute, readonly] any Name;
+    [attribute] any Name;
     [attribute] any Value;
     [attribute] any Formula;
     [attribute] any FormulaArray;
diff --git a/sc/source/ui/vba/vbarange.cxx b/sc/source/ui/vba/vbarange.cxx
index fe8c9df..659bff8 100644
--- a/sc/source/ui/vba/vbarange.cxx
+++ b/sc/source/ui/vba/vbarange.cxx
@@ -1569,6 +1569,29 @@ uno::Any SAL_CALL ScVbaRange::getName() throw (uno::RuntimeException)
     return uno::makeAny( xName );
 }
 
+void
+ScVbaRange::setName( const uno::Any& aName ) throw (uno::RuntimeException)
+{
+    uno::Reference< excel::XName > xName;
+
+    ScDocShell* pDocShell = getScDocShell();
+    uno::Reference< frame::XModel > xModel = pDocShell ? pDocShell->GetModel() : NULL;
+    if ( !xModel.is() )
+    {
+        throw uno::RuntimeException( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "Invalid document" )), uno::Reference< uno::XInterface >() );
+    }
+    uno::Reference< beans::XPropertySet > xPropertySet( xModel, uno::UNO_QUERY_THROW );
+    uno::Reference< sheet::XNamedRanges > xNamedRanges( xPropertySet->getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NamedRanges"))) , uno::UNO_QUERY_THROW );
+
+    uno::Reference< excel::XNames > xNames( new ScVbaNames( uno::Reference< XHelperInterface >(), mxContext , xNamedRanges , xModel ) );
+
+    uno::Any aDummy;
+    //uno::Any aRefersTo;
+    //    aRefersTo <<= uno::Reference< excel::XRange >(this, uno::UNO_QUERY);
+    xNames->Add(aName, getCellRange(), aDummy, aDummy, aDummy, aDummy,
+                aDummy, aDummy, aDummy, aDummy, aDummy);
+}
+
 uno::Any
 ScVbaRange::getValue( ValueGetter& valueGetter) throw (uno::RuntimeException)
 {
diff --git a/sc/source/ui/vba/vbarange.hxx b/sc/source/ui/vba/vbarange.hxx
index db4e49d..26f639f 100644
--- a/sc/source/ui/vba/vbarange.hxx
+++ b/sc/source/ui/vba/vbarange.hxx
@@ -167,6 +167,7 @@ public:
 
     // Attributes
     virtual css::uno::Any SAL_CALL getName() throw (css::uno::RuntimeException);
+    virtual void   SAL_CALL setName( const css::uno::Any& aName ) throw (css::uno::RuntimeException);
     virtual css::uno::Any SAL_CALL getValue() throw (css::uno::RuntimeException);
     virtual void   SAL_CALL setValue( const css::uno::Any& aValue ) throw ( css::uno::RuntimeException);
     virtual css::uno::Any SAL_CALL getFormula() throw (css::uno::RuntimeException);
-- 
1.7.4.4

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to