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

EXCEL - Suffix jeżeli wartość komórki nie kończy się cyfrą

steelek56 25 Sty 2018 02:46 249 4
  • #1 25 Sty 2018 02:46
    steelek56
    Poziom 12  

    Witam,

    Opracowywuje pewne makro które przyda mi się w pracy. Od razu zaznaczam że jestem raczej kiepski w te klocki. Chodzi o listę numerów telefonów, którą importujemy przez jako plik CSV do kontaktów google i te dalej są synchronizowane do naszych telefonów służbowych. Lista jest bardzo długa, a numery często się zmieniają. Zrobiłem makro, które plik xlsx wysyłany przez jeden z naszych działów zamienia na odpowiednie CSV.

    Problem jest tylko z naszymi telefonami - samsung android. Aplikacja w telefonie ma tendencję do łączenia 'podobnych' kontaktów - jak się okazuje robi to strasznie nieudolnie. Nazwy kontaktów to nazwy miejscowości, jeżeli w danej miejscowości jest więcej niż jeden kontakt dodawane są cyfry. Chodzi o to, że nazwy kontaktów w jednej miejscowości są czasem łączone. Znalazłem że kontakty są łączone przez telefony z automatu jeżeli są dwa lub więcej kontaktów typu:

    Poznań
    Poznań 2
    Poznań 3

    a z kolei nie są łączone wcale gdy każdy z kontaktów ma cyfrę

    Poznań 1
    Poznań 2
    Poznań 3

    I teraz tak. Zawsze jeżeli nie ma cyfry to nie ma '1' więc nie zdarzy się sytuacja typu Poznań 1, Poznań, Poznań 3. Znalazłem pewne makro które załatwia sprawe (tj dodaje jakiś string na końcu każdej komórki). Zmodyfikowałem je lekko pod siebie. Działa wszystko tak jak powinno jednak brakuje w nim zapytania logicznego 'jeżeli'. Makro wygląda tak:

    Code:
    Dim Rng As Range
    
    Dim WorkRng As Range
    Dim addStr As String
    On Error Resume Next
    Set WorkRng = Workbooks("import.csv").Sheets("import").Range("A2:A" & LastRow)
    addStr = " 1"
    For Each Rng In WorkRng
    Rng.Value = Rng.Value & addStr
    Next


    LastRow jest wywołany wczesniej i robi to co ma robić :P

    Chodzi o to żeby dodać do pętli For taki mechanizm, który doda addStr tylko jeżeli wartość komórki nie będzie kończyć się cyfrą.


    Bonusowe pytanie:
    Myślę też żeby zrobić wykres do sprawdzania zajętości ramp w magazynie. Widziałbym to tak żeby na pionowej osi były poszczególne rampy a na poziomej oś czasu 24 godziny. Mam tabelę z kolumnami - nr rampy - początek załadunku - koniec załadunku. I zaznaczyć wszystkie wiersze z takiej tabeli na jednym wykresie żeby widzieć ewentualne 'kolizje' czyli sytuacje w których więcej niż jedno auto znajduje się na jednej rampie (np auto 1 zaczyna załadunek o 1:00 kończy o 2:15, auto 2 - zaczyna na tej samej rampie o 2:00) i ewentualne 'wolne okienka' gdzie w razie wspomnianej kolizji możnaby przesunąć załadunek.

    Nie mam pomysłu jak się za to zabrać. Myślałem o tabeli przestawnej i opartym na nim wykresie przestawnym. Ale może ktoś z Was ma lepszy pomysł jak to ugryźć.

    0 4
  • #2 25 Sty 2018 03:37
    dt1
    Moderator - Komputery Serwis

    Witaj.

    steelek56 napisał:
    Chodzi o to żeby dodać do pętli For taki mechanizm, który doda addStr tylko jeżeli wartość komórki nie będzie kończyć się cyfrą.


    Proponuję zmienić linijkę:
    Code:
    Rng.Value = Rng.Value & addStr

    na linijkę:
    Code:
    if (Asc(Right(Rng.Value,1))>=48 And Asc(Right(Rng.Value,1))<=57) then Rng.Value = Rng.Value & addStr


    Nie sprawdzałem, ale w teorii powinno działać.

    0
  • #3 26 Sty 2018 00:50
    steelek56
    Poziom 12  

    Nie żebym się znał jakoś specjalnie na tych składniach ale nie do końca rozumiem dlaczego wynik formuły ma się zawierać między 48 a 57. Tak czy siak efekt jest raczej odwrotny od zamierzonego. Tj. addStr dopisywany jest tylko jeżeli nazwa kontaktu kończy się cyfrą.

    np.

    Poznań
    Poznań 2 1
    Poznań 3 1

    0
  • Pomocny post
    #4 26 Sty 2018 00:52
    dt1
    Moderator - Komputery Serwis

    Przepraszam, złe założenie zrobiłem. Odwróćmy zatem warunek:

    Code:
    if (Asc(Right(Rng.Value,1))<48 Or Asc(Right(Rng.Value,1))>57) then Rng.Value = Rng.Value & addStr


    Dodano po 37 [sekundy]:

    steelek56 napisał:
    nie do końca rozumiem dlaczego wynik formuły ma się zawierać między 48 a 57

    Teraz już nie ma się zawierać. Zrozumie Kolega czytając opis funkcji Asc :)

    0
  • #5 26 Sty 2018 01:23
    steelek56
    Poziom 12  

    Właśnie szukałem i znalazłem tylko o zamianie jakichś znaków chińskich dwubajtowych na jednobajtowe. Potem poszukałem z frazą vba i okazuje się ze zwraca wartość ASCI. I zaczyna to nabierać sensu :D

    Tak czy siak teraz działa dokładnie tak jak ma działać. Dziękuję za pomoc!

    0
  Szukaj w 5mln produktów