Discussion:
czemu nie działa - excel VBA - usun wiersz
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
mnjiodek
2003-11-17 00:41:47 UTC
Permalink
mam taki kod

***************
Sub TymczasUsunWiersz()

Dim i As Long
Dim n As Long
Dim rng As Range

With ActiveWorkbook
For i = 1 To Worksheets.Count
Set r = Range("C1:C3000")
For n = 1 To r.Rows.Count
If r.Cells(n, 3) = "_" Then
Rows("n:n").Select
Selection.Delete Shift:=xlUp
End If
Next n
Next
End With

Application.ScreenUpdating = False

End Sub
******************

wiem na pewno można napisać go łatwiej

chodzi mi o to by makro przelatywało wszytskie arkusze w nich komórki w koumnie
C
jesli w komórce pokazuje się "_" (jest to wynik formuły) to żeby ten wiersz w
którym jest ta komórka był usuwany

nie ma czegos takiego jak ActiveRow wiec starałem sie napisac takie coś
nawet nie ma błedu, ale nic nie robi


bardzo prosze o pomoc
Tajan
2003-11-17 07:26:12 UTC
Permalink
Witam!
Post by mnjiodek
mam taki kod
***************
Sub TymczasUsunWiersz()
Dim i As Long
Dim n As Long
Dim rng As Range
With ActiveWorkbook
For i = 1 To Worksheets.Count
Do czego jest powyzsze ? Worksheets.Count to bardzo dluuuuuuga petla :-))))
Post by mnjiodek
Set r = Range("C1:C3000")
For n = 1 To r.Rows.Count
If r.Cells(n, 3) = "_" Then
Ale dlaczego sprawdzasz kolumne E ? Powinno byc Cells(n, 1) :-))
Post by mnjiodek
Rows("n:n").Select
Taki wiersz nie istnieje:-)) Jezeli juz to Rows(n & ":" & n).Select
Post by mnjiodek
Selection.Delete Shift:=xlUp
End If
Next n
Next
End With
Application.ScreenUpdating = False
End Sub
******************
wiem na pewno mo¿na napisaæ go ³atwiej
chodzi mi o to by makro przelatywa³o wszytskie arkusze w nich komórki w
koumnie
Post by mnjiodek
C
jesli w komórce pokazuje siê "_" (jest to wynik formu³y) to ¿eby ten
wiersz w
Post by mnjiodek
którym jest ta komórka by³ usuwany
nie ma czegos takiego jak ActiveRow wiec stara³em sie napisac takie co¶
nawet nie ma b³edu, ale nic nie robi
Nie obraz sie ale twoj kod jest nieco bez sensu. Mozna to zrobic np. tak:

Sub TymczasUsunWiersz()

Dim n As Long
Dim rng As Range

Set rng = Range("C1:C3000")

For n = rng.Count To 1 Step -1
If rng.Cells(n, 1).Value = "_" Then
rng.Cells(n, 1).EntireRow.Delete
End If
Next n

Application.ScreenUpdating = False

End Sub

Oczywiscie mozna jeszcze szybciej ale to powinno ci wystarczyc.

Tu mala zagadka. Dlaczego w petli kasujemy wiersze zaczynajac od konca
obszaru ? :-)))

Powodzenia
Tajan
Tajan
2003-11-17 07:44:44 UTC
Permalink
Witam ponownie !
Post by mnjiodek
Sub TymczasUsunWiersz()
Dim n As Long
Dim rng As Range
tu powinno byc:
Application.ScreenUpdating = False
Post by mnjiodek
Set rng = Range("C1:C3000")
For n = rng.Count To 1 Step -1
If rng.Cells(n, 1).Value = "_" Then
rng.Cells(n, 1).EntireRow.Delete
End If
Next n
Application.ScreenUpdating = False
a zamiast powyzszego: Application.ScreenUpdating = True
Post by mnjiodek
End Sub
Oczywiscie mozna jeszcze szybciej ale to powinno ci wystarczyc.
Tu mala zagadka. Dlaczego w petli kasujemy wiersze zaczynajac od konca
obszaru ? :-)))
Odpowiedz na zagadke. Gdy kasujesz wiersz n,to numer kasowanego wiersza
przyjmuje wiersz n+1 wiec nie zostanie on sprawdzony gdyz po zwiekszeniu
licznika petli nastepnym stanie sie wiersz majacy przed kasowaniem numer
n+2!
Obrazowo mowiac:
n=1 - sprawdzamy i kasujemy wiersz 1
wiersz 2 przyjmuje numer 1 !
w licznik petli zwiekszamy o 1 wiec n=2
sprawdzamy wiersz 2 (pominelismy jeden wiersz, gdyz to byl na poczatku
wiersz 3 !)

Sprawdzajac od konca unikamy takich niespodzianek !

Powodzenia
Tajan
mnjiodek
2003-11-17 10:06:48 UTC
Permalink
Post by Tajan
Witam ponownie !
Powodzenia
dziekuje bardzo za pomoc
mnjiodek
2003-11-17 10:32:45 UTC
Permalink
Post by mnjiodek
Post by mnjiodek
Sub TymczasUsunWiersz()
Dim n As Long
Dim rng As Range
Application.ScreenUpdating = False
Post by mnjiodek
Set rng = Range("C1:C3000")
For n = rng.Count To 1 Step -1
If rng.Cells(n, 1).Value = "_" Then
rng.Cells(n, 1).EntireRow.Delete
End If
Next n
Application.ScreenUpdating = False
a zamiast powyzszego: Application.ScreenUpdating = True
Post by mnjiodek
End Sub
a jednak nie działa :(((
jednak nie wiem czemu

"-" jest wynikiem formuły która jest w tej komórce - może to coś pieprzy
pxd74
2003-11-17 11:15:10 UTC
Permalink
(...)
Post by mnjiodek
Post by Tajan
If rng.Cells(n, 1).Value = "_" Then
(...)
Post by mnjiodek
"-" jest wynikiem formuły która jest w tej komórce - może to coś pieprzy
To w końcu minus czy podkreślenie?
Zdecyduj się.
--
Pozdrowienia
***@poczta.onet.pl
mnjiodek
2003-11-17 15:51:56 UTC
Permalink
Post by pxd74
(...)
Post by mnjiodek
Post by Tajan
If rng.Cells(n, 1).Value = "_" Then
(...)
Post by mnjiodek
"-" jest wynikiem formuły która jest w tej komórce - może to coś pieprzy
To w końcu minus czy podkreślenie?
Zdecyduj się.
w kodzie jest podkreslenie i w komórkach też jest
Tajan
2003-11-17 11:25:17 UTC
Permalink
a jednak nie dzia³a :(((
jednak nie wiem czemu
"-" jest wynikiem formu³y która jest w tej komórce - mo¿e to co¶ pieprzy
A jaki ma byc znak "-" czy "_" ? Jakby co, mozesz podeslac fragment rkusza
na priv, bedzie latwiej cos powiedziec. Value to Value niezaleznie od tego
czy jest bezposrednio wpisane czy tez jest wynikiem formuly.

pozdrwiam
Tajan
mnjiodek
2003-11-17 15:56:07 UTC
Permalink
Post by Tajan
Post by mnjiodek
a jednak nie działa :(((
jednak nie wiem czemu
"-" jest wynikiem formuły która jest w tej komórce - może to coś pieprzy
A jaki ma byc znak "-" czy "_" ? Jakby co, mozesz podeslac fragment rkusza
na priv, bedzie latwiej cos powiedziec. Value to Value niezaleznie od tego
czy jest bezposrednio wpisane czy tez jest wynikiem formuly.
przepraszam najmocniej

makro ładnie działa z poziomu arkusza w którym się jest
jednak ja chciałbym uruchamiac to makro z poziomu innego arkusza
więc dawałem pętle

For i = 1 To Worksheets.Count
Next

ale nawet z ta pętlą nie działa

no i makro jest podpiete pod pole tekstowe, nie wiem czy coś to zmienia
pxd74
2003-11-17 20:47:11 UTC
Permalink
Post by mnjiodek
makro ładnie działa z poziomu arkusza w którym się jest
jednak ja chciałbym uruchamiac to makro z poziomu innego arkusza
więc dawałem pętle
For i = 1 To Worksheets.Count
Next
ale nawet z ta pętlą nie działa
A tą linię:

Set rng = Range("C1:C3000")

przerobiłeś na:

Set rng = Worksheets(i).Range("C1:C3000")

?
--
Pozdrowienia
***@poczta.onet.pl
mnjiodek
2003-11-17 20:49:49 UTC
Permalink
Post by Tajan
Set rng = Range("C1:C3000")
Set rng = Worksheets(i).Range("C1:C3000")
?
no, właśnie, że nie ;)

teraz działa dobrze, jednak wykonuje sie dośc długo (ponad minutę)- czy można to
przyspieszyc?

dziekuje za pomoc
pxd74
2003-11-17 21:25:43 UTC
Permalink
Post by mnjiodek
teraz działa dobrze, jednak wykonuje sie dośc długo (ponad minutę)- czy
można to przyspieszyc?
Tak.
Nie stosuj pętli For ... Next tylko wykorzystaj właściwość Find jak Ci
podałem w wątku "Równoczesnośc procedur i .... coś tam coś tam :-)
To powinno pomóc, chyba że masz strasznie duzo tych arkuszy.
--
Pozdrowienia
***@poczta.onet.pl
Loading...