vbamania.pl
login:
hasło:
 
  *Rejestracja *Zapomniane hasło
 Dziś jest wtorek, 09 czerwca 2026 roku.
Ustaw jako stronę startową Ulubione Napisz
PowrótPowrót do serwisu  RegulaminRegulamin rssRSS

  tytuł wątku:
Wątki dyskusji

FIFO w VBA


otwartyotwarty rozpoczął: pawel30 postów: 28



napisał: admin
postów: 613


umieszczony:
28 lipca 2010
22:53

  
Błędy zostały poprawione.
Niestety strona główna forum dalej się wolno ładuje, ale to jak już mówiłem sprawa związana z MySQL.

pozdrawiam
admin
napisał: admin
postów: 613


umieszczony:
27 lipca 2010
00:12

  
Co do części pierwszej.
To po prostu mój błąd jako programisty:/
Poprawię jutro!

Część druga - przyglądnę się tematowi, jeśli chodzi o błędy na stronie.
A wolne ładowanie listy wątków... to nie ja jestem winien, tylko kwerenda SQL tak długo się wykonuje. Jak ktoś mi będzie w stanie pomóc, z MySQL to ja bardzo chętnie...

Dziękuję za informację, serdecznie pozdrawiam
admin


Cytat:
Cytat:
Coś nie umiem wrócić do strony gdzie jak sądzę jest jakiś plik z danymi. [...]

Witam!
No właśnie co jest grane z wątkami, które mają powyżej 20 postów?! Wątki takie są dzielone na dwie podstrony. Ale druga podstrona znika, nie idzie jej otworzyć, natomiast przy próbie wejścia na nią urzytkownik przenoszony jest na drugą podstronę forum, a nie danego wątku:
http://www.vbamania.estrefa.pl/index.php?go=forum&idd=&page=2

Oto linki do takich wątków (przeryłem całe forum, a przecież można posortować wątki wg ilości postów, ups, dopiero teraz to zauważyłem):
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1886&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1870&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1738&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=739&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=831&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1265&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1019&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=830&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=847&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=683&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=656&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=472&return=watek

Np. ten wątek ma 25 postów, a dostępne jest tylko 20 ostatnich!

Poza tym mała uwaga co do ładowania stron na forum.

Na dole, na pasku stanu pojawia się taki komunikat: ! Błąd na stronie.
Albo:
! Gotowe, ale wystąpiły błędy na stronie.
Poza tym, strona się też wolno ładuje, kiedy wychodzi się z danego wątku, do forum.

Przepraszam autora tego wątku za ten wywód, być może lepiej byłoby napisać osobiście do Admina, w razie czego usunę stąd swój wpis (jeśli można).

Proszę Admina o wypowiedzenie się.

Z pozdrowieniami
napisał: markos97
postów: 114


umieszczony:
26 lipca 2010
23:23

edytowany:
26 lipca 2010
23:26

  
Cytat:
Coś nie umiem wrócić do strony gdzie jak sądzę jest jakiś plik z danymi. [...]

Witam!
No właśnie co jest grane z wątkami, które mają powyżej 20 postów?! Wątki takie są dzielone na dwie podstrony. Ale druga podstrona znika, nie idzie jej otworzyć, natomiast przy próbie wejścia na nią urzytkownik przenoszony jest na drugą podstronę forum, a nie danego wątku:
http://www.vbamania.estrefa.pl/index.php?go=forum&idd=&page=2

Oto linki do takich wątków (przeryłem całe forum, a przecież można posortować wątki wg ilości postów, ups, dopiero teraz to zauważyłem):
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1886&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1870&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1738&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=739&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=831&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1265&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=1019&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=830&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=847&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=683&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=656&return=watek
http://www.vbamania.estrefa.pl/index.php?go=forum&go2=zobacz&id_watek=472&return=watek

Np. ten wątek ma 25 postów, a dostępne jest tylko 20 ostatnich!

Poza tym mała uwaga co do ładowania stron na forum.

