Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

vb excel - program magazynowy pomoc

kehn 02 Aug 2009 20:39 27923 116
Computer Controls
  • Computer Controls
  • #32
    kehn
    Level 12  
    jak obliczyć marże jak znamy cene zakupu i cene sprzedaży??
  • Helpful post
    #33
    adamas_nt
    Moderator of Programming
    To już jest (menu(2).xls UserForm6 Private Sub CommandButton1_Click())
    'wpisanie marży
        
    If ComboBox2 = "" Then
        marza = cenasprz / cenazak / 100
    Else
        marza = ComboBox2.Value
        marza = marza / 100
    End If
  • #34
    kehn
    Level 12  
    jest i nie działa wpisuje do arkusza 0%... i tylko gdy wpisujesz cene sprzedazy bo marże z cobobox wyswietla dobrze.
    czyli nie działa:
    marza = cenasprz / cenazak / 100 
  • Helpful post
    #35
    adamas_nt
    Moderator of Programming
    A rzeczywiście, mój błąd. Powinno być
        'wpisanie do arkusz ceny sprzedazy
        
    Range(Cells(licznik + 1, 5), Cells(licznik + 1, 6)).Select
    cenasprz = TextBox3
    Cells(licznik + 1, 5).Value = cenasprz
    
    With Selection
        .HorizontalAlignment = xlCenter
        .MergeCells = True
        .NumberFormat = "#,##0.00 $"
    End With
        
    'wpisanie marży
        
    If ComboBox2 = "" Then
        marza = (cenasprz - cenazak) / cenazak
    Else
        marza = ComboBox2.Value / 100
    End If
  • Computer Controls
  • #36
    kehn
    Level 12  
    dodałem rabat przy zakupie i nie moge tego zgrac zeby cena zakupu równiż automatycznie sie zmieniała... w załączniku
  • #37
    kehn
    Level 12  
    a i jeszcze mam pytanko jak uzbroic combobox w wartości z innego arkusza z kolumn a1... a2... itd

    Dodano po 5 [minuty]:

    czy tak bedzie ok?
    For i = 1 To 100 
        if cells(i , 1) = "" then end sub
        wartosc = cells(i , 1).value
        UserForm6.ComboBox2.AddItem wartosc
    Next i
  • Helpful post
    #38
    adamas_nt
    Moderator of Programming
    kehn wrote:
    dodałem rabat przy zakupie

    Już wcześniej się zastanawiałem:
    Dlaczego rabat przy zakupie? Jako cenę zakupu wpisuje się cenę z rabatem i nikogo (łącznie z US) nie obchodzi cena bez rabatu. Istnieją różne systemy rabatów: procentowe, kwotowe, łączone (Np: jeśli poniedziałek to rabat 5% ale nie więcej niż 5zł) i musiałbyś je wszystkie uwzględnić :)
    Natomiast rabat od ceny sprzedaży - to rozumiem i można by coś takiego "wkomponować".
    Chyba, że chcesz to wszystko ewidencjonować. Wtedy nie potrzebujesz wyboru z comboboxa tylko ceny zakupu należałoby przepisać z faktury (ta wyliczona może się przecież różnić od faktycznej).

    Można nieco precyzyjniej określić skąd lista się bierze
    For i = 1 To 100
        if sheets("Nazwa").cells(i , 1) = "" then exit for
        UserForm6.ComboBox2.AddItem sheets("Nazwa").cells(i , 1)
    Next i
  • #39
    kehn
    Level 12  
    No ja kupując w hurtowniach za każdym razem dostaje jakiś rabat i nigdy nie zdarzyło mi się że inny jak procentowy. chciałbym to uwzględnić przy wprowadzaniu do magazyny bo zmieni się zysk na sztuce...
    Sprzedawca w sklepie jak sprzeda jakiś towar przepisuje na kartkę (raport) kod produktu i jego cenę. z każdego dnia ja te raporty wprowadzając do naszego programu po kolei każdy kod to automatycznie zapisze się zysk na sztuce i i inne dane oraz odejmie z magazynu sprzedane sztuki danego kodu. robiliśmy to wcześniej ale jeszcze tego nie dodałem do w/w programu. tam chce umieścić rabat przy sprzedaży... nie wiem czy mnie zrozumiałeś:)

    Dodano po 2 [minuty]:

    a i owszem można cenę zakupu z rabatem obliczyć na kalkulatorze ale po co jak możemy to wprowadzić w program...

    Dodano po 1 [godziny] 1 [minuty]:

    Jak to zamienić żeby wyszukiwał w wszystkich magazynach czyli w arkuszach o początkowej nazwie "M-"??

    Private Sub TextBox1_Change()
    Dim tekst As String, wynik As String
    
    tekst = TextBox1.Value
    wynik = TekstEtykiety(tekst, "Magazyn")
    If wynik <> "" Then
        Label1.Caption = wynik
    Else
        wynik = TekstEtykiety(tekst, "Magazyn2")
        If wynik <> "" Then
            Label1.Caption = wynik
        Else
            Label1.Caption = "Nie znaleziono."
        End If
    End If
  • Helpful post
    #40
    adamas_nt
    Moderator of Programming
    Czyli cena na fakturze jest z rabatem (cena zr) i chcemy obliczyć cenę bez rabatu (cena br)?
    Coś w ten sposób:
    jeśli cena zr 198 i rabat 1 (1%) to:
    cena br (200) = cena zr + (cena zr * rabat * (100/99)/100)

    jeśli cena zr 285 i rabat 5 (5%) to:
    cena br (300) = cena zr + (cena zr * rabat * (100/95)/100)

    itd
  • #41
    kehn
    Level 12  
    próbuje już tak: niestety nie działa może wytłumaczysz mi to bo chyba zle to polecenie rozumie??
    Private Sub TextBox1_Change()
    Dim tekst As String, wynik As String
    
    tekst = TextBox1.Value
    For i = 1 To ThisWorkbook.Worksheets.Count
        If Left(LCase(Sheets(i).Name), 2) = "m-" Then
        wynik = TekstEtykiety(tekst, "i")
    If wynik <> "" Then
        Label1.Caption = wynik
    End If
    End If
    Next
    End Sub
  • Helpful post
    #42
    adamas_nt
    Moderator of Programming
    Private Sub TextBox1_Change()
    Dim tekst As String, wynik As String, i As Integer
    
    tekst = TextBox1.Value
    For i = 1 To ThisWorkbook.Worksheets.Count
    ' "i" w tej pętli to indeks arkusza
    If Left(LCase(Sheets(i).Name), 2) = "m-" Then
        'przypisanie wyniku zwróconego przez funkcję. Drugi parametr funkcji to nazwa arkusza
        wynik = TekstEtykiety(tekst, Sheets(i).Name)
        If wynik <> "" Then
            'jeśli znajdzie w arkuszu o indeksie "i", to przypisuje do etykiety
            Label1.Caption = wynik
            'wynik mamy, więc dalej szukać nie będziemy i procedurę opuszczamy
            Exit Sub
        End If
    End If
    Next
    'jeśli nie znajdzie, ta część będzie wykonywana
    Label1.Caption = "Nie znaleziono."
    End Sub
  • #43
    kehn
    Level 12  
    znowu problem... ;)
    Jak wpisuje towar w magazyn (dodaj->towar do magazynu->) to podając cenę zakupu netto i sprzedażny z combobox (marża) to do arkusza cena sprzedaży wpisuje 0...??

    drugi problem to w magazynie jest np m15 wpisane i zysk za szt. wynasi np. 7,80 zł. Pisząc raport dzienny (Utwórz->raport dzienny) wpisuje mi do arkusza w/w liczbe zaokrągloną do 8 zł ?? nie mam pojęcia jak to zmienić.

    wstawiam załącznik...

    Jak ja ci się odwdzięczę za tą pomoc?? Może piwo pocztą?? :))
  • Helpful post
    #44
    adamas_nt
    Moderator of Programming
    Nieźle namieszałeś!
    Piszesz wiele niepotrzebnych instrukcji, deklarujesz zmienne jako Variant i przypisujesz do zmiennych innego typu. Np
    Dim k
             k = TextBox2 * 1
            cenazak = k
    Cena zakupu (cenazak) wcześniej zadeklarowana jako Currency
    A wystarczy
    cenazak = TextBox2 *1

    Zbyt wiele tego typu błędów. Siedzę nad tym prawie godzinę, poprawiam i jeszcze nie mogę znaleźć wszystkich miejsc gdzie cenazak jest konwertowana.

    p.s. Duże załączniki pakuj ZIP-em i rezygnuj z prowizji, szkoda punktów :)
  • #46
    kehn
    Level 12  
    jest super!! kiedyś i ja dojdę do takiej perfekcji :)
    wszystko przejrzyste i czyste:) widać różnice...

    tylko wyświetla mi błąd Lini

    Range("K5:H7,I10:I11,I17:I18").Merge
  • Helpful post
    #47
    adamas_nt
    Moderator of Programming
    Używam E2007 i u mnie działa. Spróbuj podmienić na
    Range("K5:H7,I10:I11,I17:I18").MergeCells = True
    Nie pamiętam, czy miało być: i10:i13? Możesz też próbować umieścić ją na samym początku (przed wypełnieniem nagłówków).

    Po tej linii można dać wyśrodkowanie w pionie (chyba brakuje)
    Range("I10").VerticalAlignment = xlCenter
  • #48
    kehn
    Level 12  
    teraz jest świetnie:) działa...
    a powiedz może coś byś wprowadził do tego programu??? jak ci sie to widzi??
  • Helpful post
    #49
    adamas_nt
    Moderator of Programming
    Cóż, zamysł jest dobry. Projekt do najłatwiejszych nie należy i z pewnością jest czasochłonny. Uparcie brniesz dalej, gdzie większość woli gotowce i dawno rzuciłaby to w diabły nie narażając szarych komórek na przepracowanie. Tu tylko podziwiać, gratuluję.

    Szczerze mówiąc zaskoczyłeś mnie tym pytaniem :) Do tej pory szukałem tylko rozwiązań dotyczących konkretnych fragmentów. Trochę zasugeruję Ci Access'owego podejścia, bo w końcu budujesz program magazynowy (bazę danych).

    W takich programach stany magazynowe zmieniają się na podstawie dokumentów: faktur zakupu, sprzedaży, WZ, RW, PZ, PW itd.
    W "Dodaj do Magazynu" brakuje (mi) Nr faktury i daty zakupu (łatwiej znaleźć w segregatorze w razie czego i przyda się to do zestawień).

    Gdyby nazwę "Raport Dzienny" zmienić na "Dzienne Zestawienie Sprzedaży" (bo to właśnie robisz) byłoby bardziej "magazynowo". W tym miejscu oddzieliłbym "magazynową", wyliczoną cenę sprzedaży od faktycznej (należałoby zrobić miejsce na jej wpisanie). Domyślnie może być umieszczana ta z "cennika", ale powinna być możliwość zmiany. Ceny są przecież negocjowalne, możesz udzielić różnych rabatów, wykonać przecenę itp.

    Dalej: Jeśli każda dzienna sprzedaż będzie osobnym arkuszem, to... co za 3 lata? Z drugiej strony to nie Access (w końcu wierszy zabraknie). A może jeden skoroszyt (plik) na miesiąc/kwartał, po czym zamykasz okres, blokujesz arkusze (coby nikt nie grzebał) tworząc nowy ze stanami z poprzedniego itd?

    Raporty natomiast służą tylko do podsumowań, statystyk, prezentacji asortymentu, stanów magazynowych, ZESTAWIEŃ SPRZEDAŻY ZA OKRES (dzień, tydzień, miesiąc, od daty do daty) itp. w których używa się filtrów, sortuje, grupuje, podlicza itd. Zostaw to na później.

    Później można też pomyśleć o możliwości i formie wydruków...
  • #50
    kehn
    Level 12  
    adamas_nt wrote:
    Cóż, zamysł jest dobry. Projekt do najłatwiejszych nie należy i z pewnością jest czasochłonny. Uparcie brniesz dalej, gdzie większość woli gotowce i dawno rzuciłaby to w diabły nie narażając szarych komórek na przepracowanie. Tu tylko podziwiać, gratuluję.


    Dzieki:) ja robie bo jest mi to potrzebne a i chce sie nauczyć vb. od czegoś trzeba zacząć. No gdyby nie ty to nigdy bym sobie nie poradził:)

    Quote:
    Szczerze mówiąc zaskoczyłeś mnie tym pytaniem :) Do tej pory szukałem tylko rozwiązań dotyczących konkretnych fragmentów. Trochę zasugeruję Ci Access'owego podejścia, bo w końcu budujesz program magazynowy (bazę danych).

    W takich programach stany magazynowe zmieniają się na podstawie dokumentów: faktur zakupu, sprzedaży, WZ, RW, PZ, PW itd.
    W "Dodaj do Magazynu" brakuje (mi) Nr faktury i daty zakupu (łatwiej znaleźć w segregatorze w razie czego i przyda się to do zestawień).


    i to się zrobi :)

    Quote:
    Gdyby nazwę "Raport Dzienny" zmienić na "Dzienne Zestawienie Sprzedaży" (bo to właśnie robisz) byłoby bardziej "magazynowo". W tym miejscu oddzieliłbym "magazynową", wyliczoną cenę sprzedaży od faktycznej (należałoby zrobić miejsce na jej wpisanie). Domyślnie może być umieszczana ta z "cennika", ale powinna być możliwość zmiany. Ceny są przecież negocjowalne, możesz udzielić różnych rabatów, wykonać przecenę itp.


    Myślałem nad tym już wcześniej... sprzedawca też może się pomylić i inaczej skasować... Chce zrobić opcje ręcznego wpisywania.

    Quote:
    Dalej: Jeśli każda dzienna sprzedaż będzie osobnym arkuszem, to... co za 3 lata? Z drugiej strony to nie Access (w końcu wierszy zabraknie). A może jeden skoroszyt (plik) na miesiąc/kwartał, po czym zamykasz okres, blokujesz arkusze (coby nikt nie grzebał) tworząc nowy ze stanami z poprzedniego itd?


    Dokładnie czytasz w moich myślach... każdy dzień 1 arkusz z nazwa daty, gdy napiszesz już nowy miesiąc (w podawanej nazwie)będzie zapytanie czy zakończyć stary. wtedy zapisze się plik obok index zablokuje arkusze a i wszystkie arkusze w index zostaną usunięte z starą datą i rozpoczynasz nowy miesiąc...

    Quote:
    Raporty natomiast służą tylko do podsumowań, statystyk, prezentacji asortymentu, stanów magazynowych, ZESTAWIEŃ SPRZEDAŻY ZA OKRES (dzień, tydzień, miesiąc, od daty do daty) itp. w których używa się filtrów, sortuje, grupuje, podlicza itd. Zostaw to na później.


    zostawię bo jeszcze nie wiem czy zestawienia z tygodnia i miesiąca nie będą wygenerowane automatycznie kodem. Fajnie byłoby zrobić żeby program sam utworzył arkusze dzienne na cały miesiąc nie wliczając niedziel świąt itd. po czym np w sobotę zrobił zestawienie tygodnia a przy zakończeniu miesiąca zestawienie jego. Tylko też mysi być opcja zmiany bo czasem może wyjść dzień zamknięty.
  • Helpful post
    #51
    adamas_nt
    Moderator of Programming
    Quote:
    W "Dodaj do Magazynu" brakuje (mi) Nr faktury i daty zakupu (łatwiej znaleźć w segregatorze w razie czego i przyda się to do zestawień).
    Chyba źle myślę.
    Dodając nowy towar do magazynu powinno określać się tylko jego cechy (jm, ceny, nazwę, kod...) Stany magazynowe (jak już pisałem) powinny być wyliczane na podstawie dokumentów magazynowych. Czyli mamy fakturę zakupu, dodajemy nowy towar do magazynu. Z faktury zakupu w innym formularzu wpisujemy: datę nabycia, Nr Faktury, ilość, kontrahenta. Sprzedaż podobnie. Liczenie stanów zostawmy Excelowi z podglądem w formularzach.

    Z tego co pamiętam zawsze jest problem z ceną zakupu, jeśli na stanie jest towar z inną a o tym samym kodzie. WF-Mag chyba nadpisywał, Subiekt uśredniał...
  • #52
    kehn
    Level 12  
    Czyli do każdego dodanego towaru a magazynie ma być info o nr faktury??
    i wpisanie faktury twoim zdaniem jakie info powinno zawierać??

    napisz czemu nie działa zaznaczene:
    Worksheets(ark).Range("a" & wrs, "q" & wrs).Select

    ani:
    Sheets(ark).Range("a" & wrs, "q" & wrs).Select

    i tak też zle:
    Sheets(ark).Range("a" & wrs & ":q" & wrs).Select


    co jest nie tak bo wyskakuje błąd
  • Helpful post
    #53
    adamas_nt
    Moderator of Programming
    kehn wrote:
    Czyli do każdego dodanego towaru a magazynie ma być info o nr faktury??
    i wpisanie faktury twoim zdaniem jakie info powinno zawierać??
    Powinno to (wg mnie) wyglądać tak:
    Arkusz "magazyn" (asortyment) - gdzie wpisujesz każdy nowy towar z cechami, o których pisaliśmy. Stany wyliczałby Excel na podstawie zakupów i sprzedaży.
    Arkusz "zakupy" - gdzie wpisujesz (z faktury zakupu) kod, (nazwę), datę, ilość i kontrahenta.
    Arkusz "sprzedaż" - wpisujesz: kod, (nazwę), datę sprzedaży, cenę sprzedaży, ilość i kontrahenta. To możesz zastąpić "dziennym zestawieniem sprzedaży" w osobnych arkuszach. Trochę więcej roboty z liczeniem, ale do przyjęcia. Można też zostawić tak, jam masz. Tzn stan na bieżąco obliczany jest w formularzu i zapisywany w arkuszu "magazyn". Minusem tego rozwiązania jest sytuacja, gdy anulujesz sprzedaż (usuwasz wiersz) lub zmieniasz ilość szt. Musisz ręcznie poprawiać stan. Dlatego lepiej, by Excel wyliczał to sobie sam (Np formułą SUMA.JEŻELI).

    kehn wrote:
    co jest nie tak bo wyskakuje błąd
    W trybie debugowania sprawdź co jest przypisane zmiennym "ark" i "wrs" (najedź kursorem myszy). Podejrzewam, że co najmniej jednej nic (""). Jeśli wartości przypisujesz w innej procedurze, to może wystarczy zadeklarować je w Global (Na samej górze kodu).
  • #54
    kehn
    Level 12  
    MsgBox "DODANO", vbOKOnly, "Okno dodania"
    TextBox1.Value = ""
    t1 = t1 - ComboBox1.Value
    Sheets(ark).Cells(wrs, 2) = t1
    If t1 = 0 Then
    Sheets(ark).Range("a" & wrs & ":q" & wrs).Select
    Selection.ColorIndex = 6
    End If


    sprawdzam to ark="m-magazyn" czyli ok a wrs = 30 to też ok. zresztą wcześniej tez jest użycie tych zmiennych i tam błędu nie ma??
  • Helpful post
    #55
    adamas_nt
    Moderator of Programming
    Otwórz sobie okno immediate w edytorze VB (Ctrl+G), w kod wklej linie (patrz przykład) i uruchom procedurę.
    MsgBox "DODANO", vbOKOnly, "Okno dodania"
    TextBox1.Value = ""
    
    Debug.Print ark ' TUTAJ
    Debug.Print wrs
    Debug.Print t1
    Stop
    
    t1 = t1 - ComboBox1.Value
    Sheets(ark).Cells(wrs, 2) = t1
    If t1 = 0 Then
    Sheets(ark).Range("a" & wrs & ":q" & wrs).Select
    Selection.ColorIndex = 6
    End If

    W oknie pokaże się co jest przypisane do tych zmiennych. Jeśli zostanie puste to nic nie jest przypisane (błąd Nr 9).
  • #56
    kehn
    Level 12  
    zmieniłem kod na:
    Sheets(ark).Select
    With Range("a" & wrs & ":q" & wrs).Interior
            .ColorIndex = 3
    End With

    i wszystko działa...:)

    Mam pytanie chce żeby wyświetlił się msgbox lecz nie zatrzyma on czytania kodu i w tym samym czasie bedzie obsługiwana pętla for. a jak ktoś nadusi w msgbox OK to zakończy działanie pętli i zacznie czytać kod za petla. chyba rozumiesz jak nie to postaram sie inaczej wytłumaczyć...:)

    Dodano po 4 [minuty]:

    jeszcze jeden problem:
    jak powstrzymać otwieranie nowego arkusza jak jego nazwa się powtórzy??

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


    tak coś nie wychodzi;)
  • Helpful post
    #57
    adamas_nt
    Moderator of Programming
    kehn wrote:
    chce żeby wyświetlił się msgbox lecz nie zatrzyma on czytania kodu
    Taka już rola MsgBox'a, żeby zatrzymywał i czekał na decyzję użytkownika.

    kehn wrote:
    jak powstrzymać otwieranie nowego arkusza jak jego nazwa się powtórzy??
    Excel z pewnością nie pozwoli na dublowanie nazw arkuszy.

    Jeśli chodzi o nadawanie nazw musiałbyś najpierw wykonać porównanie i dopiero tworzyć nowy arkusz. Przykład (w nowym pliku w A1 wpisz liczbę 1 i uruchom)
    Sub bla()
    For i = 1 To ThisWorkbook.Worksheets.Count
        If Sheets(i).Name = "Arkusz" & Range("A1") Then
            MsgBox "TAKA NAZWA JUZ ISTNIEJE!!!"
            Range("A1").Select
            Exit Sub
        End If
    Next
    
    Sheets.Add After:=Sheets(Sheets.Count)
    ActiveSheet.Name = "Arkusz" & Range("A1")
    
    End Sub
  • #58
    kehn
    Level 12  
    adamas_nt wrote:
    Taka już rola MsgBox'a, żeby zatrzymywał i czekał na decyzję użytkownika.

    zobacz na kod: chciałem to do tego...

    For animacja = 1 To 5 Step 1
     przerwa = 1
      start = Timer
       Do While Timer < start + przerwa
        DoEvents
       Loop
      With Range("a" & wrs).Interior
            .ColorIndex = 2
    End With
    If animacja = 3 Then
    
    End If
      start = Timer
       Do While Timer < start + przerwa
        DoEvents
       Loop
      With Range("a" & wrs).Interior
            .ColorIndex = 3
    End With
     Next animacja
    MsgBox "W magazynie skończył sie kod " & kk, vbOKOnly, "Zero sztuk w magazynie"


    i mówisz że jest nie możliwe żeby wyswietlił sie msgbox a pętla by robiła swoje??

    Dodano po 2 [minuty]:

    adamas_nt wrote:
    Excel z pewnością nie pozwoli na dublowanie nazw arkuszy.

    na dublowane nie pozwoli ale pokaże błąd i arkusz nazwie standardowo...czyli arkusz 1..2....

    przykład który podałeś jest bardzo zrozumiały bo zmienna i ma wartość liczbową i ty porównujesz z liczbą w komórce. A można zmienna i zamienić na nazwę arkusza a nie wartość liczbową to by rozwiązało problem.
    If Sheets(nazwaarkusza).Name = "M-" & x Then
  • Helpful post
    #59
    adamas_nt
    Moderator of Programming
    kehn wrote:
    A można zmienna i zamienić na nazwę arkusza a nie wartość liczbową to by rozwiązało problem.
    Po lewej stronie znaku "=" zmienna i to indeks arkusza. Wyrażenie "Sheets(i).Name" zwraca wartość tekstową (nazwę). Nie ma to znaczenia dla prawej strony. W nowym (standardowym) pliku "Arkusz1" i "Sheets(1).Name" to ten sam string.

    Kluczową sprawą w tym przypadku jest przerwane procedury (End Sub) w momencie znalezienia nazwy arkusza równej wzorcowi przed poleceniem Sheets.Add
  • #60
    kehn
    Level 12  
    To czemu to nie działa??
    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