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.

[VBA Excel] dodanie wartości +1 do istniejącej komórki z tekstem

Amanek 15 Gru 2017 09:48 1086 6
  • #1 15 Gru 2017 09:48
    Amanek
    Poziom 3  

    Dzień dobry!

    Otóż nie wiem jak w zgrabny sposób rozwiązać poniższy problem.
    W komórce wpisuję tekst np. X1, a następnie naciskam przycisk "dodaj" (wywołuje to makro, które wykonuje pewien program).
    Czasami muszę wpisać wartości A1, B2, C3 itd.
    Chciałbym usprawnić ten proces, aby ostatnią cyfrę zwiększać o wartość 1.

    Przykład:

    Wpisuję AU01, klikam "dodaj" i tekst mi się zmienia w komórce na AU02. itd.
    Musi to być na VBA, ponieważ w komórkę na bieżąco wpisuję różne znaki.
    Mniej więcej wiem jak można to rozwiązać, ale gorzej u mnie ze składnią i formułami.

    Do mojego istniejącego makra musiałbym dopisać odczyt wartości z komórki (ostatni znak - jeżeli jest nim cyfra), a następnie wprowadzenie wartości +1.

    Proszę o pomoc!

    0 6
  • #2 15 Gru 2017 12:47
    cbrman
    Poziom 27  

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #3 16 Gru 2017 19:42
    lanzul
    Poziom 27  

    Amanek napisał:
    Wpisuję AU01, klikam "dodaj" i tekst mi się zmienia w komórce na AU02. itd.

    Amanek napisał:
    Do mojego istniejącego makra musiałbym dopisać odczyt wartości z komórki (ostatni znak - jeżeli jest nim cyfra), a następnie wprowadzenie wartości +1.

    1. Czyli po AU09 ma być AU10, czy AU010 ?
    2. Czy zestaw znaków składających się na dany zapis jest skończony, czy mogą to być wszystkie, dowolne znaki ?
    3. Czy może się to dziać w każdej dowolnej komórce arkusza, czy tylko w określonym zakresie komórek ?

    0
  • #4 19 Gru 2017 13:34
    Amanek
    Poziom 3  

    @cbrman
    Mogę prosić o wyjaśnienie kodu? Mam błąd na linijce "lCnt = Mid(sTemp, i, Len(sTemp))" - "type mismatch".

    @lanzul
    1. Po AU09 ma być AU10.
    2. Zestaw znaków zawiera się w zbiorze jaki tworzy alfabet angielski + cyfry + znaki specjalne jak kropki, przecinki, myślniki
    3. Ma się to dziać jedynie w jednej, scalonej komórce o adresie B+C, 9+10 (Range("B9:C10").Select)

    Wrzuciłbym plik excela, ale niestety z makro nie mogę. Mogę wysłać na maila.

    0
  • #5 19 Gru 2017 14:59
    lanzul
    Poziom 27  

    Amanek napisał:
    Wrzuciłbym plik excela, ale niestety z makro nie mogę
    Makro niepotrzebne, i tak przecież będziesz dostosowywać inne do swojego.

    Amanek napisał:
    Po AU09 ma być AU10
    Amanek napisał:
    Zestaw znaków ...alfabet angielski ... cyfry ... znaki specjalne ...

    Czyli głównym problemem będzie tu uchwycenie granicy pomiędzy ostatnim znakiem nienumerycznym, a pierwszym numerycznym danej wartości w komórce ... AU.09, AUW.9834, itd.
    Czy jest jakaś "matryca", którą przewidujesz dla wpisywanych wartości, np.: górna to "10 000", więc dolna "powinna" wyglądać jak: "00001", itd. ?
    Czy nie ma to znaczenia i jest zupełnie dowolne, tj. może być zarówno AU00000001, AU00000004, AU1001, jak i "tylko" AU1, AU2, czy też AU01, AU09, AU11, itd. ?

    0
  • #6 20 Gru 2017 07:09
    Amanek
    Poziom 3  

    lanzul napisał:
    Amanek napisał:
    Wrzuciłbym plik excela, ale niestety z makro nie mogę
    Makro niepotrzebne, i tak przecież będziesz dostosowywać inne do swojego.

    Amanek napisał:
    Po AU09 ma być AU10
    Amanek napisał:
    Zestaw znaków ...alfabet angielski ... cyfry ... znaki specjalne ...

    Czyli głównym problemem będzie tu uchwycenie granicy pomiędzy ostatnim znakiem nienumerycznym, a pierwszym numerycznym danej wartości w komórce ... AU.09, AUW.9834, itd.
    Czy jest jakaś "matryca", którą przewidujesz dla wpisywanych wartości, np.: górna to "10 000", więc dolna "powinna" wyglądać jak: "00001", itd. ?
    Czy nie ma to znaczenia i jest zupełnie dowolne, tj. może być zarówno AU00000001, AU00000004, AU1001, jak i "tylko" AU1, AU2, czy też AU01, AU09, AU11, itd. ?


    Głównie AU1, AU2.. i tak do AU200. Więcej w zasadzie nie jest potrzebne.
    W załączniku plik Excela.

    0
  • #7 21 Gru 2017 17:41
    lanzul
    Poziom 27  

    Na wstępie:

    Amanek napisał:
    Mam błąd na linijce "lCnt = Mid(sTemp, i, Len(sTemp))" - "type mismatch"

    Możliwe przyczyny to:
    a) brak deklaracji zmiennej "i", typu np.: "Dim i%"
    b) wartość w danej komórce ma "skomplikowaną" strukturę, typu np. "AU01_CDF125" - po znalezieniu pierwszego znaku, który może być zamieniony na liczbę nie można na tęże liczbę zamienić reszty ciągu "01_CDF125"

    Dalej:
    1. Makro kolegi cbrman powinno ci w zupełności wystarczyć przy prostych zapisach, typu AU1, AU01, itd., możesz ewentualnie skorygować na:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    W linijce "ActiveCell.Offset(0, 0).Value = sText & (lCnt + 1)" - właściwość "Offset" umożliwi ci ewentualny zapis nowej wartości w jakiejś innej komórce, względem tej aktywnej.

    2. Jeśli stosujesz bardziej "udziwnione" zapisy, to proponowałbym "rozbiór" wartości z komórki, od końca zapisu - pozwoli to uniknąć "kłopotliwych" sytuacji z cyframi/liczbami "pośrednimi", których nie chcemy traktować jako licznika.
    Można by użyć np. coś takiego - na bazie makra kolegi cbrman:
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    Założeniem jest, że w "początkowej" numeracji może pojawić się zero wiodące, ale tylko w zakresie od "1" do "9". Jeśli planujesz więcej powtórzeń "0", typu "001", "0001", itd. to potrzebne będą przeróbki.

    3. Możesz pomyśleć też o "automatyzacji" zmian, poprzez wykorzystanie procedury zdarzeniowej "Worksheet_Change", która będzie reagować na zmiany tylko w określonym obszarze i tylko wtedy wywoływać inne makro wprowadzające zmiany - przykładowo, poniżej zmianie podlegać będą tylko wpisy w kolumnie 'A':
    a) W module "Arkusz1":
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    b) W module "Module1":
    Kod: vba
    Zaloguj się, aby zobaczyć kod

    Do załącznika, to tak szczerze, nie zaglądałem za bardzo ... :| ...

    0