• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Excel - wykonywanie działań na komórce, która zawiera biały znak

Object Storage Arubacloud
0 głosów
671 wizyt
pytanie zadane 9 listopada 2018 w Systemy operacyjne, programy przez Gucci93 Użytkownik (570 p.)

Mam daną pojemność silnika i chcę stworzyć formułę, która np. z "999 cm3" zrobi 1.0, z "1395 cm3" zrobi 1.4 itd.

Na ten moment wygląda to tak, pobieram z trzeciej kolumny do drugiej pierwsze 4 znaki czyli na bazie przykładów "999 " i "1395". Potem w kolumnie 1 dzielę wynik z kolumny 2 przez 1000 z 1 miejscem dzisiętnym i działa to w przypadku pojemności 4-cyfrowych jak 1395 cm3 ale w przypadku 999 cm3 już nie, ponieważ w drugiej kolumnie mam "999 " i ten biały znak jest tu problemem. Nie mogę pobierać w kolumnie 2 pierwszych 3 znaków, bo będzie to oczywiście działało w przypadku 4-cyfrowych pojemności. Zrobiłem tak w komórkach zaznaczonych na żółto. 

Jak najprościej rozwiązać ten problem?

1 odpowiedź

+1 głos
odpowiedź 9 listopada 2018 przez Chess Szeryf (76,710 p.)
edycja 10 listopada 2018 przez Chess
 
Najlepsza
=ZAOKR((USUŃ.ZBĘDNE.ODSTĘPY(FRAGMENT.TEKSTU(C5,1,4))/1000),1)
1.4 1422 cm^3  
1.0 999 cm^3  
0.9 888 cm^3  

Sprawdź jeszcze funkcję OCZYŚĆ.

Przykład:

=ZAOKR((OCZYŚĆ(FRAGMENT.TEKSTU(C5,1,4))/1000),1)

Edit:

Napisałem coś takiego:

-------------------------------------------------------------------------------------

Tej funkcji poniżej nie radzę używać, ponieważ w moim przekonaniu jest niskiej jakości. W zamian lepiej użyć funkcji, która jest na samym dole. (Moja sugestia.)

-------------------------------------------------------------------------------------

Function w_name9(arg1 As String) As String

Dim y As String, w As String, arg2 As String, flag As String, flag2 As Integer, flag3 As Boolean, flag4 As Boolean

arg2 = Trim(arg1)

flag = False

flag2 = 0

flag3 = False

flag4 = False


For i = 1 To Len(arg2) Step 1

    w = Mid(arg2, i, 1)
    
    flag3 = (w = "0" Or w = "1" Or w = "2" Or w = "3" Or w = "4" Or w = "5" Or w = "6" Or w = "7" Or w = "8" Or w = "9")
    
    If flag3 = True Then
        flag = True
    End If
    
    If flag3 = True And flag2 < 2 Then
        flag4 = True
    Else
        flag4 = False
    End If
    
    If flag3 = False And flag = True Then
        flag2 = flag2 + 1
    End If
    
    If (flag4 = True) Or (w = "." And flag = True And flag2 < 2) Then
        y = y + w
    End If
    
Next i

If Mid(y, Len(y), 1) = "." Then
    y = Mid(y, 1, Len(y) - 1)
End If

w_name9 = y

End Function

Ogólnie, to nie pisałem za wiele w VBA o ile cokolwiek coś kiedyś w tym pisałem. A teraz do rzeczy ... 

Ten moduł musisz zainstalować u siebie w Excelu i wtedy dopiero używać. Zasada działania (formuła jaką możesz wpisać):

=w_name9("...1422.50cm3")

Rezultatem będzie:

1422.50

, jest to taki jakby extract_number (wydobądź liczbę (z tekstu)).

Jeśli ten skrypt jakoś źle, niepoprawnie działa, nie zgodnie z zamysłem to przepisz go od nowa lub zmodyfikuj.

Linie:

22-24: jeśli w bieżącej iteracji wystąpi cyfra, to ustaw flagę flag na True

26-30: jeśli w bieżącej iteracji wystąpi cyfra i flag2 będzie mniejszy od 2, to ustaw flagę flag4 na True w przeciwnym razie ustaw tę flagę na False.

32-34: Jeśli w bieżącej iteracji nie wystąpi cyfra i flag = True, to zinkrementuj flag2 o 1.

36-38: Jeśli flag4 = True lub w bieżącej iteracji w jest kropką i flag = True i flag2 < 2, to przypisz do zmiennej y wartość jej samej oraz zmiennej w

42-44: Jeśli na końcu łańcucha znaków (string) będzie kropka to ją wyrzuć z tego łańcucha

46: Zwróć w funkcji w_name9 rezultat zapytania (formuły)

Ta wyżej przeze mnie funkcja możliwe, że nie jest zgodna z Twoim problemem. Napisałem, więc inną opartą o wyrażenia regularne, powinna być lepsza niż kod wyżej.

Function w_name5(arg1 As String) As String

    arg1 = Trim(arg1)

    Dim regEx As New VBScript_RegExp_55.RegExp
    
    regEx.Pattern = "[0-9]+(\.)?[0-9]+"

    If regEx.Test(arg1) Then
        w_name5 = regEx.Execute(arg1)(0)
    End If

End Function

Żeby móc używać tego rozszerzenia do RegEx VBA 5.5, to musisz je włączyć w TOOLS -> REFERENCES. Odszukaj Microsoft VBScript Regular Expressions 5.5 i zaznacz.

komentarz 10 listopada 2018 przez Gucci93 Użytkownik (570 p.)

Nie działa:

 

Przy okazji mam taki problem:

W kolumnie info używam formuły ZłĄCZ.TEKST a w kolumnie silnik używam formuły JEŻELI(A1="";"";ZAOKR(w_name9(R6)/1000;1)) co daje mi np. 2.0

Niestety w kolumnie info zamiast "2.0 od 2017" dostaję "2 od 2017", zmiana formatowania nic nie daje. Masz jakiś pomysł?

info (tak bym chciał) tak dostaję lata produkcji silnik
2.0 od 2017 2 od 2017 od 2017 2.0
1.5 od 2017 1.5 od 2017 od 2017 1.5

 

komentarz 10 listopada 2018 przez Chess Szeryf (76,710 p.)

To jest funkcja, nie macro, więc musisz wejść w insert --> module i dopiero wkleić ten kod w edytor i ma być dokładnie, to co podałem bez tego "Sub" na górze.

Co do Twojej kwestii, to może pomnóż przez 10 i podziel przez 10.

https://www.extendoffice.com/documents/excel/2648-excel-limit-decimal-places.html

https://support.office.com/en-us/article/round-a-number-to-the-decimal-places-i-want-49b936f9-6904-425d-aa98-02ffb7f9a17b

komentarz 10 listopada 2018 przez Gucci93 Użytkownik (570 p.)
Zwraca zawsze 0, w każdym razie ta poprzednia funkcja działa i jest ok :P Teraz walczę z tym problemem, który opisałem.
komentarz 10 listopada 2018 przez Chess Szeryf (76,710 p.)

Wyjaśnij bardziej problem. Co złączasz w kolumnie info, jakie dane i po co Ci w kolumnie silnik formuła JEŻELI.

1
komentarz 10 listopada 2018 przez Gucci93 Użytkownik (570 p.)

Podobne pytania

+1 głos
2 odpowiedzi 95 wizyt
pytanie zadane 21 września 2023 w Visual Basic przez magda_19 Gaduła (3,080 p.)
0 głosów
0 odpowiedzi 2,296 wizyt

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...