Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Kanal D va difuza serialul “...

Upgrade xiaomi mi11

securitate - acum se dau drept - ...

Farmacia Dr Max - Pareri / Sugest...
 De unde cumparati suspensii / gar...

[UNDE] Reconditionare obiecte lemn

Infiltratii casa noua

sugestie usa interior
 ANAF si plata la selfpay

Imprimanta ciss rezista perioade ...

Garmin fēnix 7 / PRO / Saphi...

Care sunt cele mai mari regrete a...
 Alfa Romeo Stelvio 2.2 jtd

Intrebari srl nou

La multi ani @AndReW99!

Alegere masina £15000 uk
 

comparare 2 coloane date

- - - - -
  • Please log in to reply
3 replies to this topic

#1
credit

credit

    Member

  • Grup: Members
  • Posts: 621
  • Înscris: 04.05.2007
Am in sheet1 in range-ul (a1:a5) seriile: 1,2,3,4,5
Am in sheet2 in range-ul(a1:a8) seriile: 1,22,3,15,16,4,10,2.

Intrebarea este urmatoarea.

Fiecare numar in parte din sheet1 trebuie sa existe in sheet2 (nu conteaza daca exista o singura data sau de mai multe ori). In cazul in care vreun numar din sheet1 nu are pereche corespondenta in sheet2, intregul rand din sheet1 va fi sters.

Ma puteti ajuta sa fac acest lucru in VBA la apasarea unui buton?

#2
gecs

gecs

    Member

  • Grup: Members
  • Posts: 795
  • Înscris: 12.02.2008
Pui codul de mai jos intr-un modul, faci butonul si asociezi macro-ul la butonul cu pricina.

Option Explicit

Sub StergeRanduri()
	Dim rg1, rg2 As Range
	Dim i As Long
	Set rg1 = ThisWorkbook.Worksheets("Sheet1").Range("A1:A5")
	Set rg2 = ThisWorkbook.Worksheets("Sheet2").Range("A1:A8")
	Application.ScreenUpdating = False
	For i = rg1.Cells(rg1.Rows.Count).Row To rg1.Cells(1).Row Step -1
		If rg2.Find(rg1.Cells(i).Value, lookat:=xlWhole) Is Nothing Then
			ThisWorkbook.Worksheets("Sheet1").Range(i & ":" & i).Select
			Selection.Delete Shift:=xlUp
		End If
	Next i
	ThisWorkbook.Worksheets("Sheet1").Range("A1").Select
	Application.ScreenUpdating = True
	Set rg1 = Nothing: Set rg2 = Nothing
End Sub

Trick-ul unei rutine in care intr-un ciclu vrei sa stergi un rand in functie de o anumita conditie e sa faci acel ciclu (bazat pe numarul randului) in ordine inversa, adica de la coada la cap, pentru ca in felul asta nu mai denaturezi numarul randului pe care urmeaza sa-l verifici, cum se intampla daca faci ciclul in ordine crescatoare.

#3
credit

credit

    Member

  • Grup: Members
  • Posts: 621
  • Înscris: 04.05.2007

 gecs, on 6th August 2011, 09:23, said:

Pui codul de mai jos intr-un modul, faci butonul si asociezi macro-ul la butonul cu pricina.

Trick-ul unei rutine in care intr-un ciclu vrei sa stergi un rand in functie de o anumita conditie e sa faci acel ciclu (bazat pe numarul randului) in ordine inversa, adica de la coada la cap, pentru ca in felul asta nu mai denaturezi numarul randului pe care urmeaza sa-l verifici, cum se intampla daca faci ciclul in ordine crescatoare.



Ai dreptate, daca mergi de la cap la coada apar erori in momentul in care sunt doua randuri consecutive care trebuiesc sterse, al doilea rand ti-l sare deoarece primul rand fiind sters, al doilea rand devine primul.

Pentru a evita chestia asta eu faceam intai un clearcontents pe rand si de abia dupa aia veneam cu delete rows. Evident ca nu imi placea metoda deoarece la baze de date mari se pierdea mai mult timp. Cautam o rezolvare eleganta.
Multumesc mult. Le ai cu vb-ul :peacefingers:

#4
gecs

gecs

    Member

  • Grup: Members
  • Posts: 795
  • Înscris: 12.02.2008
Codul de mai jos poate fi rulat din orice foaie a workbook-ului (fara buton, cu Alt+F8 -> selectat StergeRanduri -> Run) si afiseaza si in StatusBar un mesaj cu numarul randului ce a fost sters. Daca faci un test cu primele 1000 de celule din Sheet1, coloana A, o sa vezi ca in urma rularii ramai cu valorile din Sheet2, coloana A, numai ca ordonate crescator.


Option Explicit

Sub StergeRanduri()
	Dim rg1, rg2 As Range
	Dim i As Long
	Set rg1 = ThisWorkbook.Worksheets("Sheet1").Range("A1:A1000")
	Set rg2 = ThisWorkbook.Worksheets("Sheet2").Range("A1:A8")
	Application.ScreenUpdating = False
	For i = rg1.Cells(rg1.Rows.Count).Row To rg1.Cells(1).Row Step -1
		If rg2.Find(rg1.Cells(i).Value, lookat:=xlWhole) Is Nothing Then
			ThisWorkbook.Worksheets("Sheet1").Range(i & ":" & i).Delete Shift:=xlUp
			Application.StatusBar = "Sters randul " & i
		End If
	Next i
	Application.ScreenUpdating = True
	Application.StatusBar = False
	Set rg1 = Nothing: Set rg2 = Nothing
End Sub


Anunturi

Bun venit pe Forumul Softpedia!

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate