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] - Dodawanie nowego wiersza do arkusza na podstawie danych z forma

felixik 01 Sty 2015 19:16 1758 15
  • #1 01 Sty 2015 19:16
    felixik
    Poziom 7  

    Witam, temat będzie dotyczył mojej wyszukiwarki. Dzięki Waszym uwagom udało się zrobić to, co chciałem. Natomiast teraz próbuję napisać formularz, który będzie dopisywał nowe filmy do już istniejącego arkusza. Na ten moment proszę jedynie o nakierowanie mnie jak do tego podejść (jakich funkcji użyć i co po kolei).

    Formularz już mam, deklarację zmiennych i ich pobieranie z forma. Kwestia napisania głównych linii kodu. Z góry dziękuję za wszelkie sugestie.

    0 15
  • #2 01 Sty 2015 20:50
    bobo
    Poziom 28  

    Napisz coś co bardziej rozjaśni problem. W tytule piszesz że, chcesz dodawać nowy wiersz do arkusza a w treści że, będziesz dopisywał dane. To co w końcu? Jak pobierasz zmienne z UserForm i co z nimi robisz?
    Pozdrówka

    0
  • #3 01 Sty 2015 21:36
    felixik
    Poziom 7  

    bobo napisał:
    Napisz coś co bardziej rozjaśni problem. W tytule piszesz że, chcesz dodawać nowy wiersz do arkusza a w treści że, będziesz dopisywał dane. To co w końcu? Jak pobierasz zmienne z UserForm i co z nimi robisz?
    Pozdrówka


    Chodzi o dodawanie informacji o nowym filmie, czyli wpisanie liczby porządkowej, tytułu, rozmiaru, czasu trwania, lokalizacji i informacji o lektorze/napisach w kolejne nowe wiersze.

    1 film = 1 nowy wiersz.

    Kod na obecnym etapie

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #4 01 Sty 2015 22:20
    bobo
    Poziom 28  

    Przykład ( fragmenty kodu ) jak to zrobić.


    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Zmienna numeru wiersza ( Lp ) musi być zadeklarowana jako globalna ( jeżeli stosujesz więcej arkuszy, musi być typu Long

    Pozdrówka

    0
  • #5 01 Sty 2015 23:44
    felixik
    Poziom 7  

    Ok, więc kod prawie działa. Prawie, bo rozpoczyna wpisywanie w A1 a powinien zapisywać od E4 - pierwsza komórka z nr LP.

    Poza tym wpisuje nr wiersza z arkusza a nie nr wiersza z tabeli. W tabeli ostatnie 314 w wierszu 318 i kod wpisuje 319 gdy wstawia LP

    Dodatkowo jeszcze podpowiedzcie jak:
    1. Sprawdzić czy wpisana wartość w formularzu to liczba
    2. Sprawdzić czy wpisana wartość w formularzu to czas w formie gg:mm:ss

    Poniżej pełny kod (na ten moment)

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #6 02 Sty 2015 11:00
    kinggustav
    Poziom 20  

    Trzeba dopasować ten wiersz:
    a = lp - 2 ' wyliczenie kolejnego numeru Lp.
    Jak widzę startowa komórka już zmieniona.

    Czy jest liczbą: IsNumeric(S)

    Czy jest czasem: S Like "##:##:##"
    To tylko wskazanie kierunku poszukiwań, nie jest idealne rozwiązanie, choć może wystarczy.

    0
  • #7 02 Sty 2015 12:04
    bobo
    Poziom 28  

    Kolega coś nie kuma z tymi liczbami porządkowymi. Dlaczego nie jest zadeklarowana zmienna 'a' , przecież ona przechowuje kolejny numer wiersza?
    Skoro kursor na starcie ustawia się w komórce F4 to dlaczego kolega nie liczy wierszy od tego kursora do miejsca wpisywania pierwszej danej? W moim przykładze było to a= b-2, gdzie: a - to wyliczony numer wiersza b - to numer aktywnej komórki, 2 - to liczba wierszy do pominięcia np. wiersze nagłówka tabeli. Poza tym, nie czyta kolega co napisałem odnośnie Lp. Ostatnia sprawa, jeżeli stosuję Cells( a, b) to co oznacza a oraz b ? a to numer wiersza, b to numer kolumny. W kolegi kodzie widzę: Cells (Lp, 1 ) i kolega się dziwi że numer wiersza pokazuje się w kolumnie 1.
    Pozdrówka

    0
  • #8 02 Sty 2015 16:57
    felixik
    Poziom 7  

    bobo napisał:
    Kolega coś nie kuma z tymi liczbami porządkowymi. Dlaczego nie jest zadeklarowana zmienna 'a' , przecież ona przechowuje kolejny numer wiersza?
    Skoro kursor na starcie ustawia się w komórce F4 to dlaczego kolega nie liczy wierszy od tego kursora do miejsca wpisywania pierwszej danej? W moim przykładze było to a= b-2, gdzie: a - to wyliczony numer wiersza b - to numer aktywnej komórki, 2 - to liczba wierszy do pominięcia np. wiersze nagłówka tabeli. Poza tym, nie czyta kolega co napisałem odnośnie Lp. Ostatnia sprawa, jeżeli stosuję Cells( a, b) to co oznacza a oraz b ? a to numer wiersza, b to numer kolumny. W kolegi kodzie widzę: Cells (Lp, 1 ) i kolega się dziwi że numer wiersza pokazuje się w kolumnie 1.
    Pozdrówka


    Jest lepiej, bo chociaż mieszczę się w tabeli. Jednak nadal kod źle wylicza ostatni wiersz. Ostatni wiersz tabeli (podsumowanie ilościowe formułami) jest w I332. Natomiast sam spis kończy się na ten moment na zakresie E327:K327 i to w wierszach 321-327 powinny być nowe wpisy. Kod albo dodaje poniżej 332 albo nadpisuje wiersz 319

    Poniżej poprawiony kod pod kątem Twoich uwag.

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #9 02 Sty 2015 18:10
    bobo
    Poziom 28  

    Kod kolegi - fragmenty:

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    W VBA jest takie świetne narzędzie jak Debug/Step Into lub klawisz F8, rewelacyjnie się tym sprawdza działanie kodu.

    PS. Nie popatrzyłem z uwagą i teraz zobaczyłem następną malinę, rysunek pokazuje w czym problem. Jako numer wiersza ma być wartość zmiennej Lp
    czyli coś takiego: Cells(lp,n)....
    [VBA/Excel] - Dodawanie nowego wiersza do arkusza na podstawie danych z forma

    0
  • #10 02 Sty 2015 19:40
    felixik
    Poziom 7  

    Udało się utrafić w wartość, która zapisuje jak potrzeba dane. Tylko powiedzcie czy można ją ustawić powiedzmy na sztywny teraz na "-5" a potem zmniejszać ją za każdym dodaniem nowego wpisu?

    sprawdzanie pola czas coś nie trybi

    Kod: vb
    Zaloguj się, aby zobaczyć kod

    0
  • #11 05 Sty 2015 09:21
    kinggustav
    Poziom 20  

    To jeszcze kilka uwag praktycznych:
    1. Nie musisz naśladować Excela (choć możesz), sam piszesz program, więc możesz sam decydować jak on działa.
    2. Nie nadużywałbym Select. To dobre podczas uruchamiania, bo przenosi kursor, ale potem tylko zabiera czas.
    3. Spróbuj przejść na numeryczny sposób adresowania komórek (jakos sie to nazywa), będzie łatwiej zapanować. Robisz Select na A1 i dalej sam numerujesz. Programiści tak wolą.
    4. Wiersz wyznaczasz sobie sam, wiesz gdzie jest początek danych, odejmujesz jedno od drugiego i musi pasować, cudów nie ma. Jak jest źle to może masz błąd w kolumnie Lp.
    5. Kolumnę (narożnik tabeli?) też możesz sobie wyszukać po jakimś charakterystycznym kawałku opisu, nie musi być wtedy E5.
    Wiem to wszystko wymaga troche pracy, ale coś za coś.

    0
  • #12 06 Sty 2015 21:57
    felixik
    Poziom 7  

    Mam taki oto kod do dodawania

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Problem jest z

    Set RnSpec = .Range("E" & CStr(lRowFormulas))
    Set RnSpec = .Range("F" & CStr(lRowFormulas))

    i to niezależnie która z tych linii jest od komentowana. Wypluwa następujący błąd

    Run-tim error: 1004: Application defined or object defined error

    0
  • #13 06 Sty 2015 22:40
    bobo
    Poziom 28  

    Nie analizowałem kodu.
    Błąd polegający na złej deklaracji zmiennych. błąd czasu wykonania
    Zamień zmienne liczbowe z Integer na Long ,ale to spowoduje tylko zmianę zakresu jaki osiągają.

    lub

    1. Sprawdź czy, wartości którejś zmiennej są wczytywane w pętli jeżeli tak, to mogą się szybciej wczytywać niż krok/tempo pętli. Np. pakuje się więcej wartości - narastających zmiennej niż obejmuje to pętla.
    2. Może być spacja pomiędzy stringiem a wartością liczbową ( załatwia to Strings.Trim ()).
    3. Problem z łączeniem łańcuchów, za każdą iteracją jest tworzony nowy łańcuch a powinny się dodawać do siebie ( do poprzedniego ).

    0
  • #14 07 Sty 2015 00:00
    felixik
    Poziom 7  

    Sorry, ale nie jestem aż tak kumaty w VBA żeby to ogarnąć samemu, więc jeśli mógłbyś to sprawdzić o co dokładnie chodzi to byłbym wdzięczny

    0
  • #15 07 Sty 2015 08:49
    adamas_nt
    Moderator Programowanie

    felixik napisał:
    ale nie jestem aż tak kumaty w VBA żeby to ogarnąć samemu
    Nie o "kumatość" chodzi, ale o znajomość podstaw. Zerknij tutaj.

    0
  • #16 07 Sty 2015 12:14
    bobo
    Poziom 28  

    felixik napisał:


    Problem jest z

    Set RnSpec = .Range("E" & CStr(lRowFormulas))
    Set RnSpec = .Range("F" & CStr(lRowFormulas))

    i to niezależnie która z tych linii jest od komentowana. Wypluwa następujący błąd

    Run-tim error: 1004: Application defined or object defined error


    [VBA/Excel] - Dodawanie nowego wiersza do arkusza na podstawie danych z forma


    Podsyłam koledze taka bardzo pomocna sciage

    ustawienie pojedynczej komórki
    Set x = Range("A1")
    Set x1 = Cells(1, 1)

    ustawienie zakresu komórek w ciagu
    Set x = Range("A1:C3")
    Set x1 = Range(Cells(1, 1), Cells(3, 3))

    ustawienie zakresu komórek róznych lokacji
    Set x = Range("A1,A3,B5")
    z uzyciem Cells nie da sie tego zrobic

    ustawienie pojedynczej kolumny jako zakresu
    Set x = Columns(1)
    Set x1 = Columns("A")

    ustawienie kilku kolumn w ciagu jako zakresu
    Set x = Range(Columns(1), Columns(3))
    Set x1 = Columns("A:C")

    ustawienie pojedynczego wiersza jako zakresu
    Set x = Rows(1)

    ustawienie kilku wierszy w ciagu jako zakresu
    Set x = Rows("3:7")

    ustawienie kilku wierszy nie ciaglych jako zakresu
    za pomoca tekstowego laczenia adresów
    Set x = Range(Rows("3:7").Address & "," & Rows(10).Address)

    0