kako brisati vse vrstice z določeno vsebino

Pomoč pri delu z MS Excelom
senbric
Prispevkov: 29
Pridružen: Sr Avg 24, 2005 12:56 pm

kako brisati vse vrstice z določeno vsebino

Odgovor Napisal/-a senbric »

pozdravljeni,

Forumaši, hvala vam za vse dosedanje odgovore ko ste me rešili iz zagate.

Vedno znova pa naletim na nove probleme. Tu je en takšen.

Dvakrat na teden dobim naročilo materiala (ni druge variante) v pdf formatu (50 ali več listov). Ko ga skopiram v excell so mi določene vrstice, ki imajo v stolpcu A stalno enako vsebino, odveč in delajo zmedo. Kako jih najenostavneje izbrisati?
Sortiranje ne pride v poštev, ker se potem drugi podatki pomešajo med sabo.

lep dan
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Re: kako brisati vse vrstice z določeno vsebino

Odgovor Napisal/-a admin »

senbric napisal/-a:Sortiranje ne pride v poštev, ker se potem drugi podatki pomešajo med sabo.
Kdo je rekel :wink:. Če malce premislite je to najhitrejši način (če seveda zanemariva makro, ki pa ga, sklepam, ne znate napisati in zatorej ni opcija). Rešitev pa je banalno preprosta:
  • V prazen stolpec vpišite zaporedno številko vsake vrstice.
  • Sortirate po koloni A in odstranite odvečne
  • Sortirate po koloni z zaporednimi številkami in dobite originalno zaporedje vrstic :)
lp,
Matjaž Prtenjak
Administrator
Stenly
Prispevkov: 223
Pridružen: Sr Jul 27, 2005 11:29 pm

Odgovor Napisal/-a Stenly »

Pozdravljeni

Poskusite s to kodo:

Koda: Izberi vse

Sub Macro1()
'
  For Each c In Range("A1:A" & Range("A65536").End(xlUp + 1).Row)
If c.Value = "" Then GoTo Naprej
    vsebina = c.Value
   For Each x In Range(c.Offset(1, 0).Address & ":A" & Range("A65536").End(xlUp).Row + 1)
     If x.Value = vsebina Then Rows(x.Row & ":" & x.Row).Delete
   Next x
Naprej:
  Next c
'
End Sub
Lp
senbric
Prispevkov: 29
Pridružen: Sr Avg 24, 2005 12:56 pm

Odgovor Napisal/-a senbric »

Hvala obema za odgovore

Stenly, vaša koda mi izbriše podvojene zapise (tudi to je uporabno).
Jaz pa bi želel, da mi izbriše vse vrstice, kjer je v koloni A napisano naprimer "pošta", zato sem skušal vašo kodo predelati a mi ne uspe, saj o makrojih vem premalo (skoraj nič)

Sub Macro1()
'
For x = 1 To 5000
If Range("a" & x).Value = "pošta" Then Rows(x.Row). Delete
Next x
'
End Sub

kaj sem naredil narobe?
kljuka13
Prispevkov: 257
Pridružen: Po Sep 10, 2007 4:29 pm
Kraj: Maribor

Odgovor Napisal/-a kljuka13 »

Koda: Izberi vse

Sub brisi()
Dim i

For i = 1 To 250
    If Range("A" & i).Value = "pošta" Then
        Rows(i & ":" & i).Select
        Selection.ClearContents
    End If
Next
Range("A1").Select
End Sub
        
[img]http://shrani.si/f/3t/YL/4W2P37B9/office.gif[/img]
[img]http://shrani.si/f/12/aa/1rt1wj6i/1/userbardionaea.gif[/img]
[img]http://shrani.si/f/3D/nN/3RQySBCl/vista-copy.gif[/img]
senbric
Prispevkov: 29
Pridružen: Sr Avg 24, 2005 12:56 pm

Odgovor Napisal/-a senbric »

kljuka13 hvala,

