ATWindsor Skrevet 15. april 2009 Del Skrevet 15. april 2009 Jeg innser at overskriften er litt lettere forvirrende. Så om noen har noen konkrete forslag til forbedringer, så tar jeg gjerne i mot. Problemstillingen jeg pørver å løse er ihvertfall som skissert: Det finnes noen regneark som bruker en xla-funksjon som foretar en viss utregning. Xla-funksjonene er brukt som en add-in. Dette forårsaker to problemer 1. Siden det brukes som en add-in, så fungerer ikke ikke regnearket på andre PCer, da den henviser til en xla-fil som er plassert et gitt sted på maskinen til den som lagde regnearket. 2. Denne funksjonen er av en eller annen grunn ikke kompatibel med excel 2007. Jeg har et nyere sett funksjoner som erstatter det gamle (tre funksjoner). Mitt mål er følgende. 1. Kunne hente inn en eksisterende excel-fil som bruker de nevnte funksjonene. 2. Legge det nyere settet med funksjoner rett inn i excel-fila. (ikke som en add in, men somen macro-funksjon i arket). 3. Finne henvisninger til den gamle funksjonen og erstatte den med henvisninger til den nye funksjonen. Jeg ser for meg det enkleste blir å lage en slags macro som lager en dialogboks der input er filnavnet på excel-fila, og navnet på funksjonen som skal erstattes. Er det noen som har noen tips om hvordan dette kan utføres? Jeg er vel ikke akkurat noen racer på vba for å si det mildt, men tror jeg skal klare lage en dialogboks, som henter inn variablene, og kanskje også hente inn fila. Det jeg trenger mest hjelp til er nok å få lagt inn det nye settet med funksjoner. Når det er gjort så er det vel bare å kjøre en search and replace med det gamle navnet på funksjonen som input (og det nye navnet, men det er jo bare å hardkode). Jeg har de nye funksjonene både som kildekode og xla-fil, om dette skulle forenkle noe. Håper det var sånn noenlunde forståelig, og at noen kan hjelpe meg litt. Både konkrete tips til å løse enkeltproblemer og innspill av typen "idiot, det er mye enklere om du heller lager en macro som gjør blabla istedet for det du foreslår" er veldig velkomne. AtW Lenke til kommentar
Harald Staff Skrevet 15. april 2009 Del Skrevet 15. april 2009 Hei Den tyngste delen av jobben finner du forhåpentligvis løsningen på her: http://www.cpearson.com/Excel/VBE.aspx Skjelett for prosedyre: Sub ManipulateFile() Dim sName As Variant Dim oBook As Workbook Dim oSht As Worksheet sName = Application.GetOpenFilename("Excel Files (*.xl*), *.xl*") If sName = False Then Exit Sub Set oBook = Workbooks.Open(CStr(sName)) DoEvents 'kode for å sette inn VBA her, sjekk 'http://www.cpearson.com/Excel/VBE.aspx 'kode for å erstatte formler: For Each oSht In oBook.Worksheets MsgBox oSht.Name 'bytt ut med søk-erstatt i hvert ark 'spill inn en makro når du gjør det manuelt for riktig syntax Next 'hvis alt har gått bra (sjekk) så oBook.Save oBook.Close Set oBook = Nothing End Sub Om dette er den beste løsningen vet jeg ikke. I teorien holder det at xla-tillegget er installert i brukernes excel. Men teori er bare teori.... HTH. Beste hilsen Harald Lenke til kommentar
ATWindsor Skrevet 26. juni 2009 Forfatter Del Skrevet 26. juni 2009 Ble veldig forsinket før jeg kom videre her, men når er jeg i gang. Tusen takk for hjelpen, du er virkelig en ressurbruker i VB-delen av forumet Løningen fungerer helt fint i praksis, jeg har dog et lite problem i koden min, jeg har denne kodesnutten: Dim Foundcell As Variant Set Foundcell = Cells.Find(What:="dbfun", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False) Det fungerer helt fint om det står dbfun i klartekst, men om det er endel av en formel så fungerer det ikke, og jeg skjønner ikke hvorfor. Om jeg bruker vartype på foundcell så viser den string om jeg søker etter tekst som finnes i klartekst, mens den viser error om jeg har søkt etter noe som er endel av en formel. Jeg er ektra forvirret fordi søk og erstatt fungerer fint også innad i formler i arket... AtW Lenke til kommentar
Harald Staff Skrevet 28. juni 2009 Del Skrevet 28. juni 2009 (endret) Ble veldig forsinket før jeg kom videre her, men når er jeg i gang. Tusen takk for hjelpen, du er virkelig en ressurbruker i VB-delen av forumet Hehe takk. Artig, har ikke vært her siden forrige svar, dels pga veldig liten trafikk, dels fordi det er litt for lett å få kjeft her av dotnet-fundamentalistene. Så veldig tilfeldig at jeg sveipa innom denne nå. I VBA er Variant og "ikke deklarert" det samme, nemlig hvasomhelst. I praksis er en Variant en pointer på sykkelsport-dop. Du kan fort få trøbbel da hvis du søker datatype, det kan være alt og ingenting fra gang til gang. Vrient å spotte feilen hos deg uten hele koden. Men en mulighet er at cells.find slik du bruker, returnerer en Range, altså en celle eller et celleområde. Altså Dim Foundcell as Range deretter kan du behandle Founcell.Formula som Variant (dvs enten formel, dato, tekst, tall, tid, ... ) Og så er det et spørsmål om "after active cell", det forder at den funnete cellen faktisk aktiveres. Den trenger ikke egentlig det, men pass i utgangspunktet på at det skjer. Ang søk-erstatt, som jeg tror er viktig her, er det nokså versjonsavhengig, så jeg må vite excelårgang for å svare fornuftig. Legg en pling i innboksen min hvis du svarer, som sagt er jeg egentlig aldri innom her lenger. Beste hilsen Harald Endret 28. juni 2009 av Harald Staff Lenke til kommentar
ATWindsor Skrevet 2. juli 2009 Forfatter Del Skrevet 2. juli 2009 (endret) Takk for tipset, å sette Foundcell som en range gjorde susen (men må da hente ut innholdet etterpå), om det er interessant kan du jo se koden, dette er hele fordi jeg har for u(vane) å i første omgang kun programere noe som gjør det jeg vil, og senere implmentere det inn i hovedprogrammet. Denne lille delen søker etter celler med en spesiell funksjon, og klipper vekk referansen til filbanen der funksjonen ligger (dvs har ikke implmentert search and replace-delen enda, men det går greit). Den er krydret med mine egne kommentarer, som kanskje ikke er like forståelige eller relevante Det er forresten Ezxcel 2007. Sub Macro1() ' ' Macro1 Macro ' Dim Foundcell As Range Set Foundcell = Cells.Find(What:="dbfun", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, SearchFormat:=False) Dim boknum As Integer Dim utdrag As String Dim test2 As Variant test2 = Foundcell.Formula MsgBox test2 test = VarType(Foundcell) 'om det er treff returner den 8 (string), om ikke returnerer den 9 (object), 10 er error MsgBox test 'Er påfølgende if-setning egentlig nødvendig, elelr kan løses mer smidig? Sjekk If test = 10 Then ' kjører bare om Foundcell er error, noe den av en eller annen grunn er om det er en formel i cellen boknum = InStr(1, test2, ".xla'!") 'Henter hvor mange tegn ut i cellens innhold .xla ligger utdrag = Mid(test2, 1, boknum - 1) 'Sakser ut henvisningen til filbanen til funksjonen MsgBox utdrag End If End Sub AtW Endret 2. juli 2009 av ATWindsor Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå