Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 70581 Skopiuj do schowka Warunek If... Then ... - osobliwy przebieg kodu
Autor Wiadomość
Leon M 
Exceloholic


Wersja: Win Office 2010
Posty: 131
Wysłany: 05-04-2021, 14:45   Warunek If... Then ... - osobliwy przebieg kodu

Szanowni Forumowicze,

Zwracam się do Was o pomoc w nurtującym mnie problemie, o którym poniżej.

Chodzi o porównywanie wartości dwóch tablic.
Porównanie dokonuje się w pętli For, gdy pozycje są sobie równe ma być wykonany określone instrukcje.
Przedstawiam kod, który obrazuje problem porównywania, z jakim borykam się w makrze.
Kod:


a = lista(1)
b = daneOs(34, 1)

Cells(2, "D") = a
Cells(2, "E") = b

If a <> b Then Cells(2, "F") = "Prawda"                             'Warunek 1
If a = b Then Cells(2, "G") = "Prawda"                              'Warunek 2

If lista(1) <> daneOs(34, 1) Then Cells(2, "H") = "Prawda"          'Warunek 3
If lista(1) = daneOs(34, 1) Then Cells(2, "I") = "Prawda"           'Warunek 4

If Cells(2, "D") <> Cells(2, "E") Then Cells(2, "J") = "Różne"      'Warunek 5
If Cells(2, "D") = Cells(2, "E") Then Cells(2, "K") = "Takie same"  'Warunek 6



Komórki Cells(2, "D") i Cells(2, "E") są sobie równe. Warunek 6 jest spełniony.
Wartość lista(1) jest równa wartości daneOs(34, 1). Więc powinien być spełniony Warunek 2 i Warunek 4.

Dziwnym natomiast jest to, że kod uznaje za spełnione równocześnie warunki 1 i 2 oraz 3 i 4, co powoduje, że porównywanie poszczególnych pozycji tych dwóch tablic nie działa.
Dwie wartości nie mogą być jednocześnie równe sobie i za razem różne od siebie.
Gdzieś tkwi błąd.

Uprzejmie proszę o pomoc w rozwiązaniu problemu, za co z góry bardzo dziękuję.
ID posta: 403190 Skopiuj do schowka
 
 
wczesny 
Stały bywalec Excelforum


Wersja: Win Office 2016
Pomógł: 32 razy
Posty: 300
Wysłany: 05-04-2021, 14:54   

Daj plik.

Zadeklaruj typ zmiennych, aby było wiadomo, co porównujesz.
ID posta: 403191 Skopiuj do schowka
 
 
umiejead 
Excel Expert


Wersja: Win Office 2013
Pomógł: 796 razy
Posty: 4303
Wysłany: 05-04-2021, 15:03   

Załącz plik.
.
_________________
.
Jak poprawnie opisać problem: http://www.excelforum.pl/...ika-vt59262.htm
Chcesz precyzyjną odpowiedź - zadaj precyzyjne pytanie.
ID posta: 403192 Skopiuj do schowka
 
 
Leon M 
Exceloholic


Wersja: Win Office 2010
Posty: 131
Wysłany: 05-04-2021, 16:07   

Niestety nie mogę zamieścić pliku, bowiem tablice zawierają wrażliwe dane osobowe.

Zmienne i tablice są typu Variant.

Poniżej przedstawiam układ pętli, w których dokonuje się porównanie.

Kod:

For i = 1 To UBound(lista)
    For j = 1 To UBound(daneOs)
   
        If lista(i) = daneOs(j, 1) Then
       
            Cells(i + 3, "K") = daneOs(j, 4)
            Exit For

        End If
       
    Next j
Next i


Dla każdego "i" wyjście z pętli wewnętrznej następuje dla j = 1.
Stąd komórki w całej kolumnie "K" otrzymują wartość daneOs(1, 4).
Ten warunek działa nieprawidłowo.
ID posta: 403193 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 2111 razy
Posty: 6618

Wysłany: 05-04-2021, 16:55   

Jak nie chcesz zamieścić pliku (dane wrażliwe można usunąć lub zmienić, a poza tym wystarczy kilka komórek jako ilustracja), to uruchom program krokowo i sprawdzaj wartości zmiennych i komórek podczas wykonania. Zobaczysz co faktycznie jest w komórkach.

Takich cudów, że równocześnie a=b i a<>b, to nawet w VBA nie ma, choć np. relacja równości nie jest przechodnia (jak nauczyliśmy się na matematyce), to znaczy z tego, że a=b i a=c nie musi wynikać, że b=c. Jest to związane z niejawną konwersją typów danych przy porównaniu, gdy porównujemy dane różnych typów.
ID posta: 403195 Skopiuj do schowka
 
 
Leon M 
Exceloholic


Wersja: Win Office 2010
Posty: 131
Wysłany: 05-04-2021, 17:53   

Dzięki, Macieju, za podpowiedź.
Jak uruchamia się program krokowo.

Mnie też to dziwi, ale kod spełnia obydwa warunki a=b i a<>b. :shock:
ID posta: 403196 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 2111 razy
Posty: 6618

Wysłany: 05-04-2021, 18:06   

Uruchomienie krokowe kodu VBA.
Otwierasz okno edytora (Alt+F11)
Ustawiasz kursor na początku procedury.
Naciskasz F8. Linia aktywna podświetla się na żółto. To jest linia, która dopiero będzie się wykonywać w następnej kolejności. Najeżdżając kursorem na zmienną na ogół można zobaczyć jej wartość. Na dole w oknie Immediate można wyświetlić wartość zmiennej po znaku zapytania, np.
Kod:
?a
Po wpisaniu tego i naciśnięciu Enter w następnym wierszu masz wartość zmiennej prostej a. Niestety nie można w ten sposób wyświetlić całych tablic, tylko pojedyncze elementy.
Jest dużo więcej opcji, ale przy tak prostym kodzie to powinno wystarczyć.
  
ID posta: 403198 Skopiuj do schowka
 
 
wczesny 
Stały bywalec Excelforum


Wersja: Win Office 2016
Pomógł: 32 razy
Posty: 300
Wysłany: 05-04-2021, 19:32   

W oknie Locals widać całe tablice. Wg mnie tam najwygodniej sprawdzać wartości i typy zmiennych.
ID posta: 403202 Skopiuj do schowka
 
 
Leon M 
Exceloholic


Wersja: Win Office 2010
Posty: 131
Wysłany: 05-04-2021, 20:58   

Dziękuję Wszystkim za podpowiedzi i wskazówki.

Niestety nie radzę sobie z rozwiązaniem tego problemu.

Dodam jeszcze taką rzecz, mianowicie, gdy przekopiuję tablice do kolumn arkusza i dokuję w pętlach analogicznego porównania, lecz na wartościach określonych komórek, odpowiadającym wartościom z tablic, procedura działa poprawnie.

Zatem wnioskuję, że problem tkwi w warunku zbudowanym na porównaniu poszczególnych pozycji tablic albo w samych tablicach.
ID posta: 403206 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 2111 razy
Posty: 6618

Wysłany: 05-04-2021, 21:55   

Obawiam się, że nie widząc Twoich danych trudno będzie Ci pomóc.
Ale trudno mi też zrozumieć dlaczego przy krokowym wykonywaniu programu nie widzisz, czy porównywane zmienne zawierają to czego oczekujesz, czy nie.
ID posta: 403207 Skopiuj do schowka
 
 
Leon M 
Exceloholic


Wersja: Win Office 2010
Posty: 131
Wysłany: 05-04-2021, 22:19   

Podam odczyt wartości z takiej oto pętli:

Kod:

For i = 1 To UBound(daneOs)

n = daneOs(i, 2)
Cells(i, "H") = n

Next i


n - empty
daneOs(i, 2) - nie pokazuje wartości
Cells(i, "H") - pokazuje taką wartość, jaką ma daneOs(i, "H")
n - empty
i - odpowiada kolejnej iteracji

Nie rozumiem, dlaczego skoro n jest puste do Cells następuje wczytanie właściwej wartości odpowiadającej danej pozycji w daneOS
ID posta: 403210 Skopiuj do schowka
 
 
Leon M 
Exceloholic