vašo kodo sem malo spremenil saj želim da mi vrstico izbriše, ne samo "izprazni". Dodal sem še en Go To stavek, sicer mi ni izbrisalo vrstic, kjer se je v eni pod drugo pojavljala iskana beseda.
Kolikor sem uspel preveriti koda sedaj dela OK.


Sub brisi()
Dim i
For i = 1 To 250
Nazaj:
If Range("A" & i).Value = "pošta" Then
Rows(i & ":" & i).Delete
GoTo Nazaj
End If
Next
Range("A1").Select
End Sub[/code]
senbric
Prispevkov: 29
Pridružen: Sr Avg 24, 2005 12:56 pm

kako skrajšati čas izvajanja

Odgovor Napisal/-a senbric »

torej napisal sem makro, ki mi dela to kar sem želel, vendar ker mora pregledati 2500 vrstic in poiskati 30 nezaželenih vsebin (vsaka od teh nezaželenih vsebin se lahko pojavi 1 ali večkrat) to delo traja odvisno od hitrosti računalnika 2 do 10 minut.

Ali se da namesto 30 zaporednih if stavkov, ki sem jih uporabil v svojem programu uporabiti kaj enostavnejšega. Oz kako pospešiti izvajanje makroja.

prilagam del kode makroja

Sub razvrscanje_v_stolpce()
'
' razvrscanje_v_stolpce Macro
' Macro recorded 7.2.2008 by Milan Jelen
'
' Keyboard Shortcut: Ctrl+r
'
' brisanje motečih vrstic
Sheets("vnos odpoklica").Select
Range("A1").Select

Dim i

For i = 1 To 2500
Nazaj:

If Range("A" & i).Value = "_______________________________________________________________________________" Then
Rows(i & ":" & i).Delete
GoTo Nazaj
End If
If Range("A" & i).Value = "Prosim dobaviti na:" Then
Rows(i & ":" & i).Delete
GoTo Nazaj
End If
If Range("A" & i).Value = "Podjetje" Then
Rows(i & ":" & i).Delete
GoTo Nazaj
End If
If Mid(Range("A" & i).Value, 2, 6) = "orenje" Then
Rows(i & ":" & i).Delete
GoTo Nazaj
End If
If Range("A" & i).Value = "Partizanska" Then
Rows(i & ":" & i).Delete
GoTo Nazaj
End If
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Oh seveda se da vaš makro svetlobno pohitriti predvsem pa zelo zelo zmanjšati in pač narediti berljivega in .... ok, da vam ne poberem volje do programiranja :).

Torej potrebno je narediti sledeče in potem bo makro že malce uporabnejši:
  1. Zavrteti zanko od zadaj naprej in potem ni nobenenega nepotrebnega skakanja
  2. Prekiniti osveževanje ekrana
  3. Uporabiti objekt Cells in ne Range!
  4. Znebiti se if stavkov, tako da v seznamu naštejete kaj iščete
  5. Pa bo za prvo silo kar dosti :)

Koda: Izberi vse

' www.matjazev.net
' februar 2008
Option Explicit

Function AliJeVrednostVSeznamu(Seznam, vrednost) As Boolean
  AliJeVrednostVSeznamu = True
 
  Dim i
  For i = LBound(Seznam) To UBound(Seznam)
    If (Seznam(i) = vrednost) Then Exit Function
  Next
  AliJeVrednostVSeznamu = False
End Function

Sub razvrscanje_v_stolpce()
  Dim IskaneVrednosti
  IskaneVrednosti = Array( _
      "_______________________________________________________________________________", _
      "Prosim dobaviti na:", _
      "Podjetje", _
      "Partizanska")
   
  Application.ScreenUpdating = True
    Sheets("vnos odpoklica").Select

    Dim i
    For i = 2500 To 1 Step -1
      If (AliJeVrednostVSeznamu(IskaneVrednosti, Cells(i, 1))) Then Rows(i).Delete
      
      ' tam kjer pa ne isčete celotnih nizov temveč samo del, pa je še vedno potreben if stavek!
      If Mid(Cells(i, 1).Value, 2, 6) = "orenje" Or _
         Mid(Cells(i, 1).Value, 3, 8) = "bla bla" Or _
         Mid(Cells(i, 1).Value, 10, 15) = "nekaj" Then
        Rows(i).Delete
      End If
    Next
  Application.ScreenUpdating = True
