ERLANDSEN DATA CONSULTING Excel & VBA Tips   Information in English / Informasjon på engelsk

 

Disse websidene oppdateres ikke lengre og er kun tilgjengelig for historikken sin skyld.

Klikk her for å gå til den oppdaterte informasjonen.

Les informasjon fra en lukket arbeidsbok

Ved hjelp av makroene nedenfor kan man lese inn verdier og tekst fra celler i en lukket arbeidsbok. Makroeksempelet viser hvordan man kan lese inn innholdet fra celle A1 i Ark1 fra samtlige arbeidsbøker som er lagret i en angitt mappe.

Sub LesInfoFraAlleFiler()
Dim FolderName As String, wbName As String, r As Long, cValue As Variant
Dim wbList() As String, wbCount As Integer, i As Integer
    FolderName = "C:\Foldername"
    ' lag en liste over samtlige arbeidsbøker i mappen
    wbCount = 0
    wbName = Dir(FolderName & "" & "*.xls")
    While wbName <> ""
        wbCount = wbCount + 1
        ReDim Preserve wbList(1 To wbCount)
        wbList(wbCount) = wbName
        wbName = Dir
    Wend
    If wbCount = 0 Then Exit Sub
    ' get values from each workbook
    r = 0
    Workbooks.Add
    For i = 1 To wbCount
        r = r + 1
        cValue = GetInfoFromClosedFile(FolderName, wbList(i), "Ark1", "A1")
        Cells(r, 1).Formula = wbList(i)
        Cells(r, 2).Formula = cValue
    Next i
End Sub

Function GetInfoFromClosedFile(ByVal wbPath As String, _
    wbName As String, wsName As String, cellRef As String) As Variant
Dim arg As String
    GetInfoFromClosedFile = ""
    If Right(wbPath, 1) <> "" Then wbPath = wbPath & ""
    If Dir(wbPath & "" & wbName) = "" Then Exit Function
    arg = "'" & wbPath & _
        "[" & wbName & "]" & _
        wsName & "'!" & _
        Range(cellRef).Address(True, True, xlR1C1)
    On Error Resume Next
    GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
End Function

Denne metoden har en begrensing på hvor mange celler det kan hentes informasjon fra siden Excel4-makroen oppretter linker til den lukkede arbeidsboken. Se eventuelt et tilsvarende eksempel som benytter ADO dersom du trenger å hente mye data fra en lukket arbeidsbok.

Det er ofte mye enklere å åpne arbeidsboken for å lese data fra den. Dersom Application.ScreenUpdating settes til False vil brukerne sannsynligvis ikke legge merke til at arbeidsboken åpnes og lukkes igjen.

Sub GetDataFromClosedWorkbook()
Dim wb As Workbook
    Application.ScreenUpdating = False ' slå av skjermoppdateringen
    Set wb = Workbooks.Open("C:\Foldername\Filename.xls", True, True) 
    ' åpner kildearbeidsboken, kun for lesing
    With ThisWorkbook.Worksheets("TargetSheetName")
        ' les inn data fra kildearbeidsboken
        .Range("A10").Formula = _
            wb.Worksheets("SourceSheetName").Range("A10").Formula
        .Range("A11").Formula = _
            wb.Worksheets("SourceSheetName").Range("A20").Formula
        .Range("A12").Formula = _
            wb.Worksheets("SourceSheetName").Range("A30").Formula
        .Range("A13").Formula = _
            wb.Worksheets("SourceSheetName").Range("A40").Formula
    End With
    wb.Close False ' lukk kildearbeidsboken uten å lagre noen endringer
    Set wb = Nothing ' frigjør minne
    Application.ScreenUpdating = True ' slå på skjermoppdateringen
End Sub

Her er en annen variant:

Sub CopyFromClosedWB(strSourceWB As String, _
    strSourceWS As String, strSourceRange As String, _
    rngTarget As Range)
' kopierer informasjon fra en lukket arbeidsbok
' brukes f.eks. slik for å kopiere informasjon til det aktive regnearket:
' CopyFromClosedWB "C:\Foldername\Filename.xls", "Sheet1", "A1:D100", Range("A1")
Dim wb As Workbook
    Application.ScreenUpdating = False ' slå av skjermoppdatering
    Application.StatusBar = "Kopierer data fra " & strSourceWB & "..."
    On Error Resume Next ' ignorer feil
    ' åpne datakilden, kun lesetilgang
    Set wb = Workbooks.Open(strSourceWB, True, True)
    On Error GoTo 0 ' stopp ved feil
    If Not wb Is Nothing Then ' åpnet arbeidsboken
        On Error Resume Next ' ignorer feil
        With wb.Worksheets(strSourceWS).Range(strSourceRange)
            .Copy rngTarget
        End With
        On Error GoTo 0 ' stopp ved feil
        wb.Close False ' lukk datakilden uten å lagre endringer
        Set wb = Nothing ' frigjør minne
    End If
    Application.StatusBar = False ' nullstill statuslinjen
    Application.ScreenUpdating = True ' slå på skjermoppdatering
