Discussion:
Excel VBA: Cells.Find lub Match
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Marcin R.
2006-05-02 15:43:00 UTC
Permalink
Witam!
Mam w Arkuszu1 w kolumnie C ok 1000 niepowtarzających się unikatowych nazw,
np.
Marti001
Marti002
Marti003

itd posortowanych od A-Z

W Arkuszu2 w kolumnie F mam kilka tysięcy powtarzających się w/w unikatowych
nazw wymieszanych z innymi nie zdefiniowanymi w Arkuszu1.
Moje makro przy pomocy pętli, zatrzymuje się na każdej nazwie z arkusza2 i
sprawdza czy jest taka nazwa w arkuszu1. Jeśli tak to do odpowiednich
komorek tego samego wiersza arkusza1 przepisuje bądź dopisuje wartości z
odpowiednich komórek arkusza2. Problem jest kiedy nie może znaleźć tej samej
nazwy, wtedy kod się "zacina" przy dugiej takiej nieodnalezionej nazwie
(tylko pierwsza nieodnaleziona nazwa jest prawidlowo obslugiwana przez
On Error GoTo blad)
Odnajdywanie probowalem przez
Cells.Find lub Application.WorksheetFunction.Match
Chciałbym aby nieodnaleziona nazwa zostala poprostu dopisana w pierwszą pustą
komórkę kolumny C arkusza1 i aby zostało dopisane do odpowiednich komorek to
co ma być dopisane i aby kod kontynuowal dalej sprawdzanie w pętli.
Krótko mówiąc jak zabezpieczyć kod przez zatrzymywaniem się?
Jak zagnieździć w VBA Application.WorksheetFunction.IsError z
Application.WorksheetFunction.Match?
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Tajan
2006-05-02 21:19:53 UTC
Permalink
Witam!
Post by Marcin R.
Witam!
Mam w Arkuszu1 w kolumnie C ok 1000 niepowtarzaj±cych siê unikatowych
nazw, np.
Marti001
Marti002
Marti003
itd posortowanych od A-Z
W Arkuszu2 w kolumnie F mam kilka tysiêcy powtarzaj±cych siê w/w
unikatowych nazw wymieszanych z innymi nie zdefiniowanymi w Arkuszu1.
Moje makro przy pomocy pêtli, zatrzymuje siê na ka¿dej nazwie z
arkusza2 i sprawdza czy jest taka nazwa w arkuszu1. Je¶li tak to do
odpowiednich komorek tego samego wiersza arkusza1 przepisuje b±dŒ
dopisuje warto¶ci z odpowiednich komórek arkusza2. Problem jest kiedy
nie mo¿e znaleŒæ tej samej nazwy, wtedy kod siê "zacina" przy dugiej
takiej nieodnalezionej nazwie (tylko pierwsza nieodnaleziona nazwa
jest prawidlowo obslugiwana przez
On Error GoTo blad)
Odnajdywanie probowalem przez
Cells.Find lub Application.WorksheetFunction.Match
Chcia³bym aby nieodnaleziona nazwa zostala poprostu dopisana w
pierwsz± pust± komórkê kolumny C arkusza1 i aby zosta³o dopisane do
odpowiednich komorek to co ma byæ dopisane i aby kod kontynuowal
dalej sprawdzanie w pêtli.
Krótko mówi±c jak zabezpieczyæ kod przez zatrzymywaniem siê?
Jak zagnieŒdziæ w VBA Application.WorksheetFunction.IsError z
Application.WorksheetFunction.Match?
Nie ma potrzeby zagnie¿dzania WorksheetFunction.IsError, bowiem VBA
dysponuje w³asn± funkcj± IsError, przy pomocy której mozesz zbadaæ warto¶æ
zwracan± przez funkcjê Match.
W zwi±zku z tym nie ma równie¿ konieczno¶ci tworzenia procedury obs³ugi
bêdów przy pomocy On Error Goto blad. Przyk³adowy kod rozwi±zuj±cy Twój
problem, wykorzystuj±cy funkcjê Match, moze wygl±daæ nastêpuj±co:

Dim dane As Range
Dim daneKoniec As Long
Dim pierwszyWiersz As Long, ostatniWiersz As Long
Dim i As Long

Set dane = Worksheets("Arkusz1").Columns("C")
daneKoniec = dane.Cells(dane.Count, 1).End(xlUp).Offset(1, 0).Row

With Worksheets("Arkusz2")

pierwszyWiersz = 1
ostatniWiersz = .Cells(.Rows.Count, "F").End(xlUp).Row

For i = pierwszyWiersz To ostatniWiersz

If IsError(Application.Match(.Cells(i, "F"), dane, 0)) Then

Worksheets("Arkusz1").Cells(daneKoniec, "C") = .Cells(i, "F")
daneKoniec = daneKoniec + 1

End If

Next

End With

End Sub


Tajan
Marcin R.
2006-05-03 09:10:11 UTC
Permalink
Post by Tajan
If IsError(Application.Match(.Cells(i, "F"), dane, 0)) Then
Worksheets("Arkusz1").Cells(daneKoniec, "C") = .Cells(i, "F")
daneKoniec = daneKoniec + 1
End If
A gdybym chciał porównywać np. tylko pierwsze 7 znaków od lewej danej nazwy,
to jak należałoby zmodyfikować kod (przy pomocy Left() czy może należy
zmienić typ porównania z 0 na jakiś inny)
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Tajan
2006-05-03 10:27:57 UTC
Permalink
Witam!
Post by Tajan
If IsError(Application.Match(.Cells(i, "F"), dane, 0)) Then
Worksheets("Arkusz1").Cells(daneKoniec, "C") = .Cells(i,
"F") daneKoniec = daneKoniec + 1
End If
A gdybym chcia³ porównywaæ np. tylko pierwsze 7 znaków od lewej danej
nazwy, to jak nale¿a³oby zmodyfikowaæ kod (przy pomocy Left() czy
mo¿e nale¿y zmieniæ typ porównania z 0 na jaki¶ inny)
Mo¿na u¿yæ np. funkcji LICZ.JE¯ELI (COUNTIF), wykorzystuj±c w kryterium
znaki wieloznaczne.
Przyk³adowo:

If Application.CountIf(dane, Left(.Cells(i, "F"), 7) & "*") = 0 Then

Rozwi±zañ takich mo¿e byæ wiele. Wszystko zalezy od konkretnych potrzeb.
I jeszcze ma³a poprawka. W kodzie, który poda³em poprzednio, liniê:

Set dane = Worksheets("Arkusz1").Columns("C")

nale¿y zmieniæ na nastepuj±c±:

Set dane = Worksheets("Arkusz1").Columns("C").Cells

Tajan

Loading...