Na dole, na pasku stanu pojawia się taki komunikat: ! Błąd na stronie.
Albo:
! Gotowe, ale wystąpiły błędy na stronie.
Poza tym, strona się też wolno ładuje, kiedy wychodzi się z danego wątku, do forum.

Przepraszam autora tego wątku za ten wywód, być może lepiej byłoby napisać osobiście do Admina, w razie czego usunę stąd swój wpis (jeśli można).

Proszę Admina o wypowiedzenie się.

Z pozdrowieniami
napisał: Trebor
postów: 1209


umieszczony:
8 lipca 2010
20:19

  
Coś nie umiem wrócić do strony gdzie jak sądzę jest jakiś plik z danymi.
Zamieść proszę skoroszyt z makrem, bo bez tego trudno zrozumieć o co tu chodzi, a pamięcią tak daleko niestety nie sięgam.

Hej
napisał: mwl
postów: 4


umieszczony:
6 lipca 2010
14:05

  
Cytat:
Wielkie dzięki Trebor za kawał wspaniałej roboty. Teraz wszystko działa idealnie. Podziękowania również dla Artika, który pomógł w testowaniu makra. Jeszcze raz dzięki Trebor:):):).

Pozdrawiam

Paweł


Niestety makro nie radzi sobie z rozchodowaniem w przypadku gdy musi podzielić "paczki" kupionego towaru:
Kupno 28000 po 1
Sprzedaż 28000 po 2
Kupno 44832 po 3
Kupno 62000 po 4
Sprzedaż 50000 po 5
Sprzedaż 56832 po 6


Przy sprzedaży 50000 makro wylicza błędną wartość zakupu. Powinno być:
Sprzedaż 44832 * 3 + Sprzedaż 5168 * 4 = 155 168,00 a pokazuje 20 672,00 czyli tylko tą część: Sprzedaż 5168 * 4 - gubi pierwszą część.
Jeśli zamienić 3 i 4 kupno miejscami do postaci:
Kupno 28000 po 1
Sprzedaż 28000 po 2
Kupno 62000 po 3
Kupno 44832 po 4
Sprzedaż 50000 po 5
Sprzedaż 56832 po 6 wtedy sobie radzi...
napisał: pawel30
postów: 40


umieszczony:
28 listopada 2006
22:23

  
Wielkie dzięki Trebor za kawał wspaniałej roboty. Teraz wszystko działa idealnie. Podziękowania również dla Artika, który pomógł w testowaniu makra. Jeszcze raz dzięki Trebor:):):).

Pozdrawiam

Paweł
napisał: Trebor
postów: 1209


umieszczony:
28 listopada 2006
21:38

  
Czy prawidłowo to nie wiem ale może zrobić tak - na początku makra wkopiuj linię
On Error GoTo koniec


na samym końcu linie (przed End sub)
Exit Sub
koniec:
MsgBox "Wystapił błąd przy obliczeniach dla wiersza " & a
Cells(a, 1).Select

napisał: pawel30
postów: 40


umieszczony:
28 listopada 2006
21:16

  
Witam:).

Podczas testowania Twojego ostatniego makra Trebor przez pomyłkę wprowadziłem zamiast liczby w kolumnie ilość przecinek wówczas pojawił się błąd Run time error "13": Type mismatch. Wiem, że trzeba wprowadzić obsługę błędów ale nie mam pojęcia jak to zrobić prawidłowo. Proszę więc o dalszą pomoc.

Pozdrawiam

Paweł
napisał: Trebor
postów: 1209


umieszczony:
28 listopada 2006
15:17

  
To koszuje kolejne testy :D
Sub mag()
Dim suma_przychód As Double
Dim suma_rozchód As Double
Dim a As Long
Dim b As Long
Dim pozostało As Double
Dim w_wierszu As Long
Dim skończono As Long
Dim kwota As Double
Dim ile As Double
w_wierszu = 2
skończono = 2
For a = 2 To Range("A65536").End(xlUp).Row
If Left(UCase(Cells(a, 1)), 3) <> "PRZ" And Left(UCase(Cells(a, 1)), 3) <> "ROZ" And Left(UCase(Cells(a, 1)), 2) <> "BO" Then Cells(a, 4) = ""
If Mid(UCase(Cells(a, 1)), 1, 3) = "PRZ" Or Left(UCase(Cells(a, 1)), 2) = "BO" Then suma_przychód = suma_przychód + Cells(a, 2)
If Mid(UCase(Cells(a, 1)), 1, 3) = "ROZ" Then
      suma_rozchód = suma_rozchód + Cells(a, 2)
      'If suma_przychód < suma_rozchód Then MsgBox "Rozchód jest większy od Przychodu."

