Automatisch invullen na selecteren van externe Excel

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • IgorH
  • Registratie: April 2011
  • Laatst online: 24-12-2024
Beste Tweakers,

Ik heb wellicht een lastig vraagstuk (lees: leuke uitdaging 8)7 ) die ik jullie wil voorleggen.

Ik wil een Excel-workbook maken waarin ik een overzicht wil creëren van verschillende externe items. Van elke externe item wordt een calculatie in een aparte Excel gemaakt. Wat ik in het overzicht wil doen, is per regel een button maken dat, na het aanklikken van die button, je gevraagd wordt een van de calculatie Excel files te selecteren en dat dan automatisch bepaalde informatie van de gekozen Excel ingevuld worden in het overzicht (in dezelfde regel waar de button staat). Het gaat hier dus om een data transfer van de ene workbook naar de andere. Dat betekent dus dat de gekozen workbook geopend wordt, de data gekopieerd word van de ene naar de andere workbook en dat dan de gekozen workbook weer gesloten wordt.

Ik weet 100% zeker dat dit in VBA te regelen is. Alleen, mijn kennis over VBA is niet al te groot. Ik ben wel al aan het stoeien geweest en heb al voor elkaar gekregen dat, na het aanklikken van de button, een prompt komt om de externe Excel file te selecteren. Het moeilijke is nu om dan de data transfer van de externe Excel in de huidige workbook te krijgen, op de juiste plek.

Wie kan mij verder helpen, of heeft al een beetje ervaring met zulke dingen?

Beste antwoord (via IgorH op 29-09-2023 11:56)


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Verder helemaal eens met @F_J_K, maar als je er tijd en energie in wilt steken om een werkend proof concept te krijgen:

* (Bijna) Alles wat je ziet in Excel is een 'object'. Elk object heeft 'eigenschappen' (properties) en dingen die het kan doen (methoden)'. Microsoft heeft een uitstekende documentatie wat elk object doet en kan. De truc met vba is dat je verwijzingen naar die objecten kunt maken en hun eigenschappen en methoden aankunt roepen.
Dus:
-een bestand openen doe je met het workbooks (collection) object en de methode 'open':
code:
1
Workbooks.Open FileName:="je filenaam.xlx"


Maar omdat je er later ook wat mee wilt doen is het slimmer om meteen een variabele aan te maken om er een verwijzing naar te hebben. Omdat je ook wilt kunnen werken met je huidige bestand is het fijn om ook die verwijzing klaar te zetten:
code:
1
2
3
Dim target as workbook, source as workbook
Set target=activeworkbook
Set source=Workbooks.Open(FileName:="je filenaam.xlx")

Dan heb je eigenlijk het moeilijkste al gehad. Een workbook heeft een worksheets collection, een daar kun je weer ranges uit halen. En je raadt het al, die range heeft een value. Dus kopieren wordt dan niet meer dan:
code:
1
target.worksheets("naamwerkblad").Range("A1").value=source.worksheets('naambronwerkblad").range("C3").value

Hier wordt dus de waarde uit c3 in het bronbestand weggeschreven naar A1 in het doelbestand. Value mag je weglaten, maar ik schrijf het nu even uit om de systematiek duidelijk te maken.

Afsluiten is niet meer dan de close-methode aanroepen.
code:
1
source.close()


Voor een proof of concept heb je zo genoeg. Om een goede oplossing te maken moet er foutafhandeling aan worden toegevoegd, screenupdating uit en weer aan en eventueel wat optimalisaties en checks.

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

Alle reacties


Acties:
  • +2 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

"Alles kan". Lees de invoer, open file, voeg in een loopje de juiste gegevens uit de sheet in in de juiste cellen.

Maar vraag is erg of het verstandig is. Je kunt een spijker in hout krijgen met een vork maar dat maakt de vork nog niet het juiste gereedschap er voor. En dan nog wil je eerst VBA meer kennen dan 'niet al te groot'. Dat gaat fouten opleveren en dit klinkt niet als een hobby-dingetje.


Beter: gebruik verticaal-/ hosizontaal-/ of x.zoeken en geen VBA.

[ Voor 0% gewijzigd door F_J_K op 29-09-2023 11:20 . Reden: ;) ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • +1 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

F_J_K schreef op vrijdag 29 september 2023 @ 10:20:
En dan nog wil je eerst VBA meer kennen dan niet al te groot.
offtopic:
het is dat ik weet dat je de Nederlandse taal uitstekend beheerst, maar soms heb ik het gevoel dat je een Indiase bot bent die een beroep doet op Google translate :+

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


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Verder helemaal eens met @F_J_K, maar als je er tijd en energie in wilt steken om een werkend proof concept te krijgen:

* (Bijna) Alles wat je ziet in Excel is een 'object'. Elk object heeft 'eigenschappen' (properties) en dingen die het kan doen (methoden)'. Microsoft heeft een uitstekende documentatie wat elk object doet en kan. De truc met vba is dat je verwijzingen naar die objecten kunt maken en hun eigenschappen en methoden aankunt roepen.
Dus:
-een bestand openen doe je met het workbooks (collection) object en de methode 'open':
code:
1
Workbooks.Open FileName:="je filenaam.xlx"


Maar omdat je er later ook wat mee wilt doen is het slimmer om meteen een variabele aan te maken om er een verwijzing naar te hebben. Omdat je ook wilt kunnen werken met je huidige bestand is het fijn om ook die verwijzing klaar te zetten:
code:
1
2
3
Dim target as workbook, source as workbook
Set target=activeworkbook
Set source=Workbooks.Open(FileName:="je filenaam.xlx")

Dan heb je eigenlijk het moeilijkste al gehad. Een workbook heeft een worksheets collection, een daar kun je weer ranges uit halen. En je raadt het al, die range heeft een value. Dus kopieren wordt dan niet meer dan:
code:
1
target.worksheets("naamwerkblad").Range("A1").value=source.worksheets('naambronwerkblad").range("C3").value

Hier wordt dus de waarde uit c3 in het bronbestand weggeschreven naar A1 in het doelbestand. Value mag je weglaten, maar ik schrijf het nu even uit om de systematiek duidelijk te maken.

Afsluiten is niet meer dan de close-methode aanroepen.
code:
1
source.close()


Voor een proof of concept heb je zo genoeg. Om een goede oplossing te maken moet er foutafhandeling aan worden toegevoegd, screenupdating uit en weer aan en eventueel wat optimalisaties en checks.

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


Acties:
  • 0 Henk 'm!

  • IgorH
  • Registratie: April 2011
  • Laatst online: 24-12-2024
Lustucru schreef op vrijdag 29 september 2023 @ 11:42:
Verder helemaal eens met @F_J_K, maar als je er tijd en energie in wilt steken om een werkend proof concept te krijgen:

* (Bijna) Alles wat je ziet in Excel is een 'object'. Elk object heeft 'eigenschappen' (properties) en dingen die het kan doen (methoden)'. Microsoft heeft een uitstekende documentatie wat elk object doet en kan. De truc met vba is dat je verwijzingen naar die objecten kunt maken en hun eigenschappen en methoden aankunt roepen.
Dus:
-een bestand openen doe je met het workbooks (collection) object en de methode 'open':
code:
1
Workbooks.Open FileName:="je filenaam.xlx"


Maar omdat je er later ook wat mee wilt doen is het slimmer om meteen een variabele aan te maken om er een verwijzing naar te hebben. Omdat je ook wilt kunnen werken met je huidige bestand is het fijn om ook die verwijzing klaar te zetten:
code:
1
2
3
Dim target as workbook, source as workbook
Set target=activeworkbook
Set source=Workbooks.Open(FileName:="je filenaam.xlx")

Dan heb je eigenlijk het moeilijkste al gehad. Een workbook heeft een worksheets collection, een daar kun je weer ranges uit halen. En je raadt het al, die range heeft een value. Dus kopieren wordt dan niet meer dan:
code:
1
target.worksheets("naamwerkblad").Range("A1").value=source.worksheets('naambronwerkblad").range("C3").value

Hier wordt dus de waarde uit c3 in het bronbestand weggeschreven naar A1 in het doelbestand. Value mag je weglaten, maar ik schrijf het nu even uit om de systematiek duidelijk te maken.

Afsluiten is niet meer dan de close-methode aanroepen.
code:
1
source.close()


Voor een proof of concept heb je zo genoeg. Om een goede oplossing te maken moet er foutafhandeling aan worden toegevoegd, screenupdating uit en weer aan en eventueel wat optimalisaties en checks.
Top uitleg, hier kan ik zeker mee vooruit!

Ik was al in de documentatie van Microsoft aan het zoeken geweest, dus veel elementen komen me inderdaad bekend voor. Ik ga ermee aan de slag!