Gå til innhold

Funksjon som legger til en gitt funksjon i en annen excel-fil


Anbefalte innlegg

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
Videoannonse
Annonse

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
  • 2 måneder senere...

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
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 av Harald Staff
Lenke til kommentar

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 av ATWindsor
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...