Avatar billede baadsager-e-box.dk Nybegynder
04. november 2002 - 15:19 Der er 14 kommentarer og
2 løsninger

Åbne flere regneark

Jeg har i en bestemt mappe 20 forskellige regneark liggende. Jeg vil så stå i et regneark som ikke ligger i samme mappe(udgangspunktet) og så vil jeg hente celle A1+ celle A2 i alle de regneark som ligger i denne mappe. I regenarkt som er udgangspunktet skal de så listes nedad.
Så mit egentlige problem er at få lavet en lykke der fortætter med at tage det næste regneark i mappen indtil der ikke er flere. Findes en sådan løkke i VBA for Excel

På forhånd tak!!
04. november 2002 - 15:34 #1
Tales vi om ark i en Excel-projektmappe - eller er der tale om flere Excel-projektmapper i en Windows-mappe
Avatar billede baadsager-e-box.dk Nybegynder
04. november 2002 - 15:36 #2
Det er flere Excel-projektmapper i en windows-mappe!!
Avatar billede hundevennen Nybegynder
04. november 2002 - 15:59 #3
det kan gøres med funktionen LOPSLAG
Avatar billede baadsager-e-box.dk Nybegynder
04. november 2002 - 16:50 #4
Det vil gøre regnearket for tungt at arbejde med. Jeg er interesseret i en VBA kode der kan løse det.
04. november 2002 - 17:29 #5
hvad hedder det ark, hvor du skal hente celle A1 og A2 fra ?
04. november 2002 - 17:34 #6
Dette her er mit svar - skal nok justeres lidt, når de nøjagtige informationer kendes - måske du selv kan gennemskue den ?

Public Sub GetDataFromOtherWorkbook()
    Dim sFolder As String
    Dim sFileToOpen() As String
    Dim wbData As Workbook
    Dim rInsert As Range
    Dim lCount As Long

    Application.ScreenUpdating = False
    Set rInsert = Sheets("Ark1").Range("A1")
    sFolder = "D:\VBA-Test\"
   
    lCount = 1
    ReDim sFileToOpen(1 To lCount)
    sFileToOpen(lCount) = Dir(sFolder + "*.xls")
    Do While Not (sFileToOpen = "")
        lCount = lCount + 1
        ReDim Preserve sFileToOpen(1 To lCount)
        sFileToOpen(lCount) = Dir
    Loop
   
    For lCount = 1 To UBound(sFileToOpen)
        Set wbData = Application.Workbooks.Open(Filename:=sFileToOpen(lCount))
        rInsert.Offset(lCount, 0).Value = wbData.Sheets("Ark1").Range("A1").Value
        rInsert.Offset(lCount, 1).Value = wbData.Sheets("Ark1").Range("A2").Value
        wbData.Close SaveChanges:=False
        Set wbData = Nothing
    Next lCount
   
    ' Clean up
    Set rInsert = Nothing
    Application.ScreenUpdating = True
End Sub
Avatar billede bak Forsker
04. november 2002 - 19:59 #7
Her er også en.
Den åbner dog ikke filerne, men henter bare værdierneSub BatchProcess()
Dim FS As FileSearch
Dim FilePath As String, FileSpec As String
Dim i As Integer
Dim v As Variant
Dim sheet As String, cell_1 As String, cell_2 As String
FilePath = "C:\dokumenter\"
FileSpec = "*.xls"
sheet = "Ark1"
cell_1 = "$A$1"
cell_2 = "$A$2"
Set FS = Application.FileSearch
With FS
  .LookIn = FilePath
  .Filename = FileSpec
  .Execute
  If .FoundFiles.Count = 0 Then
      MsgBox ("Ingen filer fundet")
      Exit Sub
  End If
End With
For i = 1 To FS.FoundFiles.Count
  v = Split(FS.FoundFiles(i), Application.PathSeparator)
  ActiveCell.Offset(i - 1, 0) = hentceller(FilePath, v(UBound(v)), sheet, cell_1)
  ActiveCell.Offset(i - 1, 1) = hentceller(FilePath, v(UBound(v)), sheet, cell_2)
Next
  Range(ActiveCell, ActiveCell.Offset(i, 1)) = Range(ActiveCell, ActiveCell.Offset(i, 1)).Value
End Sub

Function hentceller(p, f, s, c)
hentceller = "='" & p & "[" & f & "]" & s & "'!" & Range(c).Address(, , xlA1)
End Function
Avatar billede baadsager-e-box.dk Nybegynder
06. november 2002 - 09:47 #8
Så har jeg prøvet mig frem med begge to. FlemmingDahl din kommer ikke videre fra denne linie Do While Not (sFileToOpen = "").
Bak, din virker perfekt, jeg kunne bare godt tænke mig at den kun henter værdien og ikke laver en kæde. Jeg har selv prøvet men kan ikke lige få det til at hænge sammen. Kan du hjælpe?
Avatar billede bak Forsker
06. november 2002 - 10:14 #9
Linien
Range(ActiveCell, ActiveCell.Offset(i, 1)) = Range(ActiveCell, ActiveCell.Offset(i, 1)).Value
skulle gerne gøre at at kæderne forsvinder igen, idet den kopier cellerne og derefter kun indsætter værdierne.
Der findes dog en anden metode, men den har jeg ikke rigtig fået til at virke endnu...
Avatar billede bak Forsker
06. november 2002 - 11:00 #10
Okey, så lykkedes det alligevel. Denne henter fra lukkede filer uden kæderne

Skift funktionen hentceller ud med denne her og slet linien
Range(ActiveCell, ActiveCell.Offset(i, 1)) = Range(ActiveCell, ActiveCell.Offset(i, 1)).Value


Private Function hentceller(path, file, sheet, range_ref)
Dim arg As String
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
      Range(range_ref).Range("A1").Address(, , xlR1C1)
GetValue = ExecuteExcel4Macro(arg)
End Function
Avatar billede bak Forsker
06. november 2002 - 11:01 #11
UPS, en lille fejlskriv.

Private Function hentceller(path, file, sheet, range_ref)
Dim arg As String
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
      Range(range_ref).Range("A1").Address(, , xlR1C1)
hentceller = ExecuteExcel4Macro(arg)
End Function
Avatar billede bak Forsker
06. november 2002 - 16:16 #12
Lidt omskevet og lidt bedre version.

Sub GetValuesFromClosedFiles()
Dim FS As FileSearch
Dim FilePath As String
Dim i As Integer, j As Integer
Dim v As Variant
Dim Cells2Get()
Const Filespec = "*.xls"              'udfyldes af bruger Filtype
Const sheet = "Sheet1"                'udfyldes af bruger Arknavn

FilePath = "C:\test\"                'udfyldes af bruger Startfolder
Cells2Get = Array("A1", "B1", "C1")  'udfyldes af bruger Celler, der skal hentes
Application.ScreenUpdating = False
Set FS = Application.FileSearch
With FS
  .LookIn = FilePath
  .Filename = Filespec
  '.SearchSubFolders = True          'skal underfoldere også søges
  .Execute
  If .FoundFiles.Count = 0 Then
      MsgBox ("Ingen filer fundet")
      Exit Sub
  End If
  For i = 1 To .FoundFiles.Count
    v = Split(.FoundFiles(i), Application.PathSeparator)
    FilePath = Left(.FoundFiles(i), InStrRev(.FoundFiles(i), Application.PathSeparator))
    ActiveCell.Offset(i - 1, 0) = FilePath & v(UBound(v))
    For j = 0 To UBound(Cells2Get)
      ActiveCell.Offset(i - 1, j + 1) = _
                  GetValue(FilePath, v(UBound(v)), sheet, Cells2Get(j))
    Next
  Next
End With
Application.ScreenUpdating = False
End Sub

Private Function GetValue(path, file, sheet, range_ref)
Dim arg As String
arg = "'" & path & "[" & file & "]" & sheet & "'!" & Range(range_ref).Range("A1").Address(, , xlR1C1)
GetValue = ExecuteExcel4Macro(arg)
End Function
Avatar billede baadsager-e-box.dk Nybegynder
06. november 2002 - 16:23 #13
Jeg har delt pointene imellem jer, for jeg har brugt lidt fra hver og sat det sammen til en løsning, som jeg umiddelbart er tilfreds med. Tak for hjælpen
Avatar billede bak Forsker
06. november 2002 - 16:27 #14
Til dit brug skal du lige fjerne linien
ActiveCell.Offset(i - 1, 0) = FilePath & v(UBound(v))

og fjerne 1-tallet efter j i linien
ActiveCell.Offset(i - 1, j + 1) = _
                  GetValue(FilePath, v(UBound(v)), sheet, Cells2Get(j))
06. november 2002 - 16:28 #15
Jeg vil da oz lige vise en version der virker - har rettet den bette fejl.

Public Sub GetDataFromOtherWorkbook()
    Dim sFolder As String
    Dim sFileToOpen() As String
    Dim wbData As Workbook
    Dim rInsert As Range
    Dim lCount As Long

    Application.ScreenUpdating = False
    Set rInsert = Sheets("Ark1").Range("A1")
    sFolder = "D:\VBA-Test\"
   
    lCount = 1
    ReDim sFileToOpen(1 To lCount)
    sFileToOpen(lCount) = Dir(sFolder + "*.xls")
    Do While Not (sFileToOpen(lCount) = "")
        lCount = lCount + 1
        ReDim Preserve sFileToOpen(1 To lCount)
        sFileToOpen(lCount) = Dir
    Loop
    ReDim Preserve sFileToOpen(1 To lCount - 1)
    For lCount = 1 To UBound(sFileToOpen)
        Set wbData = Application.Workbooks.Open(Filename:=sFolder & sFileToOpen(lCount))
        rInsert.Offset(lCount, 0).Value = wbData.Sheets(1).Range("A1").Value
        rInsert.Offset(lCount, 1).Value = wbData.Sheets(1).Range("A2").Value
        wbData.Close SaveChanges:=False
        Set wbData = Nothing
    Next lCount
   
    ' Clean up
    Set rInsert = Nothing
    Application.ScreenUpdating = True
End Sub
Avatar billede brilleabe Nybegynder
07. juli 2003 - 23:28 #16
>>Flemmingdahl,
Det er lige det jeg står og mangler.
Bortset fra at jeg gerne vil hente en range, f.exs a5:k5, og at det ark jeg vil hente fra hedder noget med mellemrum. (har forsøgt - men kunne ikke få det til at virke).

Hvis du er interesseret i at hjælpe kan jeg oprette et nyt spørgsmål.

mvh
Peter
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