Wersja: Win Office 2010
Posty: 131
Wysłany: 05-04-2021, 22:32   

Dodam jeszcze, że tablica daneOs() jest zadeklarowana jako Public.
Tablice lista() i daneOs() są wypełniane danymi w różnych modułach.
Porównanie pozycji tych tablic dokonuje się w tym module, w którym nadawane są wartości tablicy lista().

Może ta informacja będzie pomocna do rozwiązania problemu.
ID posta: 403211 Skopiuj do schowka
 
 
umiejead 
Excel Expert


Wersja: Win Office 2013
Pomógł: 796 razy
Posty: 4303
Wysłany: 05-04-2021, 22:38   

Patrz: moja sygnaturka > link: i czytaj ze zrozumiem.
_________________
.
Jak poprawnie opisać problem: http://www.excelforum.pl/...ika-vt59262.htm
Chcesz precyzyjną odpowiedź - zadaj precyzyjne pytanie.
ID posta: 403212 Skopiuj do schowka
 
 
Leon M 
Exceloholic


Wersja: Win Office 2010
Posty: 131
Wysłany: 06-04-2021, 20:13   

Chyba znalazłem źródło błędu.

Tablica daneOs() jest wypełniona wartościami z tabeli w arkuszu w innym skoroszycie, pobranymi za pomocą funkcji GetValue. Z tak uzyskaną tablicą dzieją się dziwne rzeczy, o których pisałem powyżej.

Ale gdy tablicę daneOs() wpiszę do arkusza, a następnie wartości z arkusza załaduję z powrotem do tejże tablicy, cała procedura zaczyna działać poprawnie (m.in. porównywanie wartości tablicy lista() i daneOs() ).

Nie mam pojęcia, dlaczego tak się dzieję, ale podejrzewam, że przyczyna może tkwić w funkcji GetValue.
ID posta: 403257 Skopiuj do schowka
 
 
ąćęłńóś
Excel Expert


Pomógł: 327 razy
Posty: 1607
Wysłany: 06-04-2021, 21:55   

Przyczyn może być bardzo wiele:

Deklaracje zmiennych nie odpowiadające prawdzie, deklaracje zbyt ogólne ('Variant'), stosowanie zapisów typu 'Range("A3")' czy 'Cells(2, "F")' bez jawnego odnoszenia się do wartości '.Value' (to że 'Value' jest wartością "domyślną" dla tej konstrukcji nie oznacza, że w każdym przypadku będzie ona poprawnie "działać" bez tegoż 'Value'), same dane mogą być również źródłem błędu (zbyt "długie" liczby, brak zaokrągleń na jednakowych miejscach po przecinku dla wszystkich porównywanych wartości, itp.), porównywanie wartości z wynikami formuł, błędy twoje (których sobie nie uświadamiasz), błędy formatów danych, błędy samego excela, itp., itd., etc.
Kod:
Sub motyla_noga()
    Dim obi As Object
   
    Range("A1").Value = #1/30/2021#
   
    Set obi = ThisWorkbook.Worksheets(1).Range("A1")
   
    With Application
        Debug.Print .IsNumber(obi) & " / " & .IsNumber(obi.Value) ' ==> True / False ==> ??? :/ ???
    End With
   
    'Remarks
    '=======
    'The value arguments of the IS functions are not converted.
    'For example, in most other functions where a number is required,
    'the text value "19" is converted to the number 19.
    'However, in the formula ISNUMBER("19"), "19" is not converted from a text value,
    'and the ISNUMBER function returns FALSE.
    '
    'The IS functions are useful in formulas for testing the outcome of a calculation.
    'When combined with the IF function, they provide a method for locating errors in formulas
    '(see the following examples).
   
    Range("A1").ClearContents
End Sub

Można by pewnie jeszcze długo wyliczać i kombinować, ale po co (?) - załącznika z danymi nie pokazujesz, więc nie ma się tak naprawdę do czego odnieść ... a Macieja Goneta to nawet zainteresowałeś tematem ... i od razu "odinteresowałeś" ... :->
ID posta: 403261 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe