Avatar billede qln Juniormester
20. marts 2006 - 17:09 Der er 10 kommentarer og
1 løsning

Rækker fordelt på forskellige ark efter status

Jeg har et hovedark Main, hvor en masse data vedrørende personer er angivet - én person pr. række.
I kolonne B er angivet en unik identifier/nøgle for hver person.
I kolonne C er angivet en status for denne person henholdsvis pending, ongoing og closed.
For hver status har jeg et subark, hvor jeg gerne vil have en kopi af hver række i Main arket. Hvilket ark, der skal vælges, afhænger af den status, der er angivet i Main. Når status ændres i Main, skal rækken også flyttes over i det nye ark for denne status, så rækken kun eksisterer i et subark.
Jeg ved godt, det lugter af en database, men jeg skal altså gøre det i Excel. Jeg ved ikke, om det overhovedet kan lade sig gøre at lave det så dynamisk, at det skifter fra ark til ark.
Avatar billede oyejo Nybegynder
20. marts 2006 - 19:47 #1
Sub FlyttRow()
  vArk = Cells(ActiveCell.Row, 3).Value
  vId = Cells(ActiveCell.Row, 2).Value
  vData = Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, Columns.Count))
 
  For Each wsh In ThisWorkbook.Sheets
    If Not wsh.Name = "Main" Then
      MsgBox wsh.Name
      lrad = wsh.Cells(Rows.Count, 1).End(xlUp).Row
      For Each c In wsh.Cells(2, 2).Resize(lrad, 1)
        If c.Value = vId Then
          c.EntireRow.Delete
        End If
      Next
    End If
  Next
  lrad = Sheets(vArk).Cells(Rows.Count, 1).End(xlUp).Row + 1
  Worksheets(vArk).Cells(lrad, 1).Resize(1, UBound(vData, 2)) = vData
End Sub
Avatar billede oyejo Nybegynder
20. marts 2006 - 19:49 #2
denne stiller 2 krav:
Du må markere en celle i den rad i main som skal endres
Dine arkfaner må ha samme navn som den staus som gis i kolonne C
Avatar billede oyejo Nybegynder
20. marts 2006 - 19:50 #3
Rettelse:

Sub FlyttRow()
  vArk = Cells(ActiveCell.Row, 3).Value
  vId = Cells(ActiveCell.Row, 2).Value
  vData = Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, Columns.Count))
  For Each wsh In ThisWorkbook.Sheets
    If Not wsh.Name = "Main" Then     
      lrad = wsh.Cells(Rows.Count, 1).End(xlUp).Row
      For Each c In wsh.Cells(2, 2).Resize(lrad, 1)
        If c.Value = vId Then
          c.EntireRow.Delete
        End If
      Next
    End If
  Next
  lrad = Sheets(vArk).Cells(Rows.Count, 1).End(xlUp).Row + 1
  Worksheets(vArk).Cells(lrad, 1).Resize(1, UBound(vData, 2)) = vData
End Sub
20. marts 2006 - 20:51 #4
oyejo -> der skal mere til - for når der ændres status i kolonne C, så skal "recorden" slettes i et ark og tilføjes i et andet ark.
Avatar billede oyejo Nybegynder
20. marts 2006 - 21:03 #5
->flemmingdahl,
ja for at denne skal fungere,
må man Activt kjøre makroen på nytt hver gang man har endret status i kolonne C.
Hvis ønskelig, kan den lett endres til å trigge en makro
når det skjer en endring i celler i kolonne C.

