Avatar billede folj Forsker
25. februar 2014 - 09:18 Der er 8 kommentarer og
1 løsning

VBA-Excel: Henta dataarray fra enden fil ind

Til noget automatisering i Excel, har jeg brug for at hente nogle data ind i eksempelvis en function.

Jeg vil gerne kunne trække data fra en anden

fil "Produktionsplan.xls", sheet ("Plan"), range(F5:F11)

Kan dette gøres uden at åbne filen ?
Jeg foretrækker at hente Dataområdet ind som et array, men hvis det bliver for kompliceret, så bare svar på hvordan jeg henter værdien af en enkelt celle.
Avatar billede kabbak Professor
25. februar 2014 - 15:38 #1
Filen skal åbnes, men det ses ikke

Public Sub test()
Dim Data As Variant
    Application.ScreenUpdating = False
    If Not WorkbookIsOpen("Produktionsplan.xls") Then    ' tjekker om filen er åben
        Workbooks.Open Filename:=ThisWorkbook.Path & "\Produktionsplan.xls"' ret =ThisWorkbook.Path til din sti
    Else
        Windows("Produktionsplan.xls").Activate
    End If
    Data = Sheet("Plan").Range("F5:F11")    ' Finder data og læser dem ind i et Array
    ActiveWorkbook.Close False    ' lukker Produktionsplan.xls igen
    Application.ScreenUpdating = True
Avatar billede folj Forsker
27. februar 2014 - 14:05 #2
@kabbak
Jeg har hurtigt læst dit forslag...

Er bare optaget af andre vigtige opgaver lige nu, men får det testet af inden for de nærmeste dage, håber jeg.

Hav tålmodighed med mig, for jeg er lidt presset her på jobbet lige nu...

mvh Folmer
Avatar billede folj Forsker
28. februar 2014 - 13:07 #3
@kabbak

Jeg får en fejlmeddelelese om at funktionen WorkbookIsOpen ikke er defineret. Jeg gætter på at det er en funktion af dine egne du bruger til formålet.

Nu er navnet heldigvis så sigende at jeg kan regne ud at den skal returnere hhv. False eller True som svar på om filen allerede er åben.
Jeg fandt selv noget jeg kunne strikke sammen til en tilsvarende funktion som jeg så kaldte IsOpened.

Function IsOpened(DataFileName As String)

Dim objOpenWB As Workbook, objWB As Workbook

' tjek om fil allerede er åben
  For Each objOpenWB In Application.Workbooks
    If objOpenWB.Name = DataFileName Then
      Set objWB = objOpenWB ' registrerer at jeg allerede har filen åben
      DataFileName = objOpenWB.Name
      Exit For
    End If
  Next

If objWB Is Nothing Then
IsOpened = False
Else
IsOpened = True
End If

End Function


således slap jeg af med fejlen, og den åbner som forventet den ønskede fil, trækker data ud og lukker igen.

Smid lige et svar, så er der nogle poins på vej...

mvh Folmer
Avatar billede kabbak Professor
28. februar 2014 - 16:35 #4
Et svar ;-))
Avatar billede folj Forsker
08. marts 2014 - 16:33 #5
Jeg accepterede svaret, men det spiller kun delvist.
Jeg jo bruger de data jeg henter i en function af egen konstruktion, og jeg må konstatere at functionen fejler når filen først skal åbnes.

Derimod spiller functionen hver gang, hvis bare produktionsplanen stå åben i et andet vindue, for så tilgår jeg blot filen med:
  Windows("Produktionsplan.xls").Activate


Jeg spekulerer på hvordan jeg får det til at spille uden at skulle bede brugeren om at åbne Produktionsplan.xls også.

En nødløsning kunne selvfølgelig være at åbne Produktionsplan.xls i baggrunden uden at brugeren egentlig opdager det, men det bliver kun aktuelt, hvis jeg ikke med jeres hjælp kan løse det "rigtigt".

