Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] Excel Office Interops: programmatisch cellen selecteren

Pagina: 1
Acties:
  • 412 views sinds 30-01-2008
  • Reageer

  • Bananenplant
  • Registratie: Januari 2001
  • Laatst online: 18:08
Ik ben bezig om in VS2k5 een plug-in voor Excel te bouwen en gebruik de office interops om de interactie met Excel te verzorgen. De API-documentatie van die dingen is echt enorm slecht, helaas :( .

Nu wil ik het volgende doen: in m'n applicatie heb ik een grafische weergave van de structuur van de spreadsheet en je kunt daarin klikken om 'cellen' in die visualisatie te selecteren. Nu wil ik ook graag dat als je in de visualisatie een selectie maakt de corresponderende cellen in Excel ook geselecteerd worden.

Eén cel tegelijk is niet zo moeilijk, maar meerdere cellen wil nog niet echt lukken. Wat ik nu heb:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void selectCell(String cellName, bool clear)
{
    // dit splitten is om de sheetnaam van de hele celnaam af te pellen: Sheet1!A1 bijvoorbeeld
    Worksheet sheet = (Worksheet)Connect.excelApp.Worksheets.get_Item(cellName.Split('!')[0]);
    Range cell = sheet.get_Range(cellName.Split('!')[1], cellName.Split('!')[1]);

    if (clear)
    {
        sheet.Activate();
        cell.Activate();
    }
    else
    {

        Object missing = System.Reflection.Missing.Value;
        Range cells = (Range)Connect.excelApp.Selection;
        cells = Connect.excelApp.Union(cells, cell, missing, missing, missing,
                                       missing, missing, missing, missing, missing,
                                       missing, missing, missing, missing, missing,
                                       missing, missing, missing, missing, missing,
                                       missing, missing, missing, missing, missing,
                                       missing, missing, missing, missing, missing);

        cells.Activate();
    }

    markCellSelected(cellName, fromGraph);
}


De parameter clear geeft aan of de selectie gereset moet worden. Als deze parameter true is wordt er dus één cel geselecteerd, plakje cake. Maar nu wil ik graag meerdere cellen selecteren. Ik ben er intussen achter dat een Range alleen maar uit een aaneengesloten rechthoekig blok cellen mag bestaan omdat je anders een exceptie krijgt als je die Union probeert te doen. Zelfs binnen zo'n Range heb je het probleem dat de selectie in Excel alleen groeit als je ofwel naar links ofwel naar boven je selectie uitbreidt. En je ondertussen niet van richting verandert.

Ik heb al dingen gevonden over Areas (waarin je dus niet-aaneengesloten blokken kunt stoppen) en een property Selection van de excelApp. Maar Areas heeft geen methode om ze te selecteren en Selection is read-only :( . ...iemand enig idee hoe ik dit ga aanpakken? Ik weet namelijk niet zo goed waar ik het nog zoeken moet, google geeft mij vooral extreem karige msdn-pagina's waar ik nauwelijks iets mee opschiet en de helft van de types die je tegenkomt als je bladert bij de properties/methoden van de API zijn Object :/ .

't Zou toch moeten kunnen, ik kan in Excel immers met ctrl ingehouden de raarst gevormde selecties maken.

💶 Wil je in een vrije democratie blijven wonen? Betaal dan voor nieuws. 📰
❌ ceterum censeo contra factiones ad dextrum extremum esse pugnandum. 🙅🏻‍♂️


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Wat ik dan altijd doe is effe een macro opnemen waarin ik de acties uitvoer die ik wil automatiseren en 'kijk het daar van af'. Dat gaf bij mij:
code:
1
Range("B4:B9,E4:F9,D24:F25").Select

[ Voor 22% gewijzigd door RobIII op 05-11-2007 18:05 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Bananenplant
  • Registratie: Januari 2001
  • Laatst online: 18:08
Hmm, hij gaat al de mist in bij die Union...

En weer lekker, blijkbaar heeft Range geen static methoden (is een interface) en kan ik zelf ook geen object instantiëren met zo'n string zoals je in die macro laat zien. Of ik ben erg slecht in VB lezen ;) .

Nu wordt wel een selectie gemaakt, maar als ik twee cellen van verschillende worksheets selecteer krijg ik een exceptie. Nouja, morgen maar eens verder prutsen :) .

Oh, ik zie nu dat je een selectie per worksheet hebt als ik een macro over meerdere worksheets opneem. Bedankt voor de tip :) !

[ Voor 29% gewijzigd door Bananenplant op 05-11-2007 19:18 . Reden: richting oplossing gevonden ]

💶 Wil je in een vrije democratie blijven wonen? Betaal dan voor nieuws. 📰
❌ ceterum censeo contra factiones ad dextrum extremum esse pugnandum. 🙅🏻‍♂️


  • Bananenplant
  • Registratie: Januari 2001
  • Laatst online: 18:08
Nu het volgende probleem: de selectie weer wissen :P . Nouja, ik ga maar puzzelen morgen en de bevindingen hier neerzetten voor wie het ooit ook eens nodig gaat hebben :) .

💶 Wil je in een vrije democratie blijven wonen? Betaal dan voor nieuws. 📰
❌ ceterum censeo contra factiones ad dextrum extremum esse pugnandum. 🙅🏻‍♂️


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Range.Clear :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Bananenplant
  • Registratie: Januari 2001
  • Laatst online: 18:08
Die maakt de cellen leeg ;) .

Ik itereer nu over alle worksheets en selecteer daar cel A1 maar... ik kan door zelf in Excel te klikken ook niet een manier verzinnen om helemaal niks meer geselecteerd/actief te hebben, dan maar zo :) .

[ Voor 78% gewijzigd door Bananenplant op 06-11-2007 13:34 ]

💶 Wil je in een vrije democratie blijven wonen? Betaal dan voor nieuws. 📰
❌ ceterum censeo contra factiones ad dextrum extremum esse pugnandum. 🙅🏻‍♂️

Pagina: 1