12. september 2010 - 01:40Der er
19 kommentarer og 1 løsning
Finde en fil via VBA og skabe en kæde til to celler
Hej eksperter,
Jeg bruger følgende kode i en userform til at finde en fil på et drev og gemme stien i en tekstboks:
Dim fName As String fName = Application.GetOpenFilename() If Not fName = "False" Then txtlink.Text = fName End If
Nu vil jeg gerne gemme en kæde til to celler i den fil, fx B52 og B54 i arket "Konfiguration". De to celler er hhv optælling af overskredne deadlines og opgaver der mangler godkendelse. Hvis jeg kunne få dem sammenlagt i een celle ville det være godt - fx sådan her: ="Der er " & B2 & "overskredne deadlines og " & B54 & "opgaver der mangler godkendelse."
Jeg skal altså binde sti, filnavn, ark og range sammen. Men hvordan skriver man koden til det?
Men... lige en ting. Nu bliver der jo sat en statisk tekst ind og ikke en kæde. Så når projektplanen opdateres, så skal man manuelt opdatere data igen... Kan man gøre det sådan, at der bliver oprettet en kæde i tekstfeltet, så data opdateres når projektplanen bliver ændret? (det kan man... men hvordan :)
Du kan angive SaveChanges:=false som parameter til Workbook.Close, dvs. wb.Close SaveChanges:=false så bør den ikke spørge om du vil gemme.
Mht. det med en kæde i tekstfeltet, så er jeg ikke 100% sikker på hvad du vil. Er det i din form at der er en tekst der skal opdateres? Eller? Og hvornår skal opdatering ske mere præcist?
1. Brugeren opretter link til en fil via en userform, hvor getopenfilename bruges til at lokalisere sti + fil. Så skal der gemmes en kæde til sti + filnavn + ark + celle1 og sti + filnavn + ark + celle2.
Ligesom hvis man selv havde oprettet en kæde. Udfordringen ligger i, at det er brugeren der selv skal lave kæden, blot ved at vælge en fil. Jeg kender arknavn og celle1 og celle2, så det er sti og filnavn jeg som udvikler ikke kender, så dem skal brugeren oplyse.
Når der så er oprettet en kæde, så vil den celle hvor jeg har gemt referencen til de to celler automatisk blive opdateret!
Jeg tror måske vi er ude i noget a la det her. Igen antager jeg at fname indeholder stien til filen. Det bliver lidt bøvlet fordi vi skal have splittet folder-stien fra selve filnavnet - kan muligvis laves smartere, men jeg kunne ikke lige se hvordan. Er det til at forstå?
Dim wbName As String Dim formel As String Dim pathParts As Variant Dim folderPath As String Dim i As Integer
pathParts = Split(fname, "\") folderPath = "" For i = LBound(pathParts) To UBound(pathParts) - 1 folderPath = folderPath & pathParts(i) & "\" Next i wbName = pathParts(UBound(pathParts))
Jeg tror, at du er ude i det helt rigtige! Jeg har selv fundet det her:
Retrieving a value from a closed workbook VBA does not include a method to retrieve a value from a closed workbook file. You can, however, take advantage of Excel's ability to work with linked files. This section contains a custom VBA function (GetValue, which follows) that retrieves a value from a closed workbook. It does so by calling an XLM macro, which is an old-style macro used in versions prior to Excel 5. Fortunately, Excel still supports this old macro system.
Private Function GetValue(path, file, sheet, ref) ' Retrieves a value from a closed workbook Dim arg As String
' Make sure the file exists If Right(path, 1) <> "\" Then path = path & "\" If Dir(path & file) = "" Then GetValue = "File Not Found" Exit Function End If ' Create the argument arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1)
' Execute an XLM macro GetValue = ExecuteExcel4Macro(arg) End Function
Men den kræver NETOP, at man skiller sti og fil ad, og der står ikke hvordan man gør det... Jeg prøver din kode og vender tilbage :).
Det var det svære. Nu mangler jeg (vi) kun: 1. at gøre det for begge de to celler 2. samle dem i en enkelt tekststreng 3. proppe den i en tekstboks i formularen 4. gemme formlen i en celle i mit regneark.
Er det noget i denne stil? (bruger "sti" i stedet for fname)
Dim sti As String Dim deadlines As String Dim afventer As String
sti = frmtrs!txtlink.Text
Dim wbName As String Dim formel As String Dim formel2 As String Dim pathParts As Variant Dim folderPath As String Dim l As Integer
pathParts = Split(sti, "\") folderPath = "" For l = LBound(pathParts) To UBound(pathParts) - 1 folderPath = folderPath & pathParts(l) & "\" Next l wbName = pathParts(UBound(pathParts))
Mine & tegn bliver ikke taget med over i tekstboksen, kan jeg se:
='\\.host\Shared Folders\rasmus On My Mac\Dropbox\VILEN konceptudvikling\STYR\Produktion\[Projektplan 100911.xlsm]Konfiguration'!R52C2 aktiviteter over deadline.='\\.host\Shared Folders\rasmus On My Mac\Dropbox\VILEN konceptudvikling\STYR\Produktion\[Projektplan 100911.xlsm]Konfiguration'!R55C2 aktiviteter 'Afventer...'.
I stedet for Range("A1") kan du benytte ActiveCell.Offset(0,1) hvis det er den celle du skal have skrevet i.
Bemærk at den celle der skrives i skal have Wrap text slået til i formattering (ved ikke lige hvad det hedder i den danske version). Og helt fint med 200p :-)
Jeg er meget taknemmelig for hjælpen - det var en nød jeg meget gerne skulle knække i dag.
Jeg opretter straks et spgm med point. Fortsat rigtig god aften :)!
MVH
Rasmus
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.