Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Znalezienie podobnych wartości

23 Lis 2010 15:40 1305 11
  • Poziom 9  
    Witam

    W dwóch kolumnach mam 2 grupy liczb spośród których muszę znaleźć wartości podobne z tolerancją +/-5.

    Czy Szanowni Forumowicze są mi w stanie podpowiedzieć w jaki sposób taką operację wykonać. Konkretnie chodzi o to, by formuła zwracała mi wartość tekstową w przypadku pojawienia się zbliżonych wartości w dwóch zakresach.

    Jeżeli moje tłumaczenie nie jest zbyt jasne/czytelne proszę o sygnał - postaram się bardziej objaśnić.

    Z góry dziekuję.
  • Poziom 42  
    Code:
    W dwóch kolumnach mam 2 grupy liczb spośród których muszę znaleźć wartości podobne z tolerancją +/-5.
    

    Czy Szanowni Forumowicze są mi w stanie podpowiedzieć w jaki sposób taką operację wykonać. Konkretnie chodzi o to, by formuła zwracała mi wartość tekstową w przypadku pojawienia się zbliżonych wartości w dwóch zakresach.


    Możesz użyć logicznej funkcji Excel'a jeżeli() zapewne zagnieżdżonej. Logicznie powinno to brzmieć jakoś tak:

    Jeżeli a1/b1 > 0,95 i a1/b1 < 1,05 to napisz "Element zgodny z wymogami".

    Pozdrawiam.
  • Poziom 11  
    tzn. co on ma zrobić dokładnie?
    ma dwie kolumny liczb, i ma napisać np. "Element zgodny z wymogami"
    jeśli porównując liczby z jednej kolumny z liczbami z drugiej kolumny znajdzie takie dwie liczby że jedna od drugiej jest mniejsza lub większa o maksymalnie 5? Czy ma znaleźć wszystkie te podobne wartości?
    Może pokaż po prostu konkretny przykład jak by to miało wyglądać.
  • Moderator Programowanie
    Zdaje się, że bez VBA tego nie ugryziesz. Rozumiem, że porównywać trzeba każdą komórkę z każdą. Ewentualnym wynikiem będą pary liczb i gdzieś trzeba je pokazać w konkatenacji z, no właśnie, jakimś konkretnym tekstem? Gdzie?

    Dołączam do wniosku kolegi aand. Przydałby się jakiś przykład...
  • Poziom 22  
    Cytat:
    W dwóch kolumnach mam 2 grupy liczb spośród których muszę znaleźć wartości podobne z tolerancją +/-5

    Chyba trzeba będzie podać dodatkowe dane:
    - grupy są w 2 kolumnach, ale porównywać trzeba na zasadzie "każdy z każdym"?
    - czy mogą być trójki/czwórki takich liczb czy zawsze wyłącznie pary?

    Cytat:
    chodzi o to, by formuła zwracała mi wartość tekstową w przypadku pojawienia się zbliżonych wartości w dwóch zakresach
    Jeśli mamy porównywać liczby wierszami/parami, to wystarczy prosta funkcja JEŻELI. A może chodzi tylko o JEDNO stwierdzenie, że w ogóle w tych 2 grupach jest taka para wartości o zadanej tolerancji? Jeśli jednak miałoby to być porównanie każdy z każdym, to jak mają być prezentowane wyniki?
  • Poziom 28  
    Jako, że nie jestem Copperfield także podłączam się pod jakże słuszną sugestię naszego doświadczonego kolegi:
    adamas_nt napisał:
    Dołączam do wniosku kolegi aand. Przydałby się jakiś przykład...

    Pozwoli nam to uniknąć gdybań na zasadzie:
    Cytat:
    Chyba trzeba będzie...
    To sugeruje, że...
    A może chodzi tylko...
    Jeśli jednak miałoby to być...

    Z nieustającą chęcią pomocy oczekuję na właściwe rozwinięcie tematu. :D
  • Poziom 9  
    Bardzo dziękuję za dotychczasowe wypowiedzi. Oczywiście służę przykładem. Z wyników wyszukiwań wychodzą mi zestawy danych dla dwóch wartości wejściowych - tzn:
    dla wartości I - wyniki kształtują się np (w kolumnie) 5,67,90,196,900
    dla wartości II - 49,89,631

    I teraz formuła powinna mi wyświetlać komunikat (choćby "Prawda") w tym momencie - 89 i 90. Czyli tak jak kolega adamas_nt napisał - konieczne jest porównywanie wartości każdej z każdą.

    Mam nadzieję, że już trochę wyjaśniłem.
  • Poziom 28  
    Jako, że dziś jest paskudny dzień i atmosfera nie sprzyja zaawansowanym pracom intelektualnym :cry: nie będę myślał jak rozwiązać problem za pomocą istniejących formuł Excel-a. Podrzucam Ci swój twór, którego możesz używać do woli. :D
    Code:
    Function Podobne(Wzorzec As Variant, Zakres As Range, Toler As Variant) As String
    
        Podobne = "Brak"
        For Each kom In Zakres
            If ((Wzorzec + Toler) > kom) And ((Wzorzec - Toler) < kom) Then
                Podobne = "OK"
            End If
        Next
    End Function
  • Poziom 11  
    Noo, Noo, tak właśnie to trzeba zrobić, nie ma się co babrać z formułami, zrób makro do takiego arkusza np.:
    Znalezienie podobnych wartości
    i wklej np. taki kod:
    Code:
    Dim tolerancja As Integer
    
    Dim licznikZnalezionych As Integer
    tolerancja = 5
    licznikZnalezonych = 0

    For Each element In Range("c1:d25")
        element.Value = Null
    Next

    For i = 1 To 5
        For Each element In Range("b1:b5")
            If (Cells(i, 1).Value + tolerancja) > element.Value And (Cells(i, 1).Value - tolerancja) < element.Value Then
                licznikZnalezionych = licznikZnalezionych + 1
                Cells(licznikZnalezionych, 3) = Cells(i, 1)         '> wpisuje 1 znalezioną liczbe z kolumny A
                Cells(licznikZnalezionych, 4) = element.Value       '> wpisuje 2 liczbe z kolumny B
            End If
        Next
    Next i
    Cells(1, 5) = "znalezionych:"
    Cells(2, 5) = licznikZnalezionych

    Kolumna A i B są porównywane, w kol. C, D wpisywane są pary, kol. E ile par
  • Poziom 9  
    Serdeczne dzięki koledzy.

    Co prawda od trzech dni siedziałem i starałem się rozgryść linijka po linijce, zapis po zapisie kod (tak to jest jak się nic nie wie na temat VBA) ale udało się. Mam makro przerobione na większe zakresy i zwielokrotnione. Komendy działają jak mają, a ja trochę się wgryzłem w Visuala :). Co prawda za niedługo będę prosił o jeszcze jedną pomoc w celu usprawnienia pracy... :D

    Raz jeszcze dziękuję i pozdrawiam.
  • Poziom 9  
    Odświeżam trochę temat...

    Wszystko ładnie mi hulało do momentu chęci dopisania kolejnego/szóstego zestawu danych...

    Code:
    echo "KOD"
    
    Sub A()

    Dim tolerancja As Integer
    Dim licznikZnalezionych As Integer
    tolerancja = 5
    licznikZnalezionych = 0

    For Each element In Range("c1:d25")
        element.Value = Null
    Next

    For i = 1 To 49
        For Each element In Range("b1:b49")
            If (Cells(i, 1).Value + tolerancja) > element.Value And (Cells(i, 1).Value - tolerancja) < element.Value Then
                licznikZnalezionych = licznikZnalezionych + 1
                Cells(licznikZnalezionych, 3) = Cells(i, 1)         '> wpisuje 1 znalezioną liczbe z kolumny A
                Cells(licznikZnalezionych, 4) = element.Value       '> wpisuje 2 liczbe z kolumny B
            End If
       Next
    Next i
    Cells(1, 5) = licznikZnalezionych

    '20000

    Dim licznikZnalezionych1 As Integer
    licznikZnalezionych1 = 0

    For Each element In Range("H1:I25")
        element.Value = Null
    Next

    For i = 1 To 49
        For Each element In Range("G1:G49")
            If (Cells(i, 6).Value + tolerancja) > element.Value And (Cells(i, 6).Value - tolerancja) < element.Value Then
                licznikZnalezionych1 = licznikZnalezionych1 + 1
                Cells(licznikZnalezionych1, 8) = Cells(i, 6)         '> wpisuje 1 znalezioną liczbe z kolumny A
                Cells(licznikZnalezionych1, 9) = element.Value       '> wpisuje 2 liczbe z kolumny B
            End If
       Next
    Next i
    Cells(1, 10) = licznikZnalezionych1

    '30000

    Dim licznikZnalezionych2 As Integer
    licznikZnalezionych2 = 0

    For Each element In Range("m1:n25")
        element.Value = Null
    Next

    For i = 1 To 49
        For Each element In Range("l1:l49")
            If (Cells(i, 11).Value + tolerancja) > element.Value And (Cells(i, 11).Value - tolerancja) < element.Value Then
                licznikZnalezionych2 = licznikZnalezionych2 + 1
                Cells(licznikZnalezionych2, 13) = Cells(i, 11)         '> wpisuje 1 znalezioną liczbe z kolumny A
                Cells(licznikZnalezionych2, 14) = element.Value       '> wpisuje 2 liczbe z kolumny B
            End If
       Next
    Next i
    Cells(1, 15) = licznikZnalezionych2

    '40000

    Dim licznikZnalezionych3 As Integer
    licznikZnalezionych3 = 0

    For Each element In Range("r1:s25")
        element.Value = Null
    Next

    For i = 1 To 49
        For Each element In Range("q1:q49")
            If (Cells(i, 16).Value + tolerancja) > element.Value And (Cells(i, 16).Value - tolerancja) < element.Value Then
                licznikZnalezionych3 = licznikZnalezionych3 + 1
                Cells(licznikZnalezionych3, 18) = Cells(i, 16)         '> wpisuje 1 znalezioną liczbe z kolumny A
                Cells(licznikZnalezionych3, 19) = element.Value       '> wpisuje 2 liczbe z kolumny B
            End If
       Next
    Next i
    Cells(1, 20) = licznikZnalezionych3

    '50000

    Dim licznikZnalezionych4 As Integer
    licznikZnalezionych4 = 0

    For Each element In Range("w1:x25")
        element.Value = Null
    Next

    For i = 1 To 49
        For Each element In Range("v1:v49")
            If (Cells(i, 21).Value + tolerancja) > element.Value And (Cells(i, 21).Value - tolerancja) < element.Value Then
                licznikZnalezionych4 = licznikZnalezionych4 + 1
                Cells(licznikZnalezionych4, 23) = Cells(i, 21)         '> wpisuje 1 znalezioną liczbe z kolumny A
                Cells(licznikZnalezionych4, 24) = element.Value       '> wpisuje 2 liczbe z kolumny B
            End If
       Next
    Next i
    Cells(1, 25) = licznikZnalezionych4

    '60000

    Dim licznikZnalezionych5 As Integer
    licznikZnalezionych5 = 0

    For Each element In Range("ab1:ac25")
        element.Value = Null
    Next

    For i = 1 To 49
        For Each element In Range("aa1:aa49")
            If (Cells(i, 26).Value + tolerancja) > element.Value And (Cells(i, 26).Value - tolerancja) < element.Value Then
                licznikZnalezionych5 = licznikZnalezionych5 + 1
                Cells(licznikZnalezionych5, 28) = Cells(i, 26)         '> wpisuje 1 znalezioną liczbe z kolumny A
                Cells(licznikZnalezionych5, 29) = element.Value       '> wpisuje 2 liczbe z kolumny B
            End If
       Next
    Next i
    Cells(1, 30) = licznikZnalezionych5


    End Sub



    Kolejne zakresy wstawiałem zmieniając adresy pobieranych danych. Niestety przy '60000 makro zaczyna mi wariować - dubluje wartości w zakresie ab1:ac49 a w sumie podaje 49. Nie wiem, czy w formule czegoś nie poknociłem... Choć raczej parokrotnie sprawdzałem. Co więcej - próbując stworzyć nowy arkusz dla wartości z 60000 i zastosować makro dotychczas działające EXCEL znów skopiował wartości, a następnie się zwiesił - czym pogrzebał parę godzin pracy :(.

    Z góry przepraszam jeżeli okaże się, że w kodzie jest jakiś mały przeklep. Choć dwukrotnie sprawdzałem i efekt był ten sam.
  • Poziom 11  
    Lepiej sobie zapisać wcześniej zanim uruchomisz makro. I w ogóle kopie zapasowe się przydają.
    Pokaż na jakich wartościach operujesz ("z 60000")
    Excel może się zawiesić np. jak dostanie zbyt dużo obliczeń do przerobienia i są jakieś błędy w makrze. Pokaż wartości i wyniki.
    Sprawdzałem teraz ten kod, ale działa mi i nie zwiesza.

    PS.
    nie musisz za każdym razem deklarować zmiennej licznik znalezionych
    Code:
    Dim licznikZnalezionych5 As Integer

    wystarczy że wyzerujesz licznik:
    Code:
    licznikZnalezionych=0

    i pewnie można skrócić ten kod, nie ma sensu chyba 6 razy pisać praktycznie takiej samej pętli.