Jeg overvejer også en mulighed for at man laver en sub-procedure der henter data-arrays ind når filen åbnes, så de ligger tilgængelige for functionen mens brugeren arbejder med filen. Men kan man gemme disse variabler på en smart måde, uden at skulle bruge et sheet til dette.
Avatar billede folj Forsker
09. marts 2014 - 09:52 #6
Nu er jeg igang med at: "gemme disse variabler på en smart måde, uden at skulle bruge et sheet til dette", som jeg kaldte det.


    If CloseAgain = True Then ' hvis jeg åbende produktionsplan-filen i baggrunden, så satte jeg variablen CloseAgain til True, og derfor skal jeg lukke den igen. men først vil jeg lige gemme de data jeg hentede i Names. Her første gang bruger jeg syntaxen ThisWorkbook.Names.Add, men det er kun første gang jeg skal oprette navnet, næste gang skal jeg kun opdatere værdierne i Names. Det vil jeg gøre ved at bruge samme syntax, men uden .Add
    ThisWorkbook.Names.Add Name:="FermSlutRowNrML", RefersToR1C1:=FermSlutRowNr
    ThisWorkbook.Names.Add Name:="FermStartDataML", RefersToR1C1:=FermStartData
    ThisWorkbook.Names.Add Name:="FermSlutDataML", RefersToR1C1:=FermSlutData
    ThisWorkbook.Names.Add Name:="FermDeviceDataML", RefersToR1C1:=FermDeviceData
' nu har jeg gemt data i nams under samme navne som jeg brugte til mine arrays før.
    Workbooks(OpenWb).Close False    ' lukker Produktionsplan igen
    MsgBox "Data er nu gemt i Names, og planen er lukket igen"
    Application.ScreenUpdating = True
    End If


Jeg arbejder på at løse det i min projektmappe også (og ikke kun i tankerne). Jeg kunne blot ikke vente med at fortælle hvad planen er.
Avatar billede folj Forsker
09. marts 2014 - 10:39 #7
Hvis det skal forklares pædagogisk, så er det mere korrekt at tilgå objectet ThisWorkbook og egenskaben Names på nedenstående måde:
    With ThisWorkbook.Names("FermSlutRowNrML")
      .RefersToR1C1 = FermSlutRowNr
    End With

eller på den enkle måde:
    ThisWorkbook.Names("FermSlutRowNrML").RefersToR1C1 = FermSlutRowNr
Avatar billede folj Forsker
09. marts 2014 - 10:41 #8
Ja, der er så Objectet der hedder ThisWorkbook.Names, og egenskaben hedder i dette tilfælde RefersToR1C1
Avatar billede folj Forsker
09. marts 2014 - 11:21 #9
Nu har jeg næste problem:
Er der en der kan hjælpe mig frem til, hvordan jeg løber et array igennem, som jeg har gemt i names...

Tidligere hentede jeg arrayet ind fra et range (ca 10 celler i samme kolonne), men nu ser arrayet sådan ud (kopieret fra Names:
="327A";"325A";"327A";"325A";"327A";"325A";"327A";"325A";"327A";#N/A;#N/A;#N/A}


Jeg tror det måske har ændret sin fra at være et 2-dimmentionelt array med kun 1 kolonne til at være et simpelt enkeltdimentionelt array.

Før kunne jeg tilgå de enkelte værdier i min For-løkke med
FermStartData(i, 1)

Men forsøger nu med
FermStartData(i)
'uden held

For at teste min tilgang til et enkeldimentionelt array, lavede jeg lige nednstående test, og den virker fint, og svarer med alle værdierne:
Sub tstArray()
Dim FermStartData As Variant
FermStartData = Array(40, 46, 51, 57, 62, 68, 73, 79, 84, 90)

'For i = 1 To UBound(FermStartData, 1)
For i = 1 To UBound(FermStartData)

MsgBox FermStartData(i)
Next i
End Sub


Hjælp mig... please
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