End Sub
PS: Kolikokrat je takšen makro hitrejši?
lp,
Matjaž Prtenjak
Administrator
kljuka13
Prispevkov: 257
Pridružen: Po Sep 10, 2007 4:29 pm
Kraj: Maribor

Odgovor Napisal/-a kljuka13 »

Ena napaka je tukaj Application.ScreenUpdating = True

Najprej je False in nato True. :)
[img]http://shrani.si/f/3t/YL/4W2P37B9/office.gif[/img]
[img]http://shrani.si/f/12/aa/1rt1wj6i/1/userbardionaea.gif[/img]
[img]http://shrani.si/f/3D/nN/3RQySBCl/vista-copy.gif[/img]
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:oops: Jap sem se spet "nasankal", ker sem pisal iz glave in nikoli preizkusil ...
lp,
Matjaž Prtenjak
Administrator
kljuka13
Prispevkov: 257
Pridružen: Po Sep 10, 2007 4:29 pm
Kraj: Maribor

Odgovor Napisal/-a kljuka13 »

Mene pa zanima zakaj je bolje uporabljati Cells in ne Range :roll:
[img]http://shrani.si/f/3t/YL/4W2P37B9/office.gif[/img]
[img]http://shrani.si/f/12/aa/1rt1wj6i/1/userbardionaea.gif[/img]
[img]http://shrani.si/f/3D/nN/3RQySBCl/vista-copy.gif[/img]
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

:) Računakniku je, podobno kot človeku, precej lažje delati s koordinatnim sistemom kot iskati celice vsepovprek... In pri Range objektu vi najprej izgubite čas, da združite niz "A" in številko 1 v niz "A1" potem pa računalnik zopet izgubi čas, da A1 pretvori v koordinati (1,1) in nato dostopi do iskane celice... Imate torej 2 nepotrebni pretvorbi pri vsakem dostopu in teh dostopov je 2500 * število Range objektov.... Olala mnogo mnogo več kot 10.000 ;)

Pri objektu cells pa ni nobenega pretvarjanja ne z vaše ne z računalnikove strani!
lp,
Matjaž Prtenjak
Administrator
senbric
Prispevkov: 29
Pridružen: Sr Avg 24, 2005 12:56 pm

Odgovor Napisal/-a senbric »

g. Matjaž hvala za idejo

Ker ste že vprašali, kolikokrat je vaš makro hitrejši, naj vam povem da skoraj nič (ali pa ga nisem prav prepisal - ampak deluje).

Torej "moj" makro je čistil podatke 3 min 56 sek, "vaš" pa 3 min 48 sek.
admin
Site Admin
Prispevkov: 3692
Pridružen: Sr Jul 20, 2005 10:06 pm

Odgovor Napisal/-a admin »

Tole sem šel pa "iz principa" poskusiti in nad enakimi testnimi podatki je bil predlagani makro 4x hitrejši :?

Po moje ste se nekaj zmotili. Po vsej verjetnosti niste popravili makra, tako kot vas je opozoril kljuka13, da mora biti pri prvem ScreenUpdating = false...
lp,
Matjaž Prtenjak
Administrator
senbric
Prispevkov: 29
Pridružen: Sr Avg 24, 2005 12:56 pm

Odgovor Napisal/-a senbric »

Tudi jaz sem se matral še dva večera, da bi tole pospešil, vendar mi ni uspelo.

Nato pa sem našel na temu forumu temo o naprednem filtru, ki naredi takšno filtriranje v sekundi. Rezultat filtriranja še skopiram na nov list in to je to!
Odgovori