Vraag & Antwoord

Programmeren

Excel 2007 bestand met Macro autostart

13 antwoorden
  • Ik heb een macro gemaakt welke automatisch start zodra ik het excelblad open: [code:1:d0167bf739]Sub Workbook_Open ... End Sub[/code:1:d0167bf739] Microsoft heeft het nodig gevonden om Excel met Macro's een andere Extensie te geven XLSM Echter, ik maak vanuit Access een export naar excel, het is niet mogelijk om naar dit formaat te exporteren. Heeft iemand hier een oplossing voor? Zeer frustrerend dit. In 2003 werkte dit perfect.
  • Als ik het goed wil exporteer je dat vanuit Access naar Excel, en vervolgens wil je in Excel een werkblad openen, waarbij er automatisch een macro wordt gestart ???. Of open je het Excel werkblad vanuit Access. Is een alternatieve oplossing wellicht een koppeling vanuit Excell naar de data in Access. Op het moment dat je het Excel werkblad opent kun je de data laten verversen, en is je werkblad dus weer actueel. Of is dit te simpel geredeneerd.
  • [quote:10525f1cda]Als ik het goed wil exporteer je dat vanuit Access naar Excel, en vervolgens wil je in Excel een werkblad openen, waarbij er automatisch een macro wordt gestart[/quote:10525f1cda] Klopt helemaal. De data wordt verwerkt in Excel en vervolgens weer geïmporteerd in Access. Ik heb namelijk nog geen snelle manier gevonden om een "afstand tabel" te creeren in Access: ik heb een aantal waarde (max 30) bijv: A1 A2 A3 A4 enz enz enz Die waardes ga ik exporteren naar Excel, kopieren, transponeren en doorvoeren zodat er een matrix ontstaat. PK kOP1 kOP2 KOP3 A1 A2 A3 A4 A2 A1 A3 A4 A3 A1 A2 A4 A4 A1 A2 A3 De bewerkte gegevens worden vervolgens weer geïmporteerd in een Access tabel (PK is de primary key). Kop1 Kop2 enz.. zijn de database velden/kolommen van de tabel. De waarde zijn afkomstig van diverse query's en moeten met elkaar gekoppeld worden. Voorheen (2003) deed ik dit allemaal met een koppeling naar Excel. Werkt redelijk snel, het was wat bewerkelijk. Nu ben ik overgestapt naar Access 2007 maar daar zit ik met het bovengenoemde probleem. (Ik ben overigens een lang lopende cursus programmeren VBA .NET aan het volgen om meer vanuit echt programmeer werk te kunnen gaan doen)
  • Kun je een voorbeeldje geven van de oorspronkelelijke data ??? Ik heb het idee dat het met een kruistabel of een stukje vba op te lossen moet zijn
  • Bedankt voor je reactie! De genoemde data A1 A2 A3 enz komt overeen met de echte waarde (tekst 20 karakters, alle code zijn uniek). De genoemde Kop1 Kop2 enz zijn de werkelijke tabel koppen. Ik vergaar de data A1 A2 A3 enz aan de hand van diverse query's waar ik voorkeuren kan opgeven. Omdat deze voorkeuren per item steeds kunnen wijzigen sla ik de resultaten op in een tabel. Resultaat van de query's zijn dus A1 A2 A3 A4 enz. Op dit resultaat voer ik dus bovengenoemde bewerkingen uit waarna ik het uiteindelijk resultaat in een tabel op sla. Waarna weer andere Ik ben zelf bezig met een lang lopende cursus VBA gevolgd door .net heb ik het wegschrijven naar databases nog niet gehad. Ik heb al gemerkt dat de VBA code van Access toch wel verschilt van de code uit Visual Studio. (sorry dat ik af en toe erg traag reageer maar ik ben momenteel niet in Nederland en moet een eindje rijden voor een internetverbinding)
  • Misschien heb ik mijn vraag niet duidelijk genoeg gesteld. Uit je probleem omschrijving maak op dat het uiteindelijke resultaat na alle knip en plak bewerkingen : PK kOP1 kOP2 KOP3 A1 A2 A3 A4 A2 A1 A3 A4 A3 A1 A2 A4 A4 A1 A2 A3 is. Dit resultaat exporteer je weer naar Access. Wat ik graag wil weten hoe de opbouw van de data is, voordat je het hebt bewerkt. Dat is namelijk het uitgangspunt voor het schrijven van een stukje code, om alle acties in Excel te kunnen overslaan
  • De data die ik naar excel exporteer is alleen maar het resultaat van Qry0600-KoppelSelectie en dat is: A1 A2 A3 A4 Daarna maak ik in Excel de benodigde kolomkoppen aan PK Kop1 Kop2 enz. zodat Access ze makkelijk in de Tbl-Koppel kan importeren. Als ik dit in VBA wil gaan programmeren dan moet ik in Access 2007 via een Module doen, vermoed ik. Ik heb ook al lopen zoeken naar een Loop functie waarbij ik elke waarde in een aparte string plaats. Maar dit gaat, eerlijk gezegd, op dit moment mijn pet te boven. In excel heb ik dit via een macro gemaakt (via macro recorder).
  • Dus even resumerend voordat ik er mee aan de slag ga : per vier stuks data wordt er een nieuw record aangemaakt. Dat kan inderdaad vrij eenvoudig met een for next loop. Zodra ik de code heb, plaats ik die even.
  • Ik wil je eerst bedanken dat je dit alleen al overweegt om te doen! Echt super! [quote:e1b43f5003]Dus even resumerend voordat ik er mee aan de slag ga : per vier stuks data wordt er een nieuw record aangemaakt. Dat kan inderdaad vrij eenvoudig met een for next loop. [/quote:e1b43f5003] Dat klopt niet helemaal: de A's lopen t/m een max van 31 (A1 t/m A31). Stel het zijn er 31, dan zijn het 31 records met voor elke record 30 velden, de eigen waarde haal ik er altijd uit omdat deze anders dubbel voorkomt. Voor de duidelijkheid, de A is string van 20 karakters. De eerste kolom is een primary key. A1 A2 A3...A31 A2 A1 A3 ..A31 .. A31 A1 A2 ..A30 Ik ben vanaf morgenochtend t/m volgende week zondag in "the middle of nowhere". Ik zal dan niet of nauwelijks een internet toegang kunnen vinden. Nogmaals, suoer bedankt!
  • Wil je als je nog tijd hebt, even de macro in Excel plaatsen (of sturen) ???
  • Alhoewel ik er nog steeds niet zeker van ben dat we elkaar goed begrijpen is dit de code die de waarden van een query transponeerd naar een nieuwe tabel. De keuze van, en de volgorde van, de te transponeren velden kun je beinvloeden door de query juist in te richten.Volgens mij moet dit de code zijn : [code:1:10adb74af3] Private Sub Transponeer() Dim aantalrecords As Integer Dim aantalvelden As Integer Set dwgebied = DBEngine.Workspaces(0) Set dbdatabase = CurrentDb() Set dvquery = dbdatabase.OpenRecordset("Qry0600-KoppelSelectie", dbOpenDynaset, dbInconsistent) aantalrecords = DCount("[unieke key tabel1]", "Qry0600-KoppelSelectie") 'het aantal record wordt geteld aantalvelden = dvquery.Fields.Count 'het aantal velden wordt geteld ReDim basis(aantalrecords, aantalvelden) 'waarden uit de query worden in een tweedimensionaal array gezet With dvquery .MoveFirst recordteller = 1 Do While Not .EOF() For veldteller = 0 To aantalvelden - 1 basis(recordteller, veldteller + 1) = .Fields(veldteller) Next veldteller recordteller = recordteller + 1 .MoveNext Loop End With SQL = "DELETE tbl_getransponeerd.*FROM tbl_getransponeerd" DoCmd.RunSQL SQL Set transpon = dbdatabase.OpenRecordset("tbl_getransponeerd", dbOpenDynaset, dbInconsistent) For teller = 1 To aantalvelden With transpon .AddNew .Update .MoveLast .Edit For veldteller = 1 To aantalrecords .Fields(veldteller) = basis(veldteller, teller) Next veldteller .Update End With Next teller End Sub [/code:1:10adb74af3] Denk er om dat je wel eerst de tabel tbl_getransponeerd aanmaakt. Ik wacht je reactie af.
  • Hoi Johan, dit is een mooi stuk code met voor mij enkele onbekende stukken zoals EOF(). Maar goed, daar ga ik eens mooi induiken. Ik ga vanavond aan de slag met de code, wederom zullen de reacties weer erg traag zijn van mijn kant. Internet is ook hier niet makkelijk te vinden...
  • Beste Johan, bedankt voor de uitstekende hulp. Ik heb de code inmiddels goed werkend! Overigens een zeer interessante les! Fijne feestdagen!

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.