Avatar billede s_h_m Nybegynder
09. februar 2004 - 15:07 Der er 26 kommentarer og
2 løsninger

Makro til at finde og overføre data

OK - her kommer mit ambitiøse ønske:

Jeg har et datasæt i kolonnerne A til H, og et indtastningsfelt i celle K3.

Jeg vil gerne konstruere en makro der finder poster, der matcher K3, og herefter kopierer/overfører data (som værdier) fra den pågældende rækkes kolonne A, B og G til et andet sted.
Søgningen skal fortsætte til sidste brugte celle i kolonne B, da der godt kan findes flere poster, der matcher K3.

Håber ovenstående er tydeligt nok, ellers har jeg mulighed for at sende et testark, der viser hvad jeg mener.
Avatar billede bak Forsker
09. februar 2004 - 16:02 #1
send til
tommybak@netscape.net
hvis det ikke er for stort :-)

Har du tænkt på at bruge Avanceret filter (evt optag en makro).
Den butrde sagtens kunne gøre det....
Avatar billede bak Forsker
09. februar 2004 - 16:04 #2
butrde = burde
09. februar 2004 - 17:28 #3
Det kan gøres med funktionen DHENT
09. februar 2004 - 17:57 #4
Glem lige mit svar. DHENT duer ikke, og jeg kan ikke finde det gode eksempel jeg engang havde.
Avatar billede kabbak Professor
09. februar 2004 - 19:38 #5
En makro, der skulle gøre det

Sub FindOrd()
Dim Fundet() As Integer, OK As Boolean
I = 1
On Error GoTo Slut
ReDim Fundet(1)
    Søg = Range("K3")
      Columns("A:H").Select 'området den søger på ret det selv til, her kolonne A til H
      Selection.Find(What:=Søg, After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
        MatchCase:=False).Activate
        A = ActiveCell.Row
        B = ActiveCell.Column
        Færdig = Cells(A, B).Address
        Cells(A, B).Activate
        Fundet(I) = ActiveCell.Row
      I = I + 1
    Do
    ReDim Preserve Fundet(I)
      Cells.FindNext(After:=ActiveCell).Activate
        A = ActiveCell.Row
        B = ActiveCell.Column
        Cells(A, B).Activate
      If Cells(A, B).Address = Færdig Then Exit Do
        Fundet(I) = ActiveCell.Row
      I = I + 1
  Loop
Videre:

Slut:
  'Ret nedenstående til dit arknavn og kolonner
  ' du kan også lave om så det gemmer på samme ark
  For t = 1 To I - 1
  rk = Sheets("Ark2").Range("B65536").End(xlUp).Offset(1, 0).Row
  Sheets("Ark2").Range("A" & rk) = Range("A" & Fundet(t))
  Sheets("Ark2").Range("B" & rk) = Range("B" & Fundet(t))
  Sheets("Ark2").Range("C" & rk) = Range("G" & Fundet(t))
     
Next

End Sub
Avatar billede s_h_m Nybegynder
09. februar 2004 - 19:49 #6
Testark sendt (det fylder 20kb).
Avatar billede s_h_m Nybegynder
09. februar 2004 - 19:52 #7
Hej kabbak, jeg så ikke lige din kommentar inden jeg fik sendt ovenstående.
Det ser spændende ud, så jeg afprøver lige makroen.
Avatar billede s_h_m Nybegynder
09. februar 2004 - 20:08 #8
kabbak, du er inde på noget af det rigtige, men den fungere ikke helt.
Den medtager data der ikke opfylder kravet i indtastningsfeltet, og ved en af testene skriver den de første tre poster 2 gange.
Jeg har prøvet at ændre MatchCase til True, men det hjalp ikke.
Jeg kan ikke lige gennemskue, hvor den evt. laver fejlen.
Avatar billede kabbak Professor
09. februar 2004 - 20:21 #9
Ok har rettet lidt

Sub FindOrd()
Dim Fundet() As Integer, OK As Boolean
I = 1
On Error GoTo Slut
ReDim Fundet(1)
    Søg = Range("K3")
      Columns("A:H").Select 'området den søger på ret det selv til, her kolonne A til H
      Selection.Find(What:=Søg, After:=ActiveCell, LookIn:=xlValues, LookAt _
        :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False).Activate
        A = ActiveCell.Row
        B = ActiveCell.Column
        Færdig = Cells(A, B).Address
        Cells(A, B).Activate
        Fundet(I) = ActiveCell.Row
              If I > 1 Then
        For t = 1 To I - 1
          If Fundet(I) = Fundet(t) Then
          I = I - 1
        End If
        Next
      End If
      I = I + 1

    Do
    ReDim Preserve Fundet(I)
      Cells.FindNext(After:=ActiveCell).Activate
        A = ActiveCell.Row
        B = ActiveCell.Column
        Cells(A, B).Activate
      If Cells(A, B).Address = Færdig Then Exit Do
        Fundet(I) = ActiveCell.Row
              If I > 1 Then
        For t = 1 To I - 1
          If Fundet(I) = Fundet(t) Then
          I = I - 1
        End If
        Next
      End If
      I = I + 1
  Loop
Videre:

Slut:
  'Ret nedenstående til dit arknavn og kolonner
  ' du kan også lave om så det gemmer på samme ark
  For t = 1 To I - 1
  rk = Sheets("Ark2").Range("B65536").End(xlUp).Offset(1, 0).Row
  Sheets("Ark2").Range("A" & rk) = Range("A" & Fundet(t))
  Sheets("Ark2").Range("B" & rk) = Range("B" & Fundet(t))
  Sheets("Ark2").Range("C" & rk) = Range("G" & Fundet(t))
     
Next

End Sub
Avatar billede s_h_m Nybegynder
09. februar 2004 - 20:31 #10
Den medtager stadig mere end kravet.
Ved en søgning hvor der findes 2 poster medtager den 1 der ikke opfylder kravet, og ved en søgning  hvor der findes 9 poster medtager den 6 ekstra.
De ekstra poster, der har lavere rækkenummer end det søgte, placeres efter det, der opfylder kravet ved overførslen til ark2.
Avatar billede s_h_m Nybegynder
09. februar 2004 - 20:33 #11
Undskyld, jeg glemte at nævne, at den ikke længere skriver posterne 2 gange, så det er fikset.
Avatar billede kabbak Professor
09. februar 2004 - 20:42 #12
Har du husket at slætte data på ark 2 inden du kører makroen

den søger i alle celler i Columns("A:H"), måske skal den kun søge i en kolonne, så skal du rette io denne linie.

  Columns("A:H").Select 'området den søger på ret det selv til, her kolonne A til H
      Selection.Find(What:=Søg, After:=ActiveCell, LookIn:=xlValues, LookAt _
        :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
        False).Activate
Avatar billede s_h_m Nybegynder
09. februar 2004 - 20:51 #13
Ja, hele ark 2 er ryddet inden makroen kører, og jeg har prøvet at rette makroen så den kun søger i kolonne B, men den medtager stadig poster der ikke opfylder søgekravet.
Jeg kan evt. sende arket inklusive din imponerende makro, hvis det kan hjælpe til forståelsen.
Avatar billede kabbak Professor
09. februar 2004 - 20:54 #14
det må du gerne sendtil#kabbak@tiscali.dk

fjern sendtil#
Avatar billede bak Forsker
09. februar 2004 - 20:56 #15
ark sendt retur.
Jeg har gjort overførslen meget enkel
Date er navngivet database, indtastningsområdet er navngivet Indtastning og resultatområdet - > output.
Disse områder kan sagtens befinde sig på forskellige ark.
Det, der står som overskrift i output-området er det som overføres.
Det, som står som overskrift i Indtastning er det der søges efter.

Sub Transfer
[database].AdvancedFilter xlFilterCopy, [Indtastning], [output], True
End Sub
09. februar 2004 - 21:00 #16
Stopper lige mit abonnement på dette spørgsmål - i spammer jo min mailbox *gg*
Avatar billede bak Forsker
09. februar 2004 - 21:01 #17
:-)
Avatar billede s_h_m Nybegynder
09. februar 2004 - 21:08 #18
-> bak
Det ser jo ikke så imponerende ud som kabbak's makro, men det ser ud til at virke.
Men hvad sker der, hvis området der hedder database udvides?
Det vil nemlig ske løbende.
Avatar billede s_h_m Nybegynder
09. februar 2004 - 21:33 #19
-> kabbak
Hvis jeg følger makroen trin for trin, ser det ud til, at den første post den finder, der opfylder kravet, sættes = Færdig, hvorefter den gennemløber resten af kolonnen.
Når den når til den sidste post, begynder den forfra i kolonnen, indtil den når den række der blev sat = Færdig.
Burde makroen ikke stoppe, når den når til sidste post/celle i kolonnen?

Nå, men det er ved at være ved den tid, hvor jeg stopper for i dag, jeg vender frygtelig tilbage i morgen  ;o)
Avatar billede bak Forsker
09. februar 2004 - 21:44 #20
Det er jeg da ked af. Jeg ville da gerne lave en imponerende makro :-)

Du definere da bare databasen dynamisk.
Indsæt dette under navnet database
=FORSKYDNING(Ark1!$A$1;0;0;TÆLV(Ark1!$A$1:$A$1000);8)

eller vælg hele kolonne A:H og navngiv det database.
Avatar billede kabbak Professor
09. februar 2004 - 21:57 #21
Ok

Sub FindOrd()
Dim Fundet() As Integer, OK As Boolean
I = 1
On Error GoTo Slut
ReDim Fundet(1)
    Søg = Range("K3")
      Columns("B:B").Select 'området den søger på ret det selv til, her kolonne A til H
      Selection.Find(What:=Søg, After:=ActiveCell, LookIn:=xlValues, LookAt _
        :=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
        True).Activate
        Færdig = ActiveCell.Address
        A = ActiveCell.Row
        Færdig = A
        B = ActiveCell.Column
     
        Cells(A, B).Activate
        Fundet(I) = ActiveCell.Row
              If I > 1 Then
        For T = 1 To I - 1
          If Fundet(I) = Fundet(T) Then
          I = I - 1
        End If
        Next
      End If
      I = I + 1

    Do
    ReDim Preserve Fundet(I)
      Cells.FindNext(After:=ActiveCell).Activate
        A = ActiveCell.Row
          If A <= Færdig Then Exit Do
        B = ActiveCell.Column
        Cells(A, B).Activate
   
        Fundet(I) = ActiveCell.Row
              If I > 1 Then
        For T = 1 To I - 1
          If Fundet(I) = Fundet(T) Then
          I = I - 1
        End If
        Next
      End If
      I = I + 1
  Loop
Videre:

Slut:
  'Ret nedenstående til dit arknavn og kolonner
  ' du kan også lave om så det gemmer på samme ark

  For T = 1 To I
  If Fundet(T) <> 0 Then
    rk = Sheets("Ark2").Range("B65536").End(xlUp).Offset(1, 0).Row
  Sheets("Ark2").Range("A" & rk) = Range("A" & Fundet(T))
  Sheets("Ark2").Range("B" & rk) = Range("B" & Fundet(T))
  Sheets("Ark2").Range("C" & rk) = Range("G" & Fundet(T))
End If
Next

End Sub
Avatar billede s_h_m Nybegynder
10. februar 2004 - 08:30 #22
-> bak
Det med at navngive hele kolonneområdet faldt mig ind, lige før jeg faldt i søvn - man tænker ikke så hurtigt sidst på dagen :o)
Men det virker som det skal.

-> kabbak
Nu virker din makro også perfekt.
Nu vil jeg se lidt nærmere på den for at se, hvordan den virker, og se om jeg kan lære lidt mere VBA  :o)

Hvis de to eksperter så lige vil smide et svar, så kan jeg få delt pointene ud.
Mange tak for hjælpen.
Avatar billede kabbak Professor
10. februar 2004 - 08:32 #23
Et svar. ;-))
Avatar billede bak Forsker
10. februar 2004 - 09:41 #24
endnu et :-)
Avatar billede bak Forsker
10. februar 2004 - 09:41 #25
Pokkers, det glippede igen .......
Avatar billede s_h_m Nybegynder
10. februar 2004 - 10:38 #26
:o)
Avatar billede kabbak Professor
10. februar 2004 - 10:45 #27
tak for point. ;-))
Avatar billede bak Forsker
10. februar 2004 - 10:57 #28
og tak herfra. Denne gang har jeg da heldigvis ikke flere valgmuligheder :-)
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