Avatar billede lautorp78 Nybegynder
03. november 2006 - 14:41 Der er 12 kommentarer

Makro til afspilling af array!

Jeg har lavet en lille makro til afspilling af et speicelopslag, der skal returner flere værdier ved et Lopslag. Det er sådan set også fint nok og det virker også, men mit problem består i at jeg kun kan aktivere mit opslag 1 række ad gangen (da det er en array)! Jeg har derfor indspillet en lille makro der kan løse mit problem, men ved makroen skal jeg manuelt sidde og rette range-cellerne manuelt!

Makroen ser således ud:
Range("B96:AC96").Select
    Selection.FormulaArray = "=specielopslag(RC[-1],Pivot!R[164]C[-1]:R[11537]C,2)"
    ActiveWindow.SmallScroll Down:=2

Findes der ikke en smartere måde at gøre det på - hele fidusen med at bruge ovenstående makro render lidt ud i sandet når det tager så lang tid - især når jeg har flere tusinder linier!!!
Avatar billede splokit Nybegynder
03. november 2006 - 15:12 #1
hvor er opslags værdien og hvor henter den det fra.
Avatar billede lautorp78 Nybegynder
03. november 2006 - 15:15 #2
Tror ikke det er det der er relevant. Men mit speciel opslag ser således ud:
Public Function SpecielOpslag(Kriterie As Range, Opslagsomrade As Range, ResultatKolonne) As Variant
Dim Fundet As Boolean, F_ad As Integer, S_ad As Integer, Temp() As Variant
Fundet = False
omrade = Opslagsomrade
For I = 1 To UBound(omrade)
    If omrade(I, 1) = Kriterie Then
        F_ad = I
        Fundet = True
    End If
       
   
    If omrade(I, 1) <> Kriterie And Not IsEmpty(omrade(I, 1)) And Fundet Then
      Exit For
    End If
  Next
  S_ad = I - 1
  I = (S_ad - F_ad) + 1
If Fundet Then
ReDim Temp(I) As Variant
I = 0
For T = F_ad To S_ad
    Temp(I) = omrade(T, ResultatKolonne)
    I = I + 1
Next
SpecielOpslag = Temp
Else

Det jeg er interesseret i er en makro der kan afspille array funktionen i én omgang og ikke pr. linie... Altså den skal kunne ativeres for alle linier og ikke kun én ad gangen.. (håber det giver mening)
Avatar billede splokit Nybegynder
03. november 2006 - 15:33 #3
Prøv den ved ikke om den virker

Public Function SpecielOpslag(Kriterie As Range, Opslagsomrade As Range, ResultatKolonne) As Variant
Dim Fundet As Boolean, F_ad As Integer, S_ad As Integer, Temp() As Variant
Dim c As Range
Fundet = False
omrade = Opslagsomrade
For Each c In Range("A1:A20")
    If Not IsEmpty(c.value) Then
For I = 1 To UBound(omrade)
    If omrade(I, 1) = Kriterie Then
        F_ad = I
        Fundet = True
    End If
       
   
    If omrade(I, 1) <> Kriterie And Not IsEmpty(omrade(I, 1)) And Fundet Then
      Exit For
    End If
  Next
  S_ad = I - 1
  I = (S_ad - F_ad) + 1
If Fundet Then
ReDim Temp(I) As Variant
I = 0
For T = F_ad To S_ad
    Temp(I) = omrade(T, ResultatKolonne)
    I = I + 1
Next
SpecielOpslag = Temp
Else

End If
next
End Sub
Avatar billede lautorp78 Nybegynder
03. november 2006 - 16:08 #4
Hmm, kan ikke rigtigt få det til at virke. Hvad skal jeg angive Range til at være (du har sat det til A1:A20)? Angiver det de kolonner ud af den skal returnere i eller henviser den til alle de rækker nedad jeg skal have afspillet koden i ??
Avatar billede splokit Nybegynder
03. november 2006 - 16:17 #5
opslagsværdi = "A:A" 'der hvor du har dine opslagsværdier
For Each c In Range(opslagsværdi)
Avatar billede bak Seniormester
03. november 2006 - 16:28 #6
hvorfor kan du ikke bare markere B96 til AC96 og så bare fylde nedad ?
Avatar billede splokit Nybegynder
03. november 2006 - 19:08 #7
Public Function SpecielOpslag(Kriterie As Range, Opslagsomrade As Range, ResultatKolonne) As Variant
Dim Fundet As Boolean, F_ad As Integer, S_ad As Integer, Temp() As Variant
Dim c As Range
Fundet = False
omrade = Opslagsomrade
For Each c In Range("B96:AC96")
    If Not IsEmpty(c.value) Then
For I = 1 To UBound(omrade)
    If omrade(I, 1) = Kriterie Then
        F_ad = I
        Fundet = True
    End If
       
   
    If omrade(I, 1) <> Kriterie And Not IsEmpty(omrade(I, 1)) And Fundet Then
      Exit For
    End If
  Next
  S_ad = I - 1
  I = (S_ad - F_ad) + 1
If Fundet Then
ReDim Temp(I) As Variant
I = 0
For T = F_ad To S_ad
    Temp(I) = omrade(T, ResultatKolonne)
    I = I + 1
Next
SpecielOpslag = Temp
Else

End If
next
Avatar billede lautorp78 Nybegynder
06. november 2006 - 16:26 #8
bak: Det kan jeg også godt, men igen kan jeg kun gøre det 1 linie ad gangen og ikke én gang i hele arket!
Avatar billede lautorp78 Nybegynder
06. november 2006 - 16:28 #9
Splokit: Jeg kan ikke få koden til at fungere. Uanset hvad jeg gør kommer den med en compile error (Block If without End if). Er ikke så rutineret i VBA så jeg selv kan rette det!
Avatar billede bak Seniormester
06. november 2006 - 17:41 #10
Prøv lige at køre denne makro

Sub testw()
  lastrow = Range("A65536").End(xlUp).Row
  Range("B96:AC96").Select
    Selection.FormulaArray = "=specielopslag(A96,Pivot!$A$1:$B$11537,2)"
    Selection.AutoFill Destination:=Range("B96:AC" & lastrow), Type:=xlFillDefault
End Sub


PS jeg er glad for at det ikke er min maskine der skal køre den i flere tusind linier da det kommer til at tage laaanng tid :-)
Avatar billede bak Seniormester
06. november 2006 - 17:44 #11
Sorry, når jeg nu kigger på spørgsmålet igen, må der være noget jeg har misforstået...
Avatar billede splokit Nybegynder
10. november 2006 - 14:57 #12
Jeg er ikke helt klar over hvilken måde man får Public Function til at virke på
prøv den her :S lover ikke noget
Private Sub Test()
Public Function SpecielOpslag(Kriterie As Range, Opslagsomrade As Range, ResultatKolonne) As Variant
Dim Fundet As Boolean, F_ad As Integer, S_ad As Integer, Temp() As Variant
Dim c As Range
Fundet = False
omrade = Opslagsomrade
For Each c In Range("B96:AC96")
    If Not IsEmpty(c.Value) Then
For i = 1 To UBound(omrade)
    If omrade(i, 1) = Kriterie Then
        F_ad = i
        Fundet = True
    End If
       
   
    If omrade(i, 1) <> Kriterie And Not IsEmpty(omrade(i, 1)) And Fundet Then
      Exit For
    End If
  Next
  S_ad = i - 1
  i = (S_ad - F_ad) + 1
If Fundet Then
ReDim Temp(i) As Variant
i = 0
For T = F_ad To S_ad
    Temp(i) = omrade(T, ResultatKolonne)
    i = i + 1
Next
SpecielOpslag = Temp
Else

End If
Next
End Function
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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