Toon posts:

[Delphi 5] macro met Excel

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb een programma met Delphi 5 gemaakt,
welke een Excel bestand creërt en vervolgens vult met data.
Nu is het de bedoeling dat 2 kolommen beveiligd worden.
Ik dacht dit te doen met een macro en deze vervolgens te starten vanuit Delphi 5,
maar hij krijgt de macro niet gevonden!
Ik gebruik het volgende commando in Delphi 5:

XLApp.run('beveiliging');

Ik heb in Excel een macro gemaakt en deze beveiling genoemd.
Maar met het creëren van een Excel bestand vanuit Delphi 5 zijn er geen macro's aanwezig!

Is er een ander manier om dit uit te voeren?
Of moet ik de macro anders opslaan?

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Je kan vanuit Delphi 5 toch ook direct bewerkingen doen in Excel :? Waarom niet direct beveiligen. Daarnaast zullen je macro's natuurlijk niet standaard aanwezig zijn als je een nieuw Excel object aanmaakt, tenzij je je macro's opslaat in je 'Personal Macrobook' (weet ff de Engelse term niet, aangezien ik een duitse versie hier heb)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
Ik heb een macro opgeslagen in mijn personal workbook of zoiets,
maar dat werkt niet met een excel bestand gecreërd vanuit Excel.
Als ik gewoon Excel zo opstart heb ik de macro wel tot mijn beschikking.
Vanuit Delphi 5 helaas niet!

Ik heb ook al geprobeerd om vanuit Delphi de beveiling in te schakelen,
maar dit lukt niet helemaal. Ik krijg dan een fout melding!


Hierbij de macro die uitgevoerd moet worden:

Sub Beveiliging()
'
' Beveiliging Macro
' De macro is opgenomen op 13-4-2006 door .
'

'
Cells.Select
Selection.Locked = False
Selection.FormulaHidden = False
Columns("P:Q").Select
Selection.Locked = True
Selection.FormulaHidden = False
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub


In Delphi krijg ik een foutmelding op regel:
Columns("P:Q").Select

Weet iemand hoe ik deze macro kan opzetten, zodat Delphi het kan uitvoeren?

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Dus nogmaals, als je een Excel object hebt kan je deze bewerkingen ook direct uitvoeren hoor :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
Kun je mij dan vertellen hoe deze macro in Delphi moet gebruiken?

Ik krijg een foutmelding op regel:
Columns("P:Q").Select

  • Eriksk
  • Registratie: December 2003
  • Niet online
Heb zelf geen ervaring met het aanspreken van Macro's, maar er zal vast wel een oplossing zijn. Ook zou het handig zijn als je vertelde wat voor een foutmelding krijgt bij je select...

Je zou ook het volgende kunnen proberen (denk ik):
je-excelsheet-object.Range['A2','A2'].EntireRow.Select;

Verwijderd

Topicstarter
Je hebt gelijk Eriksk.

Ik gebruik nu de volgende regel:
XLApp.Range['P1','Q1'].EntireColumn.Select;

i.p.v. EntireRow gebruik ik dus EntireColumn, wat goed werkt.

Nu is alleen nog de laatste regel van mijn VisualBasic een obstakel

ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

Hoe kan ik deze regel omzetten voor gebruik in Delphi?
Als ik de volgende regel in Delphi gebruik:
XLApp.ActiveSheet.Protect := True;
Krijg ik een foutmelding en wel de volgende:
Kan Lid niet vinden.

Als ik verder ga met mijn Excel sheet, dan zijn deze 2 kolommen wel beveiligd.
Het zou dan ook prettig zijn als deze melding niet verschijnd!
Zo je me hier nog mee kunnen helpen?
Of zou je me kunnen vertellen waar ik hier meer informatie over kan vinden?
Dan zoek ik dit zelf verder wel uit.
Alvast bedankt

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 17:58

Tomatoman

Fulltime prutser

Je zou kunnen proberen:
Delphi:
1
2
3
4
XLApp.ActiveSheet.Protect;
XLApp.ActiveSheet.DrawingObjects := True;
XLApp.ActiveSheet.Contents := True;
XLApp.ActiveSheet.Scenarios := True;

Met BtM909 ben ik het echter eens dat je beter een andere aanpak zou kunnen kiezen. Wat je nu doet is vanuit Delphi de OLE server van Excel aanroepen die een VB-Script macro uitvoert. Je gebruikt dus de ene programmeertaal om de andere programmeertaal uit te voeren. Bovendien maak je nu een oplossing die afhankelijk is van jouw eigen computer. Als je het Delphiprogramma op een willekeurige andere computer laat draaien waar Excel op geïnstalleerd is, werkt het niet meer. Die macro is dan immers niet aanwezig. Daar komt nog bij dat een gebruiker in verband met veiligheidsrisico's het uitvoeren van macro's weleens in zijn geheel kan hebben uitgeschakeld.

Delphi kent een veel elegantere manier om bewerkingen in Excel uit te voeren, namelijk door direct commando's naar de OLE server te sturen. Dan heb je helemaal geen macro's meer nodig en wordt je code een stuk 'schoner' en beter te debuggen. Zie hier voor een uitgebreid artikel.

[Edit]
In dit artikel vind je een ander nuttig voorbeeld. Gebruik de interfaces (met early binding) in plaats van de variant types (met late binding), dat werkt een stuk gemakkelijker. In nieuwere versies van Delphi hoef je de type libraries niet meer te importeren, maar kunt je meteen de Excel COM server vanaf het component palette in je applicatie slepen.

[ Voor 19% gewijzigd door Tomatoman op 19-04-2006 14:33 ]

Een goede grap mag vrienden kosten.


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Verwijderd schreef op dinsdag 18 april 2006 @ 22:41:
XLApp.Range['P1','Q1'].
[...]
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True

XLApp.ActiveSheet.Protect := True;
Krijg ik een foutmelding en wel de volgende:
Kan Lid niet vinden.
[...]
Protect is een methode en geen property. Als ik het goed lees wijs je nu de waarde true toe aan protect ipv als een parameter mee te geven en omdat je geen naam van de parameter opgeeft kent hij hem niet ;)

Ipv xlapp.range en xlapp.activesheet zou mijn voorkeur uitgaan naar het sheet wat je gaat bewerking in een variabele duwen en daarmee verder werken.

[ Voor 18% gewijzigd door Lustucru op 19-04-2006 15:00 ]

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Pagina: 1