End Sub

Sub TestCopyFromClosedWB()
    CopyFromClosedWB "C:\Foldername\Filename.xls", _
        "SheetName", "A1:D10", Range("A1")
End Sub

 

Dokumentet er sist oppdatert 2004-10-14 17:48:39

Brukerkommentarer:
Ole P. fra Trondheim skrev (2006-10-01 21:01:45 CET):
Re: Lösenord
Hei!

Du kan f.eks. legge til denne funksjonen i løsningen din og tilpasse den med korrekt filnavn og passord til arbeidsboken med passordet.
Etterpå kan du kopiere de linjene du trenger fra den andre makroen nedenfor og implementere dette i løsningen din:

Function ValidateInputPassword(strInputPassword As String) As Boolean
Dim su As Boolean, wb As Workbook, strValidPassword As String
su = Application.ScreenUpdating
If su Then
Application.ScreenUpdating = False ' slå av skjermoppdateringen
End If
On Error Resume Next
Set wb = Workbooks.Open("C:\FolderName\FileName.xls", True, True, , "ProtectionPassword")
If Not wb Is Nothing Then
strValidPassword = wb.Worksheets(1).Range("A1").Value
wb.Close False
If Len(strValidPassword) > 0 Then
ValidateInputPassword = strValidPassword = strInputPassword
End If
Set wb = Nothing
End If
If su Then
Application.ScreenUpdating = True ' slå på skjermoppdateringen
End If
End Function

Sub TestValidateInputPassword()
Dim strPassword As String
strPassword = InputBox("Passord:", "Angi passord:")
If Len(strPassword) = 0 Then Exit Sub
If Not ValidateInputPassword(strPassword) Then
MsgBox "Ugyldig passord!", vbExclamation
Exit Sub
End If
' fortsetter herfra dersom passordet er gyldig

End Sub
T-B Wal fra Sverige skrev (2006-10-01 16:00:30 CET):
Lösenord
Jag vill "gömma" ett lösenord i en cell i en stängd och lösenordsskyddad arbetsbok(2) och sedan via makro i t.ex. Auto_Open i en annan arbetsbok(1) hämta den informationen så att
arbetsboken(1) därefter kan kontrollera inskrivna lösenord via min InputBox.
Hur justerar jag enklast ovanstående makro så att arbetsbok(1) kan göra detta?
Ole P. fra Norway skrev (2005-07-02 09:50:55 CET):
Re: Makro som kan styres mot flere filer
Den informasjonen finner du her.
EXCEL-freak fra Skien skrev (2005-07-01 11:36:31 CET):
Makro som kan styres mot flere filer
Jeg har laget en makro som hente rinn og kopiere data fra en annen fil. Makroen er lagte mot et bestemt filnavn (f.eks. :SalgNorge012005.xls). Neste måned heter filen SalgNorge022005.xls.
Hvordan kan jeg endre makroen slik at den henter data fra den filen jeg velger vhj. Fil, Åpne ?
Ole P. fra Norway skrev (2005-03-15 09:09:14 CET):
Re: Filnavn i formel
Det høres ut som om formelen din oppfatter det du har skrevet i celle A1 som et ugyldig filnavn.
Funksjonene ovenfor er avhengige av fullstendige filnavn som input, f.eks. C:\Foldername\Filename.xls.
Jan A. fra Etne skrev (2005-03-15 01:28:28 CET):
Filnavn i formel
Hei.
Jeg har følgende ønske:
I celle A1 står januar.
I celle B1 vil jeg gjøre en spørring mot filnavnet nevnt i A1. Jeg får ikke dette til. Jeg må alltid skrive inn filnavnet i spørringen. Formelen godtar ikke navnet i A1?

 

 
Erlandsen Data Consulting     http://www.erlandsendata.no/   
Excel & VBA Tips   Copyright ©1999-2024    Ole P. Erlandsen   All rights reserved
E-post kontaktadresse