summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Heinisch <andreas.heinisch@yahoo.de>2022-09-01 21:55:05 +0200
committerAndreas Heinisch <andreas.heinisch@yahoo.de>2022-09-06 11:31:42 +0200
commitf972f27b455ef78f0d5db5eea96edd707909a154 (patch)
treeb5feeba41935da178c59ae3b6508854a8954851f
parentf2d7f2a28c4334feed4a12eb1553b8d0563c0fc9 (diff)
tdf#118247 - Correctly handle xlCellTypeConstants parameter
Change-Id: I5cc281d6193bcf03d2da3c594d427ec340c2cfc1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/139239 Tested-by: Jenkins Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de>
-rwxr-xr-xsc/qa/extras/testdocuments/tdf118247.xlsmbin0 -> 7224 bytes
-rw-r--r--sc/qa/extras/vba-macro-test.cxx47
-rw-r--r--sc/source/ui/vba/vbarange.cxx23
3 files changed, 69 insertions, 1 deletions
diff --git a/sc/qa/extras/testdocuments/tdf118247.xlsm b/sc/qa/extras/testdocuments/tdf118247.xlsm
new file mode 100755
index 000000000000..73de66a0d423
--- /dev/null
+++ b/sc/qa/extras/testdocuments/tdf118247.xlsm
Binary files differ
diff --git a/sc/qa/extras/vba-macro-test.cxx b/sc/qa/extras/vba-macro-test.cxx
index 71c3b9033da1..24f8ddb996c6 100644
--- a/sc/qa/extras/vba-macro-test.cxx
+++ b/sc/qa/extras/vba-macro-test.cxx
@@ -29,7 +29,10 @@
#include <com/sun/star/ui/XUIConfigurationManager.hpp>
#include <com/sun/star/awt/KeyModifier.hpp>
+#include <ooo/vba/excel/XlSpecialCellsValue.hpp>
+
using namespace css;
+using namespace ooo::vba;
class VBAMacroTest : public UnoApiTest
{
@@ -71,6 +74,7 @@ public:
void testTdf107902();
void testTdf90278();
void testTdf149531();
+ void testTdf118247();
CPPUNIT_TEST_SUITE(VBAMacroTest);
CPPUNIT_TEST(testSimpleCopyAndPaste);
@@ -92,6 +96,7 @@ public:
CPPUNIT_TEST(testTdf107902);
CPPUNIT_TEST(testTdf90278);
CPPUNIT_TEST(testTdf149531);
+ CPPUNIT_TEST(testTdf118247);
CPPUNIT_TEST_SUITE_END();
};
@@ -928,6 +933,48 @@ void VBAMacroTest::testTdf149531()
pDocSh->DoClose();
}
+
+void VBAMacroTest::testTdf118247()
+{
+ OUString aFileName;
+ createFileURL(u"tdf118247.xlsm", aFileName);
+ auto xComponent = loadFromDesktop(aFileName, "com.sun.star.sheet.SpreadsheetDocument");
+
+ uno::Any aRet;
+ uno::Sequence<sal_Int16> aOutParamIndex;
+ uno::Sequence<uno::Any> aOutParam;
+ uno::Sequence<uno::Any> aParams;
+
+ SfxObjectShell::CallXScript(
+ xComponent,
+ "vnd.sun.Star.script:VBAProject.Module1.testXlSpecialCellsValuesConstantsEmpty?"
+ "language=Basic&location=document",
+ aParams, aRet, aOutParamIndex, aOutParam);
+
+ OUString aReturnValue;
+ aRet >>= aReturnValue;
+ CPPUNIT_ASSERT_EQUAL(OUString("$A$1:$A$3"), aReturnValue);
+
+ const std::vector<std::pair<sal_Int32, OUString>> aTestParams(
+ { { excel::XlSpecialCellsValue::xlNumbers, "$A$1:$A$2" },
+ { excel::XlSpecialCellsValue::xlTextValues, "$A$3" },
+ { excel::XlSpecialCellsValue::xlLogical, "$A$1:$A$2" },
+ { excel::XlSpecialCellsValue::xlErrors, "$A$1:$A$4" } });
+
+ for (auto & [ nXlSpecialCellsValue, sRange ] : aTestParams)
+ {
+ aParams = { uno::Any(nXlSpecialCellsValue) };
+ SfxObjectShell::CallXScript(
+ xComponent,
+ "vnd.sun.Star.script:VBAProject.Module1.testXlSpecialCellsValuesConstants?"
+ "language=Basic&location=document",
+ aParams, aRet, aOutParamIndex, aOutParam);
+ aRet >>= aReturnValue;
+ CPPUNIT_ASSERT_EQUAL(sRange, aReturnValue);
+ }
+ css::uno::Reference<css::util::XCloseable> xCloseable(xComponent, css::uno::UNO_QUERY_THROW);
+ xCloseable->close(true);
+}
CPPUNIT_TEST_SUITE_REGISTRATION(VBAMacroTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sc/source/ui/vba/vbarange.cxx b/sc/source/ui/vba/vbarange.cxx
index 279a4a53b930..d2bd37db518d 100644
--- a/sc/source/ui/vba/vbarange.cxx
+++ b/sc/source/ui/vba/vbarange.cxx
@@ -5536,6 +5536,27 @@ ScVbaRange::SpecialCells( const uno::Any& _oType, const uno::Any& _oValue)
return pRangeToUse->SpecialCellsImpl( nType, _oValue );
}
+static sal_Int32 getContentResultFlags(const uno::Any& aValue)
+{
+ if (sal_Int32 aType; aValue >>= aType)
+ {
+ switch (aType)
+ {
+ case excel::XlSpecialCellsValue::xlNumbers:
+ return sheet::CellFlags::VALUE | sheet::CellFlags::DATETIME;
+ case excel::XlSpecialCellsValue::xlTextValues:
+ return sheet::CellFlags::STRING;
+ case excel::XlSpecialCellsValue::xlLogical:
+ return sheet::CellFlags::VALUE | sheet::CellFlags::DATETIME;
+ case excel::XlSpecialCellsValue::xlErrors:
+ return 0;
+ default:
+ DebugHelper::basicexception(ERRCODE_BASIC_BAD_PARAMETER, {});
+ }
+ }
+ return sheet::CellFlags::VALUE | sheet::CellFlags::STRING | sheet::CellFlags::DATETIME;
+}
+
/// @throws script::BasicErrorException
static sal_Int32 lcl_getFormulaResultFlags(const uno::Any& aType)
{
@@ -5589,7 +5610,7 @@ ScVbaRange::SpecialCellsImpl( sal_Int32 nType, const uno::Any& _oValue)
xLocSheetCellRanges = xQuery->queryContentCells(sheet::CellFlags::ANNOTATION);
break;
case excel::XlCellType::xlCellTypeConstants:
- xLocSheetCellRanges = xQuery->queryContentCells(23);
+ xLocSheetCellRanges = xQuery->queryContentCells(getContentResultFlags(_oValue));
break;
case excel::XlCellType::xlCellTypeFormulas:
{