If suma_przychód < suma_rozchód Then
Cells(a, 2).Select
MsgBox "Rozchód " & suma_rozchód & " jest większy od przychodu " & suma_przychód
'cells(a,2) = "" 'odblokuj linie jeśli chcesz usunąć błędną ilość
'cells(a,4) = ""
Application.EnableEvents = True
End
End If

'gdy pozostało jest większy lub równy od rozchodu dla wiersza
If pozostało >= Cells(a, 2) Then
Cells(a, 4) = Cells(a, 2) * Cells(w_wierszu, 3)
pozostało = pozostało - Cells(a, 2)
Else
For b = skończono To Range("A65536").End(xlUp).Row
If Mid(UCase(Cells(b, 1)), 1, 3) = "PRZ" Or Left(UCase(Cells(b, 1)), 2) = "BO" Then

'gdy przychód dla wiersza jest większy lub równy od rozchodu dla wiersza
      If Cells(b, 2) + pozostało + ile >= Cells(a, 2) Then
      Cells(a, 4) = pozostało * Cells(w_wierszu, 3) + Cells(b, 3) * (Cells(a, 2) - pozostało - ile) + kwota
      pozostało = pozostało + Cells(b, 2) - Cells(a, 2) + ile
      w_wierszu = b
      kwota = 0
      ile = 0
      Exit For
'gdy rozchód jest większy od przychodu w wierszu
      Else
kwota = kwota + Cells(b, 4)
ile = ile + Cells(b, 2)
      End If

End If
Next b
skończono = b + 1
End If

End If

Next a
End Sub



Pozdrawiam
napisał: pawel30
postów: 40


umieszczony:
28 listopada 2006
13:01

  
Przetestowałem szybciutko twoje nowe makra Trebor.
Ponieważ kasowana była wartość z komórki D1 więc zmieniłem w makrze zaznaczanie kolumny A od drugiego wiersza. Wprowadzałem różne kombinacje i za każdym razem makro wyliczało wartości prawidłowo.

Prosił bym jeszcze o modyfikację makra tak aby uwzględniało Bilans otwarcia, który będę wprowadzał na początku w drugim wierszu i oznaczał w skrócie BO. Bilans otwarcia powinien być traktowany jak przychód.

Mam jeszcze do Ciebie Trebor jedną prośbę. Otóż po pojawieniu się komunikatu, że "Rozchód jest większy od Przychodu" fajnie by było, żeby makro skasowało błedną ilość rozchodu oraz błedną wyliczoną wartość i ustawiło się ponownie w komórce, w której wwprowadzono niewłaściwą ilość.

Pozdrawiam

Paweł
napisał: Trebor
postów: 1209


umieszczony:
28 listopada 2006
12:01

  
To mnie wypunktował ;)
Oto kolejna wersja - jak zwykle mało testowana
Sub mag()
Dim suma_przychód As Double
Dim suma_rozchód As Double
Dim a As Long
Dim b As Long
Dim pozostało As Double
Dim w_wierszu As Long
Dim skończono As Long
Dim kwota As Double
Dim ile As Double
w_wierszu = 2
skończono = 2
For a = 1 To Range("A65536").End(xlUp).Row
If Left(UCase(Cells(a, 1)), 3) <> "PRZ" And Left(UCase(Cells(a, 1)), 3) <> "ROZ" Then Cells(a, 4) = ""
If Mid(UCase(Cells(a, 1)), 1, 3) = "PRZ" Then suma_przychód = suma_przychód + Cells(a, 2)
If Mid(UCase(Cells(a, 1)), 1, 3) = "ROZ" Then
      suma_rozchód = suma_rozchód + Cells(a, 2)
      If suma_przychód < suma_rozchód Then MsgBox "Rozchód jest większy od Przychodu."


'gdy pozostało jest większy lub równy od rozchodu dla wiersza
If pozostało >= Cells(a, 2) Then
Cells(a, 4) = Cells(a, 2) * Cells(w_wierszu, 3)
pozostało = pozostało - Cells(a, 2)
Else
For b = skończono To Range("A65536").End(xlUp).Row
If Mid(UCase(Cells(b, 1)), 1, 3) = "PRZ" Then

'gdy przychód dla wiersza jest większy lub równy od rozchodu dla wiersza
      If Cells(b, 2) + pozostało + ile >= Cells(a, 2) Then
      Cells(a, 4) = pozostało * Cells(w_wierszu, 3) + Cells(b, 3) * (Cells(a, 2) - pozostało - ile) + kwota
      pozostało = pozostało + Cells(b, 2) - Cells(a, 2) + ile
      w_wierszu = b
      kwota = 0
      ile = 0
      Exit For
'gdy rozchód jest większy od przychodu w wierszu
      Else
kwota = kwota + Cells(b, 4)
ile = ile + Cells(b, 2)
      End If

End If
Next b
skończono = b + 1
End If

End If

Next a
End Sub



Co do procedury Worksheet_Change to proponuję tak
If Target.Column < 5 Then
    Application.EnableEvents = False
    Call mag
    Application.EnableEvents = True
  End If
End Sub



ponieważ zmiany nie tylko rozchodu mają wpływ na poprawność wyliczeń.
Pozdrawiam
napisał: pawel30
postów: 40


umieszczony:
28 listopada 2006
08:39

  
Witam:).

Wygląda na to, że słabo przetestowałem makro. Nie przewidziałem bowiem sytuacji, w której rozchód pierwszy będzie równy drugiemu przychodowi, wówczas makro nie wycenia kolejnego rozchodu.

Makro to niezwykle mnie zaciekawiło. Próbowałem przeanalizować
je i zrozumieć istotę jego działania ale moja wiedza na temat VBA umożliwiła mi jedynie modyfikację makra tak aby wartość rozchodu była wpisywana w kolumnie D.

Wszelkie moje próby modyfikacji makra aby np. brany był pod uwagę bilans otwarcia i traktowany jak przychód spełzły na niczym.

Będę wdzięczny za dalszą pomoc w usprawnieniu makra.

Paweł
napisał: Trebor
postów: 1209


umieszczony:
27 listopada 2006
09:46

  
Cytat:
Trebor
Co do ostatniej procedury.
W jakim celu jest pętla For Each...Next, skoro Target zawiera jedną komórkę? Przynajmniej tak mi się wydaje. I drugie. Dlaczego Mid() a nie Left()?

Artik

Hej
Jest to zabezpieczenie przed wysypaniem się makra gdy użytkownik zmieni jednorazowo więcej niż jedną komórkę (wkopiuje, usunie).
Co do mid to nie wiem dlaczego tak napisałem. Tak mi przyszło do głowy za pierwszym razem i już poszło z rozpędu wszędzie. Oczywiście można to zmienić na left.

Rozumiem, że z czystej sympatii nie zwróciłeś mi uwagi na straszny styl makra zasadniczego (braku formatowania ułatwiającego analizę), ale zwróć uwagę że i tak dokonałem postępu nazywając zmienne w taki sposób aby przybliżały co sobą reprezentują (a nie tak jak to miałem w zwyczaju a, b, c,...):p

Pozdrawiam
napisał: pawel30
postów: 40


umieszczony:
27 listopada 2006
07:14

  
Dzięki:).

Paweł
napisał: Trebor
postów: 1209


