[EXCEL] Pętla do obliczenia wyniku >0


(hopsiup) #1

Witam

Proszę o pomoc w napisaniu pętli w Excel pod visualbasic.

Nie chcę tłumaczyć sensu moich obliczeń w skoroszycie bo chodzi mi tylko o automatyzację, obecnie robię to ręcznie.

Chodzi o to że, komórki zaznaczone na czerwono ręcznie zwiększam o "1" aż do momentu uzyskania liczby powyżej 0 w komórkach B5, B8, B11, B14

Starałem się zrobić to za pomącą iteracji, niestety wyskakują błędy lub nie kończy z powodzeniem

Dołączam link do pliku żeby można było łatwiej zrozumieć o co mi chodzi.

http://www.sendspace.pl/file/8ef83c78e8d23575764027b

Tu jest OK

1jpg_xaxrser.jpg

Tu jest źle

2png_xaxrsap.png

Pozdrawiam


(Pablo_Wawa) #2
Sub PoprawD3()

  While Range("B5").Value <= 0

    Range("D3").Value = Range("D3").Value + 1

  Wend

End Sub

Pozostałe komórki (D6, D9 i D13) robisz analogicznie.


(hopsiup) #3

“Pablo_Wawa”

While Range(“B5”).Value <= 0

Range(“D3”).Value = Range(“D3”).Value + 1

Wend

End Sub

Pozostałe komórki (D6, D9 i D13) robisz analogicznie.


([alex]) #4
Sub PoprawD3()

  While Range("B5").Value > 0

    Range("D3").Value = Range("D3").Value - 1

  Wend

  While Range("B5").Value <= 0

    Range("D3").Value = Range("D3").Value + 1

  Wend

End Sub

(hopsiup) #5

A jak wrócić do początku żeby sprawdzało czy po obliczeni nie ma minusów i tak np. z ustawieniem na powiedzmy 100 okrążeń?

Pozdrawiam


([alex]) #6

Przecież to co podałem najpierw wraca.


(Pablo_Wawa) #7

Możesz utworzyć makro o zdefiniowanej nazwie

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

które jest przez Excel wywoływane przy każdorazowej zmianie którejkolwiek komórki arkusza i tam umieścić swoje makro/kod. Tylko ta funkcja musi być umieszczona w danym arkuszu (zakładce), a nie w globalnym module dla makr (okno Project - VBAProject) Zauważyłem tylko jeden poważny problem - zwiększanie jednej z czerwonych komórek Dn powoduje zmianę wartości sumy z D2 a co za tym idzie wartości czerwonych komórek Bn, które mogą stać się (znów) ujemne. Być może trzeba to zwiększanie o 1 zmodyfikować (nie testowałem), tak jak to proponuje [alex].

Private Sub Worksheet_Change(ByVal Target As Excel.Range)

Dzialaj = True

While Dzialaj


  Dzialaj=False

  If Range("B5").Value <= 0

    Range("D3").Value = Range("D3").Value + 1

    Dzialaj = True

  End If


  If Range("B8").Value <= 0

    Range("D6").Value = Range("D3").Value + 1

    Dzialaj = True

  End If


  If Range("B11").Value <= 0

    Range("D9").Value = Range("D3").Value + 1

    Dzialaj = True

  End If


  If Range("B14").Value <= 0

    Range("D12").Value = Range("D3").Value + 1

    Dzialaj = True

  End If


Wend

End Sub

Czy coś w tym rodzaju.


(hopsiup) #8

Dziękuję za pomoc.

A więc zrobiłem w/g wzoru alexa:

Sub PoprawD3()

While Range(“B5”).Value > 0

Range(“D3”).Value = Range(“D3”).Value - 1

Wend

While Range(“B5”).Value <= 0

Range(“D3”).Value = Range(“D3”).Value + 1

Wend

While Range(“B8”).Value > 0

Range(“D3”).Value = Range(“D6”).Value - 1

Wend

While Range(“B8”).Value <= 0

Range(“D3”).Value = Range(“D6”).Value + 1

Wend

While Range(“B11”).Value > 0

Range(“D3”).Value = Range(“D9”).Value - 1

Wend

While Range(“B11”).Value <= 0

Range(“D3”).Value = Range(“D9”).Value + 1

Wend

While Range(“B14”).Value > 0

Range(“D3”).Value = Range(“D12”).Value - 1

Wend

While Range(“B14”).Value <= 0

Range(“D3”).Value = Range(“D12”).Value + 1

Wend

End Sub

I niestety zapętla się, nie podając choćby w przybliżeniu wyniku jaki mi się udał ręcznie wpisując to co jest na zdjęciu w pierwszym poście.

Suma niestety musi się powiększać, tak jest w założonym zadaniu.

PLIK http://www.sendspace.pl/file/76169eedd976c558ec1bad9

Co do kodu od Pablo_Wawa coś nie chce się skompilować, prawdopodobnie to mój błąd, więc będę dalej szukał co robię źle.

Pozdrawiam


([alex]) #9
Range("D3").Value = Range("D6").Value - 1

Bo nawet zaadoptować nie potrafisz.

D3=D6-1 ??


(hopsiup) #10

Faktycznie mój błąd, wiedziałem że to ja coś nabiedziłem :stuck_out_tongue: , teraz wszystko działa, wielkie dzięki ALEX.

Dodane 15.02.2013 (Pt) 12:51

Mam jeszcze jedno pytanko odnośnie działania programu, jak zrobić żeby program powrócił do początku i sprawdził czy wszystkie komórki są dodatnie a jak nie to wykonywał działanie do skutku, ewentualnie zadaną ilość pętli żeby się nie zapętliło?

Pozdrawiam