Avatar billede gladhund Nybegynder
12. september 2010 - 01:40 Der 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?
Avatar billede anlu Nybegynder
12. september 2010 - 11:51 #1
Hej,

Hvis jeg har forstået dig rigtigt, noget i retning af dette (hvor jeg har genbrugt din fname variabel og antager den indeholder stien til arket):


    Dim wb As Workbook
    Dim ws As Worksheet
    Dim deadlines As Integer
    Dim opgaver As Integer
       
    Set wb = Application.Workbooks.Open(fname)
    Set ws = wb.Worksheets("Konfiguration")
    deadlines = ws.Cells(52, 2).Value ' række 52, kolonne 2
    opgaver = ws.Cells(54, 2).Value ' række 54, kolonne 2
    wb.Close
   
    MsgBox "Der er " & deadlines & " overskredne deadlines og " & opgaver & " opgaver der mangler godkendelse."
Avatar billede gladhund Nybegynder
12. september 2010 - 12:38 #2
Tak for det hurtige svar anlu :)

Der kommer fejl i denne linje: Set wb = Application.Workbooks.Open(fName)

Fejlmeddelelsen: runtime error 1004. "blev ikke fundet.

Stien fname returnerer:
\\.host\Shared Folders\rasmus On My Mac\Dropbox\Produktion\Projektplan 100911.xlsm

Kan du hjælpe?
Avatar billede gladhund Nybegynder
12. september 2010 - 14:14 #3
Her er et andet eksempel på en mulig sti:
C:\Documents and Settings\Administrator\My Documents\yamaha logo.doc
Avatar billede gladhund Nybegynder
12. september 2010 - 14:25 #4
Jeg har rodet lidt med variable og anvendt tekstboksens værdi i en variabel i stedet for at bruge fname direkte, og nu virker de! :)

Jeg vil meget gerne give dig point, anlu - tak for hjælpen :)!
Avatar billede gladhund Nybegynder
12. september 2010 - 14:50 #5
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 :)
Avatar billede gladhund Nybegynder
12. september 2010 - 15:12 #6
Og endnu en lille ting ... kan man diable Save i den projektplan der åbnes? Jeg får en Save dialogbox op, og det er jo ikke nødvendigt...
Avatar billede anlu Nybegynder
12. september 2010 - 15:38 #7
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?
Avatar billede anlu Nybegynder
12. september 2010 - 15:47 #8
til point
Avatar billede gladhund Nybegynder
12. september 2010 - 15:58 #9
Tak for den med save.

Mht til kæden så er det jeg vil:

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!

Giver det mening?
Avatar billede gladhund Nybegynder
12. september 2010 - 16:02 #10
Der skal altså "bygges" to kæder ud fra de oplysninger jeg kender (ark og celle1 + celle2) samt de oplysninger brugeren oplyser (sti og fil).

Så skal de to referencer sættes sammen til een kæde.

Kæden skal så gemmes i en celle.

Jeg poster gerne en skovlfuld point mere på, hvis du kan hjælpe! :)
Avatar billede gladhund Nybegynder
12. september 2010 - 16:05 #11
Jeg har prøvet sådan her, men får "Subscript out of range":

celle1 = Application.Workbooks(fname).Sheets(ws).Range(deadlines)
Avatar billede anlu Nybegynder
12. september 2010 - 17:01 #12
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))
   
    formel = "='" & folderPath & "[" & wbName & "]Konfiguration'!R52C2"
   
    Range("A1").FormulaR1C1 = formel
Avatar billede gladhund Nybegynder
12. september 2010 - 17:09 #13
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 :).
Avatar billede gladhund Nybegynder
12. september 2010 - 17:24 #14
For DÆLEN - det virker! Det er super :).

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))
   
    formel = "='" & folderPath & "[" & wbName & "]Konfiguration'!R52C2"
    formel2 = "='" & folderPath & "[" & wbName & "]Konfiguration'!R55C2"
   
    'Range("A1").FormulaR1C1 = formel
   
    txtdetaljer.Text = formel & " aktiviteter over deadline." & Chr(10) & formel2 & " aktiviteter 'Afventer...'."
Avatar billede gladhund Nybegynder
12. september 2010 - 17:27 #15
Det går fint med at gemme formlen i txtdetaljer tekstboksen.

Men det går galt når jeg forsøger at gemme dennes værdi i en celle:

ActiveCell.Offset(0, 1).Select
Selection.Value = txtdetaljer.Text
Avatar billede gladhund Nybegynder
12. september 2010 - 17:30 #16
Det virker heller ikke med:

ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = txtdetaljer.Text
Avatar billede gladhund Nybegynder
12. september 2010 - 17:32 #17
Jeg opretter et spgm med 200 points til dig når vi er færdige med den her, hvis det er ok :)
Avatar billede gladhund Nybegynder
12. september 2010 - 17:42 #18
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...'.
Avatar billede anlu Nybegynder
12. september 2010 - 17:58 #19
Kan dette hjælpe dig?

    formel1 = "'" & folderPath & "[" & wbName & "]Konfiguration'!R52C2"
    formel2 = "'" & folderPath & "[" & wbName & "]Konfiguration'!R54C2"
   
    formel = "=" & formel1 & " & "" aktiviteter over deadline"" & CHAR(10) & " & formel2 & "& "" aktiviteter 'Afventer...'."""
   
    Range("A1").FormulaR1C1 = formel

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 :-)
Avatar billede gladhund Nybegynder
12. september 2010 - 18:14 #20
It works :). Sikken omgang - TUSIND tak!

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
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester