Avatar billede Laugesen1 Mester
31. januar 2014 - 21:25 Der er 9 kommentarer og
1 løsning

Kopier række hvis kriterium er opfyldt og slet derefter de sidste 4 celler i kildedata

Jeg har en makro der flytter data hvis et bestemt kriterium er opfyld. Når kriterium er opfyldt, kopieres rækkerne og sættes ind i området Range N50 (Tabel 1). Data i rækkerne går over 11 kolonner (A:K), - både kildedata og tabel 1 er i samme ark.

Men jeg vil gerne have søgekriterium til at fungere lidt anderledes, ved at der søges efter en værdi i nogle definerede områder.
Hvis der findes en værdi der matcher en værdi i kolonne A i kildedata, så skal rækken i kildedata kopieres og sættes ind i Tabel 1.
Derefter skal de 4 sidste celler (H:K) i den række der er kopieret, slettes i kildedata.

Eksempel:
Der søges efter et match i 3 områder: f.eks. P10:P30; R13:R33; U11:U31.
Værdien "123456" findes i et af de 3 områder, og den findes også i en række i kildedata (kolonne A).

Hele denne række kopieres og sættes ind i tabel 1. Derefter skal de sidste 4 celler i rækken (H:K) i kildedata slettes.


Makroen:

Public Sub TestFlytDataOgSlet()

Dim Tabel(1 To 300, 1 To 11) As Variant
Dim i As Integer, j As Integer, k As Integer

Application.ScreenUpdating = False

  k = 1 ' initiering

  'Læg i tabel
  For i = 1 To 300

ThisWorkbook.Sheets("Ark1").Activate
'I stedet for at søge efter værdien "123456", skal der søges efter et match i de 3 definerede områder.
If ThisWorkbook.Sheets("Ark1").Cells(i, 1).Value = "123456" Then
            For j = 1 To 11
            Tabel(k, j) = Cells(i, j).Value
            Next j
            k = k + 1
            End If
           
            Next i
   
            For k = 1 To 300
            For j = 1 To 11
ThisWorkbook.Sheets("Ark1").Range("N50").Cells(k, j).Value = Tabel(k, j)
 
            Next j
            Next k
 
        ThisWorkbook.Sheets("Ark1").Activate
        Application.ScreenUpdating = True
       
End Sub


Er der nogen der ved hvordan man skriver det ind i makroen ?

Laugesen
Avatar billede Sitestory Mester
01. februar 2014 - 16:21 #1
Hvis jeg har forstået dig ret, tror jeg flg. virker.


Sub Test()
Dim rRange1 As Range
Dim rRange2 As Range
Dim rRange3 As Range
Dim dHit As Double
Dim lCount As Long

On Error GoTo ErrorHandle

Application.ScreenUpdating = False

Worksheets("Ark1").Activate

Set rRange1 = Range("P10:P30")
Set rRange2 = Range("R13:R33")
Set rRange3 = Range("U11:U31")

'Tjekker om værdien findes
dHit = Application.WorksheetFunction.CountIf(rRange1, 123456)
If dHit = 0 Then
  dHit = Application.WorksheetFunction.CountIf(rRange2, 123456)
End If
If dHit = 0 Then
  dHit = Application.WorksheetFunction.CountIf(rRange3, 123456)
End If

'Hvis værdien ikke fandtes, forlades proceduren
If dHit = 0 Then Exit Sub

Set rRange1 = Range("A1:A300")

'Søg værdien i kolonne A1 til A300
Set rRange2 = rRange1.Find(123456)

'Gennemløb A1 til A300. Hvis værdien findes.
'kopieres osv. Skal målområdet slettes først,
'kræver det et par linjer her.
With rRange1
  For lCount = 1 To 300
      If .Item(lCount).Value = 123456 Then
        Set rRange3 = Range("N50")
        'Find indsætningspunktet
        If Len(rRange3.Value) > 0 Then
            If Len(rRange3.Offset(1, 0).Value) > 0 Then
              Set rRange3 = rRange3.End(xlDown).Offset(1, 0)
            Else
              Set rRange3 = rRange3.Offset(1, 0)
            End If
        End If
        'Kopier
        Range(.Item(lCount), .Item(lCount, 11)).Copy rRange3
        'Slet de sidste 4 celler i området, der blev
        'kopieret fra
        Range("H" & lCount, "K" & lCount).ClearContents
      End If
  Next
End With

BeforeExit:
Set rRange1 = Nothing
Set rRange2 = Nothing
Set rRange3 = Nothing
Application.ScreenUpdating = True

Exit Sub
ErrorHandle:
MsgBox Err.Description
Resume BeforeExit
End Sub
Avatar billede Sitestory Mester
01. februar 2014 - 16:25 #2
Glemte at indsætte flg. efter sægningen i kolonne A:


If Not rFind Is Nothing Then

og et afsluttende "End If" efter "End With"


Ellers giver det en fejl, hvis værdien ikke blev fundet i kolonne A.
Avatar billede Laugesen1 Mester
02. februar 2014 - 00:42 #3
Tak for dit input.

Jeg har indsat dine to tilføjelser i makroen.
Er ikke helt sikker på at jeg har indsat linjen,
"If Not rFind Is Nothing Then" (efter sætningen i kolonne A), det rigtige sted.

Når jeg kører makroen, sker der ikke noget.

Jeg har uploadet et eksempel:
http://gupl.dk/706948/

Så vidt jeg kan se, søger makroen "kun" efter værdien "123456" i de tre områder og kolonne A.

Det er meningen, at der skal søges ud fra alle de værdier der forekommer i de tre områder, og derefter søge efter et eventuelt match med en værdi i kolonne A. I eksemplet er det 5 værdier, men det kan være mange flere.

Hvis der findes et match, skal rækken kopiers og indsættes i tabel 1 (Range N50), og de 4 sidste celler skal slettes i rækken i kildeområdet.


Makroen (med de 2 tilføjelser)

Sub TestFlytOgSlet2()
Dim rRange1 As Range
Dim rRange2 As Range
Dim rRange3 As Range
Dim dHit As Double
Dim lCount As Long

On Error GoTo ErrorHandle

Application.ScreenUpdating = False

Worksheets("Ark1").Activate

Set rRange1 = Range("P10:P30")
Set rRange2 = Range("R13:R33")
Set rRange3 = Range("U11:U31")

'Tjekker om værdien findes
dHit = Application.WorksheetFunction.CountIf(rRange1, 123456)
If dHit = 0 Then
  dHit = Application.WorksheetFunction.CountIf(rRange2, 123456)
End If
If dHit = 0 Then
  dHit = Application.WorksheetFunction.CountIf(rRange3, 123456)
End If

'Hvis værdien ikke fandtes, forlades proceduren
If dHit = 0 Then Exit Sub

Set rRange1 = Range("A1:A300")

'Søg værdien i kolonne A1 til A300
Set rRange2 = rRange1.Find(123456)
If Not rFind Is Nothing Then

'Gennemløb A1 til A300. Hvis værdien findes.
'kopieres osv. Skal målområdet slettes først,
'kræver det et par linjer her.
With rRange1
  For lCount = 1 To 300
      If .Item(lCount).Value = 123456 Then
        Set rRange3 = Range("N50")
        'Find indsætningspunktet
        If Len(rRange3.Value) > 0 Then
            If Len(rRange3.Offset(1, 0).Value) > 0 Then
              Set rRange3 = rRange3.End(xlDown).Offset(1, 0)
            Else
              Set rRange3 = rRange3.Offset(1, 0)
            End If
        End If
        'Kopier
        Range(.Item(lCount), .Item(lCount, 11)).Copy rRange3
        'Slet de sidste 4 celler i området, der blev
        'kopieret fra
        Range("H" & lCount, "K" & lCount).ClearContents
      End If
  Next
End With
End If

BeforeExit:
Set rRange1 = Nothing
Set rRange2 = Nothing
Set rRange3 = Nothing
Application.ScreenUpdating = True

Exit Sub
ErrorHandle:
MsgBox Err.Description
Resume BeforeExit
End Sub
Avatar billede Sitestory Mester
02. februar 2014 - 08:50 #4
Så trænger vi til lidt præcision i beskrivelsen:

Skal det forstås sådan, at for hver værdi/celle i de tre områder skal det tjekkes, om der er et match i kolonne A1:A300?

Og er det altid de samme 3 områder (P10:P30 osv.)?

Kan der forekomme dubletter i de 3 områder, og hvordan skal de i givet fald behandles? Hvis der fx er 2 forekomster i P10:30 og 2 forekomster i A1:300, skal forekomst 2 så matches med forekomst 2?

Hvis der kun er 1 forekomst i P10:P30 osv. og flere i A1:300, skal alle forekomster i A1:300 så behandles, eller ...?
Avatar billede Laugesen1 Mester
02. februar 2014 - 12:24 #5
Tjek om der er et match:
Det er rigtigt forstået, - for hver værdi/celle i de tre områder skal det tjekkes, om der er et match i kolonne A1:A300.

De 3 områder:
I eksemplet er det de samme 3 områder (P10:P30 osv.).
Men når jeg skal bruge makroen fremadrette, vil der kunne komme andre områder til. Men det kan jeg sikkert selv skrive ind i makroen på et senere tidspunkt. Når jeg ved hvordan det fungerer :)

Dubletter i de 3 områder og kolonne A:
Der kan ikke forekomme dubletter i de 3 områder, og heller ikke i området A1:300. Hvis værdien forekommer i A1:A300, er det kun i én celle (kolonne A).

Jeg kan godt se, at jeg fra starten skulle have lavet en mere detaljeret beskrivelse af problemet.
Håber at de nye oplysninger giver mening.
Avatar billede Sitestory Mester
02. februar 2014 - 13:41 #6
Okay, nu tror jeg, at jeg er med. Jeg har delt det op i 3 procedurer, hvor det er den første der styrer begivenhederne.


Sub TestFlytDataOgSlet()
Dim rRange1 As Range
Dim rRange2 As Range

On Error GoTo ErrorHandle

Application.ScreenUpdating = False

Worksheets("Ark1").Activate

Set rRange2 = Range("A1:A300")
Set rRange1 = Range("P10:P30")
'Kalder proceduren LoopCol
LoopCol rRange1, rRange2
Set rRange1 = Range("R13:R33")
LoopCol rRange1, rRange2
Set rRange1 = Range("U11:U31")
LoopCol rRange1, rRange2

BeforeExit:
Set rRange1 = Nothing
Set rRange2 = Nothing
Application.ScreenUpdating = True

Exit Sub
ErrorHandle:
MsgBox Err.Description
Resume BeforeExit
End Sub
Sub LoopCol(ByVal rSource As Range, ByVal rLook As Range)
Dim rCell  As Range
Dim rFind As Range

'Gennemløb A1 til A300. Hvis værdien findes.
'kopieres osv. Skal målområdet slettes først,
'kræver det et par linjer her.
For Each rCell In rSource
  'Søg værdien i kolonne A1 til A300
  Set rFind = rLook.Find(rCell.Value)
  If Not rFind Is Nothing Then
      Insert rFind
  End If
Next

End Sub
Sub Insert(ByVal rFind As Range)
Dim rDest As Range

Set rDest = Range("N50")
'Find indsætningspunktet
If Len(rDest.Value) > 0 Then
  If Len(rDest.Offset(1, 0).Value) > 0 Then
      Set rDest = rDest.End(xlDown).Offset(1, 0)
  Else
      Set rDest = rDest.Offset(1, 0)
  End If
End If
'Kopier
Range(rFind, rFind.Offset(0, 10)).Copy rDest
'Slet de sidste 4 celler i området, der blev
'kopieret fra
Range(rFind.Offset(0, 7), rFind.Offset(0, 10)).ClearContents

End Sub
Avatar billede Laugesen1 Mester
02. februar 2014 - 23:37 #7
Det er lige præcis sådan makroen skal fungere.
Den gennemløber kolonne A, hvis et match findes med en værdi i de tre områder, - kopieres rækken i kilde-data og indsættes som den skal (Range N50). Derefter slettes de 4 sidste celler i rækken i kilde-data.
Det fungerer helt igennem efter hensigten. Super godt arbejde :)

Du skal have mange tak for hjælpen.
Sender du et svar, så jeg kan give dig point.

Laugesen
Avatar billede Sitestory Mester
03. februar 2014 - 05:35 #8
Det var godt :-)
Avatar billede Laugesen1 Mester
03. februar 2014 - 10:46 #9
Nu har jeg lavet en tilpasning, så makroen kører på det ark den er tiltænkt.
Det er en fornøjelse at se det fungere, og det sparer mig for mange kopier/indsæt/slet-handlinger :)

Endnu engang tak for hjælpen med at lave denne makro :)

Laugesen
Avatar billede Sitestory Mester
03. februar 2014 - 21:16 #10
Velbekom, det er en fornøjelse, når tingene virker :-)
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