GRY-Online.pl --> Archiwum Forum

Visual Basic / makra Excel

11.05.2010
16:08
smile
[1]

Yans [ Więzień Wieczności ]

Visual Basic / makra Excel

Witam, czy ktoś tutaj jest na tyle obeznany z VBA i makrami, żeby pomóc mi w zmodyfikowaniu kodu, który ma porównywać dane między dwoma arkuszami ?
Kod wygląda jak poniżej, jeśli komuś coś to mówi, to proszę dać znać i podam wtedy dokladnie co chcę uzyskać i podeślę plik.

Sub WstawArea()

Arkusz1 = "Rent Roll - O"
Arkusz2 = "ERV Schedule - T"

Dim Area2 As Range

For Each Area2 In Worksheets(Arkusz2).Range("A7").CurrentRegion.Columns(2).Cells
If IsEmpty(Area2) Then
Area2.Value = WyszukajArea(CStr(Area2.Offset(0, -1).Value) _
, Worksheets(Arkusz1), 8)
End If
Next Area2

End Sub

Private Function WyszukajArea(Unit As String, Ark As Worksheet, Kolumna As Integer) As String

Dim Wynik As String

With Ark
On Error Resume Next
Wynik = Application.WorksheetFunction.VLookup(Unit, .UsedRange, Kolumna, False)
On Error GoTo 0
WyszukajArea = Wynik
End With
End Function

11.05.2010
16:26
[2]

albz74 [ Legend ]

Wygląda na jakąś zajebiście koronkową robotę :)

No dobra, dawaj Adam, mam chwilę :)

11.05.2010
16:42
[3]

Dym14 [ C L I N I C ]

Szczerze, to nie rozumiem tego kodu ale jestem w stanie napisać w VBA kod który porównuje dane/arkusze i wyświetla np. takie same "dane" albo osoby o takich samych nazwiskach. Ostatnio pisałem kod który wyszukuje wpisane przez nas nazwisko w 3 arkuszach a jak nie trudno się domyślić operuje to na porównywaniu. Opisz bardziej sprawę jak możesz. Nie wiem czy zdołam Ci pomóc ale spróbować mogę. Może być tutaj lub na maila [email protected] .

11.05.2010
16:57
[4]

Yans [ Więzień Wieczności ]

albz74 ====> Podaj proszę jakiegoś maila albo napisz na mojego: [email protected]

Dym14 ====> Mail z pilkiem poszedł.

Mały opis sytuacji. Podejrzewam, że rozwiązania nie ma albo jest niezwykle banalne :) Jeśli coś jest nie jasne, to proszę pytajcie :)

Chcę aby dla kolumny 1 w arkuszu 'Rent Roll - O' procedura szukała takiej samej wartości w kolumnie 1 arkusza 'ERV Schedule - T' i jeśli ją znajdzie, to z arkusza 1 'Rent Roll - O' ma skopiować wartość z kolumny 8 i wstawić w arkuszu 2 'ERV Schedule - T' w kolumnie 2

W chwili obecnej procedura przeszukuje kolumnę 1 w Arkuszu1 (Rent Roll - O) i dzięki temu znajduje wartości Area dla Unit'ów GNB26 oraz GNB48, które są inaczej posortowane niż w Arkuszu2 (ERV Schedule - T). Niestety wydaje mi się, że procedura wywraca się gdy w Arkuszu2 (ERV Schedule - T) dochodzi do końca sekcji BOUTIQUES czyli komórki B55 i nie radzi sobie z komórkami w kolejnych 4 wierszach, a tym samym nie działa już dla komórki B59. Oczywiście docelowo nie chodzi mi, żeby procedura wskazywała konkretne komórki ale opierała sie na porównaniu wszystkich wartości z kolumny 1 z Arkusza2 (ERV Schedule - T) z kolumną 1 w Arkuszu1 (Rent Roll - O).
W pliku na zielono zaznaczyłem wartości, które teraz się kopiują, a na czerwono te, które się nie kopiują. Tak dla pełnej jasności :)

11.05.2010
17:32
[5]

Mephistopheles [ Hellseeker ]

Łatwizna. Jeśli dobrze zrozumiałem, to wystarczy użyć funkcji CZY.BŁĄD.

Jeśli jeszcze nie masz rozwiązania, to ślij plik na mephraiser [małpa] gmail [kropka] com.

11.05.2010
18:06
[6]

albz74 [ Legend ]

Pliku jeszcze nie dostałem, ale zapytam dlaczego nie zrobisz tego prostą formułą, tylko używasz kodu ?

11.05.2010
18:34
smile
[7]

Dym14 [ C L I N I C ]

Nie pomogę Ci niestety. Napisałem kod ale nie jestem w stanie go zmusić do działania bo wyskakuje mi błąd Runtime error 424 Object required. Nigdy się nie spotkałem z takim błędem inne makra w innych plikach mi działają.


Oto kod ale raczej się nie przyda. To znaczy zalążek kodu bo jeżeli by zadziałał to dopisałbym jeszcze żeby samo wykrywało ilość wierszy bo jak się domyślam będzie różna.


Dim w As Integer
Dim i As Integer
For w = 9 To 66
aaa = Arkusz1.Cells(w, 8).Value
bbb = Arkusz1.Cells(w, 1).Value
For i = 7 To 66
s = Arkusz2.Cells(i, 1).Value
If bbb = s Then
Arkusz2.Cells(i, 2).Value = aaa
End If
Next i
Next w

11.05.2010
20:22
[8]

Mephistopheles [ Hellseeker ]

Yans ---> Sprawdź maila, bo nie wiem, czy - w zależności od potrzeb - rozwiązałem wszystkie problemy niezwykle prostym i błyskotliwym sposobem, czy odwaliłem tanią chałturę, którą wstyd ludziom pokazać. :P

11.05.2010
20:44
[9]

albz74 [ Legend ]

Meph - ręcznie się to robi w 0,3 sek

W zasadzie efekt można osiągnąć zwykłym vlookupem. Nie wiem, dlaczego Yans chce tam mieć makro.

No właśnie, dlaczego ??????

11.05.2010
21:01
[10]

Mephistopheles [ Hellseeker ]

Tyle tylko, że sposób "odręczny" (o ile myślimy o tym samym) wysypie się jak landrynki z puszki, jeśli dopisze się jakąkolwiek dodatkową wartość. Ale jeśli ilość komórek w drugiej tabeli ma być stała, to rozwiązanie nie wymaga jakiejś strasznej pracy.

11.05.2010
21:46
[11]

albz74 [ Legend ]

Meph- jak zbudujesz formułę, to nic się nie wysypie bo to Ty masz kontrolę, gdzie ją wkleisz. Wzmiankowane makro wysypuje się na metodzie CurrentRegion, które to nie lubi zmian zawartości w skrajnych komórkach, stąd zaznacza obszar , który nie zawiera wszystkich wymaganych wierszy.

Rozwiązań jest wiele; sprawdzanie, który wiersz jest pierwszy pusty, który wiersz nie ma w pierwszej kolumnie odpowiedniego numeru (numerowanie jest charakterystyczne), etc. W zależności od tego, jak rozwiązanie ma być 'eleganckie' i uniwersalne, można to makro zbudować na wiele sposobów. Ale tak naprawdę, wystarczy formuła, jeżeli arkuszy nie jest 1000.

12.05.2010
09:23
[12]

albz74 [ Legend ]

Ok, już wiem. Jak zwykle coś, na co trudno wpaść.

For Each Area2 In Worksheets(Arkusz2).Range("A7").CurrentRegion.Columns(2).Cells
If IsEmpty(Area2) Then

Area2.Value = WyszukajArea(CStr(Area2.Offset(0, -1).Value) _
, Worksheets(Arkusz1), 8)
End If
Next Area2


Warunek, żeby zadziałało wyszukiwanie jest taki, żeby komórka była pusta. Pola zaznaczone na czerwono nie są puste, są tam wstawione spacje, których oczywiście nie widać, dopóki się nie zacznie edytować komórki. Po usunięciu spacji makro działa do końca poprawnie.

12.05.2010
12:20
smile
[13]

Yans [ Więzień Wieczności ]

Dzięki wszystkim za pomoc !!!

albz74 ====> Marcin masz oko :) To prawie jak "czeski błąd" z tymi spacjami, a w komórce A57 wstawiłem "NIE USUWAC TEGO BO PRZESTANIE DZIAŁAC MAKRO !!!" :) Masz może pomysł co zrobić, żeby uodpornić procedurę na taką spację jak w A57 ? Wtedy już by było prawie idealne :)

Meph ====> Coś takiego kombinowałem ale jednak potrzebuję elastycznego rozwiązania bez podawnia stałych zakresów. W każdym bądź razie patent z obszarem roboczym wykorzystam w innym rozwiązaniu.

Dym14 ====> Może, mimo wszystko, warto dociec skąd ten błąd ?

12.05.2010
13:44
[14]

albz74 [ Legend ]

Masz może pomysł co zrobić, żeby uodpornić procedurę na taką spację jak w A57 ? Wtedy już by było prawie idealne :)

Można :
1. Ustawić walidację danych i wpisać listę możliwych wartości - podać tylko spację. Ktokolwiek by chciał ją usunąć albo wpisać co innego - Excel zabroni
2. Zablokować komórkę - w formatowaniu komórki, zakładka protection, Locked ustawić na tak. I protect sheet. Tylko trzeba odblokować te komórki, w których makro wpisuje dane. Bo domyślnie Excel we wszystkich wstawia Locked = Yes

To tak na szybko

12.05.2010
14:22
[15]

legrooch [ MPO Squad Member ]

A może wykonać Trim na komórkach?

12.05.2010
14:53
[16]

albz74 [ Legend ]

Można, tylko obecna pętelka przelatuje po obszarach i trim się wywali bo nie działa na obiekcie, trzeba przekierować do wartości komórki

12.05.2010
14:56
[17]

legrooch [ MPO Squad Member ]

albz ==> Przy wartościach w Ifie Twoim można by zrobić dodatkową weryfikację, ale to inna sprawa :)
Zastanawia mnie jedno - po co tam są te spacje? :)

12.05.2010
15:38
smile
[18]

Pan Majonez [ Chor��y ]

https://forumarchiwum.gry-online.pl/S043archiwum.asp?ID=10272452&N=1

13.05.2010
09:51
[19]

Yans [ Więzień Wieczności ]

albz74, legrooch ====> Bardziej chodziło mi o usprawnienie samej procedury, żeby była odporna w kolumnie A na puste komórki, a nie o blokowanie komórek przed usunięciem z nich wartości przez juzka :) Ale spoko, to najwyżej przy okazji, na razie jest OK w takiej wersji jak jest.

Pan Majonez ====> Polecam strony:





A co do książek, to na przykład to:

13.05.2010
21:59
smile
[20]

Rebel Mr Spanky [ Generaďż˝ ]

Ja też się podepnę pod temat- czy najnowsza wersja VB wymaga servis pack 3, bo coś mi chce chce pójść na laptopie gdzie mam xp z servis pack 2. Jak Windows nielegalny to nie ma problemów z aktualizacją do 3 ?

© 2000-2024 GRY-OnLine S.A.