Avatar billede mr.handstand Novice
13. oktober 2003 - 10:01 Der er 8 kommentarer og
1 løsning

Værdier fra 100xls til totalark, forsk kolonne pr ark interessant

Jeg vil gerne arbejde videre med basis-delen fra
http://www.eksperten.dk/spm/279147
(åbne mange ark, og hente værdier fra hvert ark).
, fx. baseret på Kommentar: flemmingdahl 06/11-2002 16:28:57

Den bid jeg spørger om hjælp til går ud på at identificere de interessante kolonner, og copy-by-value et softwarenavn og en tilhørende priority (separate celler i samme række)

Data står i forskellige kolonner, men kolonnenavnet er altid ens. Data skal slutteligt stå under hinanden i en total-kolonne på det aggregerende ark, hvorefter en pivot tabel kan tælle antal forekomster op. (pivot= out of scope)

På ark "afd_X.xls" er kolonne D="Software Name", og Kolonne K="Priority" dvs der står "Software Name" i celle D1, og "Priority" i K1.
På ark "afd_Y.xls" er kolonne E=SoftwareName, og L=Priority

På andre ark vil det måske være kolonne F eller G, da hver afdeling kan finde på at indsætte "hjælpekolonner" til eget brug. Da det drejer sig om 200 ark, vil jeg helst scanne efter kolonnen hvor første celle har værdi "Software Name", og tilsvarende for Priority.

Jeg ønsker at overføre alle "par-værdier" til et aggregeret ark, således at jeg skriver en lang liste med "filnavnet" i kolonne A, Software Name i kolonne B & priority i kolonne C.

Jeg forestiller mig at man for hvert ark kan traversere række 1 efter navnene, og herefter kopiere værdier over til det andet ark, indtil man når sidste udfyldte række. Jeg arbejder selv på det i aften, men er ikke for stiv i vba-kode. Jeg kan ikke overskue at skulle udføre dette arbejde manuelt for ialt op til 100-200 ark... :-(
Avatar billede bak Forsker
13. oktober 2003 - 17:03 #1
Det kan da fikses, men jeg tager ikke helt samme udgangspunkt som du nævner.
De celler der skal hentes, står de i række 2 under "Software name" og "priority" ??
Avatar billede bak Forsker
13. oktober 2003 - 17:04 #2
hedder arknavnet det samme i alle filer ?
Avatar billede mr.handstand Novice
14. oktober 2003 - 08:42 #3
Hej Bak,
jeg havde fødselsdag igår, og fik derfor ikke vendt tilbage.

Rent faktisk så hedder arket ikke nødvendigvis det samme i hver workbook, men lige nu antager jeg at det hedder "Software total list". Jeg kan nemlig fint gå igennem alle foldere, og identificere og omdøbe arket. Det der vil drille er nemlig, at jeg bagefter er nødt til at lave samme rutine, men til et andet ark, som OGSÅ indeholder en Software Name kolonne.

For at svare på din første kommentar:
JA - de celler der skal hentes med copybyvalue står i de kolonner, hvor der i række 1 står "software name" og "priority". I hver workbook vil der være 10-120 rækker.

Her er den kode jeg selv har forsøgt med, men jeg arbejder "brute force" mht hvilke kodestumper jeg skal bruge, og pt fejler koden ved at jeg ikke kan selecte i den "anden workbook", dvs jeg ved ikke hvordan jeg skal iterere igennem række 1 og lede efter "software name" og "priotiry".

Men her er mit eget bud, som fejler, når jeg forsøger at lave "for each-løkke af celler i første række i den workbook jeg pt kigger på:

Error_handling/exit/breaks er ikke håndteret...

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 = "Software total list"                'udfyldes af bruger Arknavn

FilePath = "C:\Files\ExcelTest"                'udfyldes af bruger Startfolder
  'udfyldes af bruger Celler, der skal hentes
Application.ScreenUpdating = False
Set FS = Application.FileSearch
With FS
  .LookIn = FilePath
  .Filename = Filespec
  .SearchSubFolders = False          '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))
   
    Dim wb As Workbook
    For Each wb In Application.Workbooks
        Dim foundSoftwareName As Boolean
        foundSoftwareName = False
        If wb.Name <> ThisWorkbook.Name Then
            Dim thisIterateWorksheet As Worksheet
            For Each thisIterateWorksheet In wb.Worksheets
                If thisIterateWorksheet.Name = "Software total list" Then
                    foundSoftwareName = True
                    Dim kolonnenr As Integer
                    For kolonnenr = 1 To 10
                    Dim myValue As Variant
                    Dim tmpRange As Excel.Range
                        'thisIterateWorksheet.Range(Cells("a2")).Select
                        Range("A1:B5").Select
                       
                            For Each Object In Selection
                            Debug.Print Object.Value
'                            Debug.Print Cells("a5").Value
                            Next Object
                        Range(Cells(1, kolonnenr)).Select
                        If ActiveCell.Value = "Software name" Then
                       
                            MsgBox "found softwarename column"
                        End If
                       
                    Next kolonnenr
       
                End If
   
            Next
        End If
    Next
   
    'For Each Worksheet In Worksheets
    'Debug.Print Worksheet.Name
   
  ' Next Worksheet
   
    '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

Foreløbig tak for interessen, Bak! :-)
Avatar billede bak Forsker
14. oktober 2003 - 12:06 #4
En noget anderledes approach :
Denne kode bruger ADO til at hente data fra lukkede excel-filer.
Dvs. at den betragter et excelark som en database-tabel og henter alle data derfra med en SQL-query. Dette kan lade sig gøre fordi du har overskrifter der er ens fra fil til fil. Der har ingen betydning i hvilken kolonne overskriften står.


