vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest sobota, 18 maja 2024 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

powtarzające się wiersze/rekordy do usunięcia


otwartyotwarty rozpoczął: baku postów: 9



napisał: jottad
postów: 118


umieszczony:
27 lipca 2006
23:40

  
Cytat:

Twoj przyklad dziala jesli takie same wiersze sasiaduja ze soba.
Moj jest uniwersalny, niemniej na pewno mozna by bylo go uproscic.


Przykład Rycha, po niewielkiej przeróbce, może również usuwać duplikaty, niezależnie od ich rozmieszczenia w kolumnie:
Sub kasuj_duplikaty()
   Const kP = "B" 'kolumna porównania
   Dim w As Long
   
   'ostatni wiersz w kolumnie porównania
   w = Cells(Cells.Rows.Count, kP).End(xlUp).Row
   
   Application.ScreenUpdating = False
   While w > 1
     If Application.CountIf(Range(Cells(w, kP), Cells(1, kP)), Cells(w, kP)) > 1 Then
       Cells(w, kP).EntireRow.Delete
     End If
     w = w - 1
   Wend
   Application.ScreenUpdating = True
End Sub



Pozdrawiam
napisał: admin
postów: 613


umieszczony:
27 lipca 2006
10:20

  
Cytat:
Hej.
Może trochę prościej?


Twoj przyklad dziala jesli takie same wiersze sasiaduja ze soba.
Moj jest uniwersalny, niemniej na pewno mozna by bylo go uproscic.

Poza tym, potrzebowalem makra, ktore usuwa duplikaty z bloku danych (na przyklad 10 kolumn i 2000 wierszy).
Nie usuwalem calego wiersza, gdyz w 13. kolumnie sa inne dane, ktore byly potrzebne.

To mi sie natomiast bardzo podoba:

w = Cells(Cells.Rows.Count, kP).End(xlUp).Row

napisał: baku
postów: 26


umieszczony:
27 lipca 2006
08:08

  
dziękuję! ... bardzo mi to pomogło ...
pozdrawiam
napisał: Rycho
postów: 291


umieszczony:
27 lipca 2006
00:45

  
Hej.
Może trochę prościej?
Sub kasuj_duplikaty()
  Const kP = "B" 'kolumna porównania
  Dim w As Long
  
  'ostatni wiersz w kolumnie porównania
  w = Cells(Cells.Rows.Count, kP).End(xlUp).Row
  
  Application.ScreenUpdating = False
  While w > 1
    If Cells(w, kP) = Cells(w - 1, kP) Then
      Cells(w, kP).EntireRow.Delete
    End If
    w = w - 1
  Wend
  Application.ScreenUpdating = True
End Sub

napisał: admin
postów: 613


umieszczony:
26 lipca 2006
20:21

  
Może tak:

Umiesc to w kodzie modułu zwykłego
Option Explicit

Sub Wiersz(oCell As Range, ByRef startRow As Long, ByRef endRow As Long)

Dim k As Long

startRow = oCell.Row

Do While oCell.Value <> ""
  k = k + 1
  Set oCell = oCell.Offset(1, 0)
Loop

endRow = startRow + k - 1

End Sub
Sub Kolumna(oCell As Range, ByRef startCol As Long, ByRef endCol As Long)

Dim k As Long

startCol = oCell.Column

Do While oCell.Value <> ""
  k = k + 1
  Set oCell = oCell.Offset(0, 1)
Loop

endCol = startCol + k - 1

End Sub

Sub Dopp_Weg()

Dim oCell As Range

Dim startRow As Long
Dim endRow As Long
Dim startCol As Long
Dim endCol As Long
Dim KolumneNR As Long
Dim i As Long, m As Long, n As Long, k As Long
Dim cKlasse As Collection
Dim oEl, oEl2
Dim oKlasse As clsKlasse
Set cKlasse = New Collection

k = 0

Wiersz ActiveCell, startRow, endRow
Kolumna ActiveCell, startCol, endCol

Dim bJest As Boolean
bJest = False

For i = startRow To endRow
    For k = i + 1 To endRow
    'Numer kolumny służącej do porównywania, u nas jest to kolumna druga
        KolumneNR = 2
       If Cells(i, KolumneNR).Value = Cells(k, KolumneNR).Value Then bJest = True
    Next k
    
    If Not bJest Then
        Set oKlasse = New clsKlasse
        
        For k = startCol To endCol
            oKlasse.Col.Add Cells(i, k).Value
        Next k
        
        cKlasse.Add oKlasse
        Set oKlasse = Nothing
    End If
    bJest = False
Next i

Range(Cells(startRow, startCol), Cells(endRow, endCol)).Clear

m = startRow

For Each oEl In cKlasse
    n = startCol
    For Each oEl2 In oEl.Col
        Cells(m, n).Value = oEl2
        n = n + 1
    Next oEl2
    m = m + 1
Next oEl

End Sub



W edytorze VBA utwórz też klasę o nazwie clsKlasse
i wpisz jej kod:

Public Col As Collection

Private Sub Class_Initialize()
    Set Col = New Collection
End Sub

Private Sub Class_Terminate()
    Set Col = Nothing
End Sub



Sposób mało elegancki, ale działa:)

Pzodrawiam
napisał: popbart
postów: 56


umieszczony:
26 lipca 2006
19:31

  
Można posortować po nazwie dla pewności.
napisał: baku
postów: 26


umieszczony:
26 lipca 2006
15:58

  
układ jest taki jak w tabeli, którą przedstawiłem wcześniej ...
czyli może być łatwiej ... tak myślę ...

bo elementy powtarzają się po sobie ... czyli

rower
rower
pąpka
łańcuch
łańcuch
dędka
licznik
opona
koło
koło

a liczba porządkowa może być usunieta ... (cały wiersz)
Dzięki,
Pozdrawiam
napisał: baku
postów: 26


umieszczony:
26 lipca 2006
11:15

  
Witam Szacowne Towrzystwo,:)

Posiadam dużą tabelę, gdzie niektóre wiersze się powtarzają.
lp | nazwa } nr
---------------
1 | Rower | 2
2 | Rower | 2
3 | Koło | 1
4 | Łańcu | 3

i chciałbym, żeby makro usuwało mi cały wiersz gdzie istnieją powtarzające się elementy w drugiej kolumnie - B, przeszukując dany obszar.
W tym przypadku chciałbym aby usunęło mi poz. 2 (lub 1 - obojętnie, byle nie było dwóch takich samych)

Za wszelką pomoc dziękuję i pozdrawiam
Jakub


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z