umieszczony:
26 listopada 2006
22:35

  
Pamiętaj, że makro działa na całym zakresie danych. Jeśli coś zmienisz w kolumnie B a w kolumnie A w wierszu zmienianym będzie "Roz" wtedy makro przeliczy wszystko od początku nadpisując dane. Nie ma w makrze sprawdzenia czy dane są kompletne.
Poniższe makro wklej po kliknięciu prawym klawiszem myszy na nazwie arkusza i wybraniu wyświetl kod. Makro będzie wywoływać makro o nazwie Mag
Private Sub Worksheet_Change(ByVal Target As Range)
Dim komorka As Range
If Target.Column = 2 Then
For Each komorka In Target
If Mid(UCase(komorka.Offset(0, -1)), 1, 3) = "ROZ" Then Call mag: Exit For
Next
End If
End Sub



Pozdrawiam
napisał: pawel30
postów: 40


umieszczony:
26 listopada 2006
20:53

  
Przepraszam Cię Trebor ale nie zauważyłem Twojego postu z godz.19:14.
To makro działa dokładnie w taki sposób jak potrzebuję.
Wielkie dzięki za pomoc:). Z przyjmnością poczekam teraz na deser.

Paweł
napisał: pawel30
postów: 40


umieszczony:
26 listopada 2006
19:52

  
Dane:
treść ilość wartość
PRZ 10 100 ( cena 10 )
PRZ 10 120 ( cena 12 )
ROZ 5 50 ( ok )
ROZ 6 62 ( ok )
ROZ np.1 108 ( powinno być 12 )
Paweł
napisał: Trebor
postów: 1209


umieszczony:
26 listopada 2006
19:29

  
Podaj dane dla których występuje błąd.
napisał: pawel30
postów: 40


umieszczony:
26 listopada 2006
19:20

  
Tym razem makro wycenia kolejny rozchód ale za każdym razem wartość trzeciego rozchodu ( dla ilości, które można jeszcze rozchodować ) jest różnicą pomiędzy sumą przychodów pierwszego i drugiego oraz sumą rozchodów pierwszego i drugiego.

Paweł
napisał: Trebor
postów: 1209


umieszczony:
26 listopada 2006
19:14

  
Pośpieszyłem się
Sub mag()
Dim suma_przychód As Double
Dim suma_rozchód As Double
Dim a As Long
Dim b As Long
Dim pozostało As Double
Dim w_wierszu As Long
Dim skończono As Long
Dim kwota As Double
Dim ile As Double
w_wierszu = 2
skończono = 2
For a = 1 To Range("A65536").End(xlUp).Row
If Mid(UCase(Cells(a, 1)), 1, 3) = "PRZ" Then suma_przychód = suma_przychód + Cells(a, 2)
If Mid(UCase(Cells(a, 1)), 1, 3) = "ROZ" Then
     suma_rozchód = suma_rozchód + Cells(a, 2)
     If suma_przychód < suma_rozchód Then MsgBox "Rozchód jest większy od Przychodu."


'gdy pozostało jest większy lub równy od rozchodu dla wiersza
If pozostało >= Cells(a, 2) Then
Cells(a, 3) = Cells(a, 2) * Cells(w_wierszu, 3)
pozostało = pozostało - Cells(a, 2)
Else
For b = skończono To Range("A65536").End(xlUp).Row
If Mid(UCase(Cells(b, 1)), 1, 3) = "PRZ" Then

'gdy przychód dla wiersza jest większy lub równy od rozchodu dla wiersza
     If Cells(b, 2) + pozostało + ile >= Cells(a, 2) Then
     Cells(a, 3) = pozostało * Cells(w_wierszu, 3) + Cells(b, 3) * (Cells(a, 2) - pozostało - ile) + kwota
     pozostało = pozostało + Cells(b, 2) - Cells(a, 2)
     w_wierszu = b
     kwota = 0
     ile = 0
     Exit For
'gdy rozchód jest większy od przychodu w wierszu
     Else
kwota = kwota + Cells(b, 4)
ile = ile + Cells(b, 3)
     End If

End If
Next b
End If

End If
skończono = b + 1
Next a
End Sub



<-wstecz  1 2  dalej->
wszystkich stron: 2


Sortuj posty: z