Sub GetAllData()
Dim FS As FileSearch
Dim FilePath As String, FileSpec As String
Dim i As Long
Dim v As Variant
Dim szSQL As String
Dim rTarget As Range
Dim ToSheet As Worksheet
'******************************
FilePath = "C:\test"
FileSpec = "*.xls"
Set ToSheet = ThisWorkbook.Worksheets("SamledeData")
szSQL = "SELECT [Software Name],[Priority] FROM [Ark1$]"
'******************************
'find excel filerne
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
'hent data
For i = 1 To FS.FoundFiles.Count
  Set rTarget = ToSheet.Range("B65536").End(xlUp).Offset(1, 0)
  rTarget.Offset(0, -1) = FS.FoundFiles(i)
  QueryWorksheet FS.FoundFiles(i), szSQL, rTarget
Next
End Sub

Public Sub QueryWorksheet(szFName As String, szSQL As String, rTarget As Range)
    Dim rsData As ADODB.Recordset
    Dim szConnect As String
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=" & szFName & ";" & _
                "Extended Properties=Excel 8.0;"
   
    Set rsData = New ADODB.Recordset
    rsData.Open szSQL, szConnect, adOpenForwardOnly, _
                adLockReadOnly, adCmdText
   
    ' Check at data er modtaget
    If Not rsData.EOF Then
        rTarget.CopyFromRecordset rsData
    Else
        MsgBox "No records returned.", vbCritical
    End If
   
    ' Clean up.
    rsData.Close
    Set rsData = Nothing
End Sub
Avatar billede bak Forsker
14. oktober 2003 - 12:08 #5
Husk at sætte reference til microsoft ActiveX data object 2.5 under vba - Tools - references
Avatar billede bak Forsker
14. oktober 2003 - 12:19 #6
Jeg skylder måske lige et par forklaringer mere
Set ToSheet = ThisWorkbook.Worksheets("SamledeData")
Her sætter du hvilket ark du vil have data samlet på. Jeg bruger overskrifterne Filnavn, Softwarename og priority i A1, B1, og C1

szSQL = "SELECT [Software Name],[Priority] FROM [Ark1$]"
Her skal du udfylde [Ark1$] med det korrekte arknavn, som er gældende for alle filer og sørge for at [Software Name],[Priority] er stavet korrekt.
Avatar billede mr.handstand Novice
15. oktober 2003 - 11:26 #7
Jeg er meget imponeret over din Excel VBA viden, Bak. Mange tak for hjælpen. Det har hjulpet mig videre!
Avatar billede mr.handstand Novice
15. oktober 2003 - 11:27 #8
sætter du lige et svar ind, så du kan få tildelt point!?
Avatar billede bak Forsker
15. oktober 2003 - 12:09 #9
Her er så et svar.
På min gamle 350mhz maskine henter den ca 5000 linier data fordelt på ialt 100 filer med overskrifter tilfældig fordelt, på 6 sekunder. :-)
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