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.

vb excel - program magazynowy pomoc

kehn 19 Sie 2009 12:30 26960 116
  • Pomocny post
    #61
    walek33
    Poziom 28  
    kehn napisał:
    To czemu to nie działa??
    Code:
    For i = 1 To ThisWorkbook.Worksheets.Count
    
        If Sheets(i).Name = "M-" & x Then
            MsgBox "TAKA NAZWA JUZ ISTNIEJE!!!", vbOKOnly, "Podaj inną nazwe!"
            TextBox1 = ""
            TextBox2 = ""
            Exit Sub
            End If
    Next


    Przed uruchomieniem tego kodu przypisz "x"-owi wartość TextBox1.Text
  • #62
    kehn
    Poziom 12  
    jest tak:
    Code:
    x = TextBox1
    
    For i = 1 To ThisWorkbook.Worksheets.Count
        If Sheets(i).Name = "M-" & x Then
            MsgBox "TAKA NAZWA JUZ ISTNIEJE!!!", vbOKOnly, "Podaj inną nazwe!"
            TextBox1 = ""
            TextBox2 = ""
            Exit Sub
            End If
    Next

    Sheets.Add
      ActiveSheet.Name = ("M-" & x) ' i tej Lini pokazuje błąd bo powtarza się nazwa arkusza i otworzy nowy arkusz o nazwie standardowej. czemu pętla tego powtórzenia nie wykryła??


    Podobny kod sprawdzający czy wszystkie textbox sa wypełnione:
    Code:
    Dim i
    
    For i = 1 To 4
    If TextBox & i = "" Then MsgBox "Wypełnij wszystkie pola!!!": Exit Sub
    Next
    arkusz = TextBox4
    Sheets.Add
    ActiveSheet.Name = ("" & arkusz)

    I co nie działa... To może przez pętle??

    Pytanie 2 :Jak zrobić żeby w textbox można wpisywać tylko datę i w formacie dd.mm.rrrr??
  • Pomocny post
    #63
    adamas_nt
    Moderator Programowanie
    Po kolei. Co z tym sprawdzaniem u Ciebie. Działa, czy nie? W razie czego zerknij w załącznik.

    p.s. Jeśli nie potrzebujesz wartości pola tekstowego poza procedurą, to nie przypisuj do zmiennej. Zrobi się bałagan. Jeśli jest inaczej to nazwij ją tak, żeby wiadomo było co to za "ziółko" bez późniejszego szukania po całym kodzie.

    Edit 22:00 Zmieniłem załącznik. Propozycja wstawiania daty (DateTimePicker).
  • Pomocny post
    #64
    walek33
    Poziom 28  
    adamas_nt napisał:

    Jeśli nie potrzebujesz wartości pola tekstowego poza procedurą, to nie przypisuj do zmiennej. Zrobi się bałagan.


    I tu się z kolegą zgadzam. Proponuję więc usunąć przypisanie "x" i zamiast niego wpisać "TextBox1.Text". Zmienna jest niepotrzebna.

    Dodano po 15 [minuty]:

    kehn napisał:
    jest tak:
    Code:

    x = TextBox1
    For i = 1 To ThisWorkbook.Worksheets.Count
        If Sheets(i).Name = "M-" & x Then
            MsgBox "TAKA NAZWA JUZ ISTNIEJE!!!", vbOKOnly, "Podaj inną nazwe!"
            TextBox1 = ""
            TextBox2 = ""
            Exit Sub
            End If
    Next



    Po wcześniej opisanej zamianie wstaw ten kod pomiędzy Dim a pierwszy If. Powinno działać poprawnie.
  • #65
    kehn
    Poziom 12  
    Będę nazywał problem1...2..itd a póżniej w odp bedziemy pisali AD1...2..itd:) Dziekuję :)
    Problem 1
    Kod:
    Code:
    For i = 1 To ThisWorkbook.Sheets.Count
    
        If Sheets(i).Name = "M-" & TextBox1 Then
            TextBox1 = ""
            TextBox1.SetFocus
            MsgBox "Arkusz o takiej nazwie istnieje", vbOKOnly, "Zmień nazwę arkusza"
            Exit Sub
        End If
    Next
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "M-" & TextBox1

    nie działa... nie mam pojęcia?! sprawdzam to i=5 a taxtbox=magazyn. to czemu nie działa??

    Problem 2:
    w textbox4 ma być wpisana tylko data... podoba mi sie pomysł:
    Code:
    Private Sub UserForm_Initialize()
    
    TextBox4 = Format(Date, "dd.mm.yyyy")
    End Sub

    Private Sub DTPicker1_Change()
    TextBox4 = Format(Me.DTPicker1, "dd.mm.yyyy")
    End Sub

    ale chciałbym żeby była możliwość zmiana tylko i wyłącznie na datę inną w takim samym formacie...?
  • Pomocny post
    #66
    adamas_nt
    Moderator Programowanie
    Ad.1. Sprawdź, czy wcześniej (przed pętlą) nie masz powtórzenia polecenia "sheets.add". Najlepiej wklej cały kod od "Sub" do "End Sub". Jeśli jest przydługawy daj w załączniku jako plik tekstowy (tylko kod).

    Ad.2. Właśnie tak to działa. Właściwość pola tekstowego (TextBox4) "Locked" ustaw na "True" i zmiana daty będzie możliwa tylko picker'em. Lub zrezygnuj z pośrednictwa (usuń TextBox4) i przypisuj sformatowaną wartość DTPicker'a (to prawie taki sam obiekt jak pole tekstowe).

    P.S. W form_initialize możesz dodać linię
    Code:
    DTPicker1 = Date
    lub inną (Np wczorajsza to Date -1) jako domyślną.
  • #67
    kehn
    Poziom 12  
    Ad1 Załącznik

    Ad2
    Cytat:
    zmiana daty będzie możliwa tylko picker'em. Lub zrezygnuj z pośrednictwa (usuń TextBox4) i przypisuj sformatowaną wartość DTPicker'a (to prawie taki sam obiekt jak pole tekstowe).

    Nie rozumiem dobrze tego... ??? nie wiem co to picker??
  • Pomocny post
    #68
    walek33
    Poziom 28  
    Zgodnie z propozycją: :D
    Ad.1:
    Czy jako nazwę arkusza w TB1 wpisujesz tekst, czy numery? W drugim przypadku (używania numerów aby w efekcie uzyskać nazwę M-1) musisz zmienić w kodzie TextBox1 na TextBox1.Text. Pierwsze podaje wartość TB1. Drugie zaś podaje tylko znaki tekstowe co by to nie było. Po prostu automatyczna konwersja. W VBA łączenie tekstów odbywa się za pomocą "+". Łatwo to sprawdzisz zamieniając na niego "&", który wymusza połączenie wszystkiego nie dając w efekcie zamierzonego typu. Nie zawsze można iść na skróty. Uf. Ale się rozpisałem.
  • Pomocny post
    #69
    adamas_nt
    Moderator Programowanie
    :arrow: kehn Wg mnie powinno działać. Dla pewności przed każdym "Else" możesz dopisać "Exit Sub". Sprawdziłem początek Twojej procedury i u mnie działa.
    DTPicker jest kontrolką formularza (podobnie jak TextBox, ListBox, CommandButton) służącą do wybierania daty z kalendarza.

    :arrow: walek33 Proszę nie wprowadzać zamieszania. Nie ma żadnego logicznego powodu, aby wartość tekstową pola tekstowego konwertować na wartość tekstową. Zajmuje to tylko czas i obciąża procesor. Proponuję również lekturę Link, temat: "Operatory". Tu mały
    Cytat:
    Operator (+) jest używany do obliczania sumy wyrażeń.

    Składnia:

    [Wynik=] Wyrażenie1+Wyrażenie2

    Wynik (Opcjonalne) jest dowolną zmienną numeryczną
    Wyrażenie1 (Wymagane) jest dowolnym wyrażeniem
    Wyrażenie2 (Wymagane) jest dowolnym wyrażeniem

    Operator + jest używany również do łączenia łańcuchów. Może to powodować problemy z określeniem czy wykonywane ma być dodawanie czy łączenie łańcuchów. Dlatego do łączenia łańcuchów należy używać operatora &.

    Dlatego zapis
    Code:
    TextBox1.Text + TextBox2.Text
    jest nielogiczny i niepoprawny.

    Natomiast zupełnym nieporozumieniem jest
    walek33 napisał:
    zamieniając na niego "&", który wymusza połączenie wszystkiego nie dając w efekcie zamierzonego typu
  • Pomocny post
    #70
    walek33
    Poziom 28  
    No cóż kolego Adamas. Wywołałeś lekką polemikę, a że temat jest ciekawy myślę, że warto (w ramach wymiany doświadczeń). :D Nie to, że chcę się kłócić lub udowadniać przewagę jednego operatora nad drugim, ale nie do końca się z Tobą zgadzam. Przytoczony przez Ciebie cytat (pobrany zapewne z help-a) jest niepełny. Ale o tym później.
    Cytat:
    Nie ma żadnego logicznego powodu, aby wartość tekstową pola tekstowego konwertować na wartość tekstową.

    Pisząc:
    Cytat:
    Po prostu automatyczna konwersja.

    miałem na myśli nie próby dodatkowej konwersji, lecz to co oferuje nam VBA. Czy Twoim zdaniem 1 = "1"?
    - TB1 lub TB1.Value zwraca wartość TB1 tzn. przykładowe 1.
    - TB1.Text zwraca "1".
    I to jest ta moja konwersja. W zależności od potrzeb masz co chcesz. Do utworzenia nazwy arkusza potrzebny jest tekst czyli opcja druga.
    Wróćmy do operatorów. Jak sam napisałeś "+" stosuje się do sumowania wyrażeń. Moim skromnym zdaniem sumą dwóch ciągów jest trzeci ciąg. Jeżeli się mylę popraw mnie proszę. Przy tym operatorze ważne jest aby obie zmienne były tego samego typu. Jest to dobre ponieważ pozwala na kontrolę typu wyniku.
    "&" natomiast, i tu żeby nie być gołosłownym podeprę się helpem:
    Cytat:
    Wymusza przeprowadzenie operacji łączenia ciągów w odniesieniu do dwóch wyrażeń.
    wynik - Element obowiązkowy. Jest to dowolna zmienna typu String lub Variant.
    Jeżeli wyrażenie nie jest ciągiem, zostaje przekształcone na wartość typu Variant o podtypie String.
    Jeżeli oba wyrażenia są wyrażeniami znakowymi, to typ wyniku jest String

    I tu jest pies pogrzebany. Typ a podtyp to zasadnicza różnica. Opisy konkatenacji można znaleźć także w innych źródłach wcale nie gorszych od helpa w którym nie wszystko jest opisane.
    Cytat:
    Dlatego zapis
    Code:
    TextBox1.Text + TextBox2.Text

    jest nielogiczny i niepoprawny.

    Moim zdaniem zapis ten ma jednak sens i jest jak najbardziej poprawny. :D
  • #71
    kehn
    Poziom 12  
    Dodano po 4 [minuty]:

    Ad1
    w nowym arkuszy kod poniżej działa!!!
    Code:
    Private Sub CommandButton1_Click()
    
    Dim a
    a = InputBox("Podaj nazwę")
    For i = 1 To ThisWorkbook.Sheets.Count
        If Sheets(i).Name = "M-" & a Then
            MsgBox "Arkusz o takiej nazwie istnieje", vbOKOnly, "Zmień nazwę arkusza"
            Exit Sub
        End If
    Next
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "M-" & a
    Sheets("Arkusz1").Select
    End Sub

    wstawiam załącznik całego mojego kodu, zobaczcie może coś przeoczyłem.jest w UF4

    Ad2
    Cytat:
    DTPicker jest kontrolką formularza (podobnie jak TextBox, ListBox, CommandButton) służącą do wybierania daty z kalendarza.

    tylko gdzie ona jest ja jej nie mam. moze to dla tego że mam office 2000??
  • Pomocny post
    #72
    walek33
    Poziom 28  
    Ten plik działa prawie poprawnie. Jedyne, co mi się rzuciło w oko to brak nazwy magazynu na arkuszu.
    Powód:
    Code:

        Range("J1").Select
        ActiveCell.FormulaR1C1 = x
        Range("H1:M1").Select

    "x". Wyszukiwanie arkuszy OK.
  • Pomocny post
    #73
    adamas_nt
    Moderator Programowanie
    Cytat:
    tylko gdzie ona jest
    Jeśli nie ma w dodatkowych (w widoku projektu formularza kliknąć ppm "Toolbox" i wybrać "Additional Controls". Następnie poszukać na liście: "Microsoft Data and Time Picker...") to można ściągnąć z netu podobnie działający kalendarz (z polskimi świętami włącznie). Wpisz w wyszukiwarkę Np kalendarz_r_c.xls
  • #74
    kehn
    Poziom 12  
    to zaraz u was działa normalnie wyszukiwanie arkuszy???

    jak zrobić żeby ten kalendarz był po polsku??
  • Pomocny post
    #75
    walek33
    Poziom 28  
    Przecież kalendarz_r_c.xls, który podpowiada Ci Adamas jest po polsku.
    A wyszukiwanie istniejących arkuszy działa jak napisałem wcześniej. Sprawdzałem na E97 i E2002. Musisz tylko zmienić tego "x"-a.
  • #76
    kehn
    Poziom 12  
    wstawiłem inny kalendarz...
    dodaje załącznik i proszę was poprawcie to bo ja już nie ogarniam poprawiam jak mówicie i nie działa to wyszukanie arkuszy??!!
  • Pomocny post
    #77
    adamas_nt
    Moderator Programowanie
    U mnie za to Calendar nie działa. DTPicker pojawił się wraz z VB 6.0, czyli przed 2000. Sprawdź i napisz co się dzieje.
  • #79
    kehn
    Poziom 12  
    zastanawiam sie czy kalendarz to dobre rozwiazanie jak nie na wszystkich pakietach biurowych działają... byłbym bardziej zadowolony żeby w combobox'ach było można wybierać rok miesiąc i dni... macie pomysł??
  • Pomocny post
    #80
    adamas_nt
    Moderator Programowanie
    Kalendarz to dobre rozwiązanie. Ale jak sam piszesz, nie jest konieczne. Takie rzeczy zostaw na koniec. Na razie wstaw pole tekstowe do wpisywania daty i zajmij się sprawami koniecznymi.
    Przy czasie (obiecuję) wkomponuję Ci ten, o którym pisałem. Był napisany dla Excel97 i działa z wszystkimi nowszymi.

    To (nazwa magazynu)
    Code:
        Range("J1").Select
    
        ActiveCell.FormulaR1C1 = x
    w ostatnim załączniku poprawiłem na
    Code:
        Range("J1")=TextBox1
    i u mnie działa.

    P.S. Staraj się nie korzystać z rejestratora w przypadku wypełniania nagłówków i komórek arkusza. Nagrać możesz tworzenie obramowań, wypełnienia kolorem itp, najlepiej w osobnym module a w głównym umieścić tylko wywołanie (jedna linijka). W którymś z wcześniejszych załączników masz przykład. Przy zaznaczaniu nieciągłych zakresów (przy nagrywaniu również) korzystaj z klawisza Ctrl. Zaznaczasz pierwszy, wciskasz i przytrzymujesz Ctrl, zaznaczasz kolejne...
    Kolor wypełnienia. Korzystając z rejestratora, nagraj tylko dla jednej komórki, wyłącz rejestratora i dopisz resztę zakresów oddzielając przecinkiem. Np Range("A1, D1:F3, K8:J9").
  • #81
    kehn
    Poziom 12  
    no i wszystko jasne ja to próbowałem na już utworzonym wcześniej arkuszu gdzie to x było nie przypisane, a po zmianie i tworzeniu od nowa wszystkich arkuszy czyli magazynów jest ok:)

    Ok kalendarz później :)

    Dodano po 3 [godziny] 49 [minuty]:

    jak zrobić żeby wszystkie arkusze tylko o nazwie daty formacie dd.mm.rrrr zostały załadowane do combobox??
  • Pomocny post
    #82
    adamas_nt
    Moderator Programowanie
    To już przerabialiśmy :)
    Dla ułatwienia dodam: trzeci znak od lewej (w formacie "dd.mm.yyyy") to zawsze będzie kropka. Mid(string, start, length)
  • #83
    kehn
    Poziom 12  
    zastanawiam się jak robić zestawienie tygodnia czy może jakoś automatycznie że po całym tygodniu poniedziałek-sobota wprowadzania dziennych raportów sprzedaży program zrobi automatycznie arkusz zestawienie tydodnia. A jesli dzień miesiąca 1 wypadnie w srode to zestawienie zrobi sroda-sobota i odwrotnie jeśli ostatni w wtorek to podsumuje pon-wtorek. dodam że po całym miesiacu zapisze plik w folderze archiwalnym tylko do przeglądu z zablokowanymi arkuszami... co ty na to?? i jak to zrobić żeby śledził kiedy zrobić to podsumowanie??
  • Pomocny post
    #84
    adamas_nt
    Moderator Programowanie
    Zasugeruję znowu rozwiązanie Access'owe. Raport okresowy, generowany na podstawie danych z formularza. Wybór daty od-do lub ostatni tydzień lub od początku miesiąca, tygodnia, itp.

    Dałbym możliwość wyboru asortymentu. Domyślnie cały, ale gdybyś chciał sprawdzić ile wynosi sprzedaż tylko Np towaru o kodzie P11, powinna być taka możliwość.

    Nie widzę potrzeby zapisywania w arkuszu. Generujesz raport i masz podgląd, drukujesz lub ew. zapisujesz jako Np plik Worda (gdyby trzeba przesłać) i przy zamknięciu pliku arkusz tymczasowy jest usuwany lub zawiera tylko ostatni generowany. Dzięki temu masz porządek w skoroszycie i plik nie "tyje" do jakiś nieprzewidywalnych rozmiarów. Ale to oczywiście tylko taka moja sugestia...
  • #85
    kehn
    Poziom 12  
    jak i co zrobić, żeby po otwarciu pliku excel automatycznie włączały się makra (bez tego zapytania)??

    Dodano po 22 [minuty]:

    i otworzył sie userfrom...
  • Pomocny post
    #86
    walek33
    Poziom 28  
    Pytanie 1.
    - (nie zalecane) obniżyć poziom zabezpieczeń makr.
    - (lepsze) ustawić poziom zabezpieczeń na najwyższy i podpisać makra.
    Pytanie 2.
    Jeżeli za userform uważasz arkusz "__MENU__" to najprościej:
    w ThisWorkbook:
    Code:

    Private Sub Workbook_Open()
        Sheets("__MENU__").Activate
    End Sub

    Zamiast arkusza możesz otwierać każdy inny formularz.
    Code:

        UserForm10.Show


    Dodane po 15 min:
    W załączniku masz przykład z podpisem.
  • #87
    kehn
    Poziom 12  
    coś nie działa... jakiś błąd również wyskakuje jak kliknę tryb nie roboczy w pasku vb??
  • Pomocny post
    #88
    walek33
    Poziom 28  
    kehn napisał:
    coś nie działa... jakiś błąd również wyskakuje jak kliknę tryb nie roboczy w pasku vb??


    Co konkretnie nie działa?
  • #90
    kehn
    Poziom 12  
    ok wszystko działa dzięki wielkie:)

    A powiedz jest możliwość modyfikacji userform np zmienić nazwe w pasu okna lub zmienic jego kolor itp??