men også nå sletter den den gamle record. jfr.
c.EntireRow.Delete
Avatar billede oyejo Nybegynder
20. marts 2006 - 21:05 #6
gjrø den ikke det da?
Ble faktisk litt usikker selv :-)
Avatar billede oyejo Nybegynder
20. marts 2006 - 21:23 #7
Dim Flagg As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 Then
vArk = Cells(ActiveCell.Row, 3).Value
  vId = Cells(ActiveCell.Row, 2).Value
  vData = Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, Columns.Count))
  For Each wsh In ThisWorkbook.Sheets
    If Not wsh.Name = "Main" Then
      lrad = wsh.Cells(Rows.Count, 1).End(xlUp).Row
      For Each c In wsh.Cells(2, 2).Resize(lrad, 1)
        If c.Value = vId Then
          c.EntireRow.Delete
        End If
      Next
    End If
  Next
  lrad = Sheets(vArk).Cells(Rows.Count, 1).End(xlUp).Row + 1
  Worksheets(vArk).Cells(lrad, 1).Resize(1, UBound(vData, 2)) = vData
  Flagg = False
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 3 And (Target.Value = "A" Or Target.Value = "B" Or _
                                            Target.Value = "C") Then
  Flagg = True
End If
End Sub
Avatar billede oyejo Nybegynder
20. marts 2006 - 21:28 #8
Her må A B og C endres til de verdier som kan stå i kolonne C..

If Target.Column = 3 And (Target.Value = "A" Or Target.Value = "B" Or _
                                            Target.Value = "C") Then

Denne koden må stå i kodemodulen til selve sheet "main"
Avatar billede oyejo Nybegynder
20. marts 2006 - 21:29 #9
Rettelse, denne vil gjøre oppgaven når status endres
Når man legger inn en ny rad i manin må makro startes manuelt

Dim Flagg As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 3 And Flagg = True Then
vArk = Cells(ActiveCell.Row, 3).Value
  vId = Cells(ActiveCell.Row, 2).Value
  vData = Range(Cells(ActiveCell.Row, 1), Cells(ActiveCell.Row, Columns.Count))
  For Each wsh In ThisWorkbook.Sheets
    If Not wsh.Name = "Main" Then
      lrad = wsh.Cells(Rows.Count, 1).End(xlUp).Row
      For Each c In wsh.Cells(2, 2).Resize(lrad, 1)
        If c.Value = vId Then
          c.EntireRow.Delete
        End If
      Next
    End If
  Next
  lrad = Sheets(vArk).Cells(Rows.Count, 1).End(xlUp).Row + 1
  Worksheets(vArk).Cells(lrad, 1).Resize(1, UBound(vData, 2)) = vData
  Flagg = False
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 3 And (Target.Value = "A" Or Target.Value = "B" Or Target.Value = "C") Then
  Flagg = True
End If
End Sub
21. marts 2006 - 20:15 #10
Jeg har løst det på en anden måde... Download eksempel her http://www.smartoffice.dk/Tips/Eksperten/Index.asp

4 ark med navnene 'Database', 'Pending', 'Ongoing' og 'Closed'
På alle ark undtagen 'Database' har jeg placeret følgende kode

Private Sub Worksheet_Activate()
    Const iColStatus As Integer = 2
    Dim wksDB As Worksheet
    Dim rCell As Range
    Dim lRow As Long
   
    'Variable
    Set wksDB = Worksheets("Database")
    ' This row does nothing but workaround an Excel bug to ensure correct use of UsedRange
    lRow = wksDB.UsedRange.Rows.Count
   
    'Clean activesheet
    Me.UsedRange.Offset(1, 0).Clear
   
    ' Find and copy data
    For Each rCell In wksDB.UsedRange.Columns(iColStatus).Cells
        If UCase(rCell.Value) = UCase(Me.Name) Then
            rCell.EntireRow.Copy
            Me.Range("A65536").End(xlUp).Offset(1, 0).PasteSpecial xlPasteValues
            Application.CutCopyMode = False
        End If
    Next rCell
       
    ' CleanUp
    Set rCell = Nothing
    Set wksDB = Nothing
End Sub
Avatar billede qln Juniormester
22. marts 2006 - 15:03 #11
Super makro flemmingdahl :-)
takker
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