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

  tytuł wątku:
Wątki dyskusji

NWW i NWD w VBA (Excel)


otwartyotwarty rozpoczął: jvek postów: 7



napisał: michal84
postów: 15


umieszczony:
5 czerwca 2007
12:51

  
witaj

Private Sub CommandButton1_Click()
Dim a As Integer, b As Integer, x As Integer, y As Integer
Dim c As Integer, pom As Variant, wartosc As Double

MsgBox "Szukanie największego wspólnego dzielnika" & Chr(13) & _
"Szukanie najmniejszej wspólnej wielokrotności"

'najpiers sprawdza czy podana wartosc jest liczba a jesli tak to czy calkowita
pom = (InputBox("Wprowadź pierwszą liczbę"))
If IsNumeric(pom) Then
If (pom - Int(pom) = 0) And pom > 0 And pom < 32768 Then a = pom Else GoTo blad
Else
GoTo blad
End If

pom = (InputBox("Wprowadź drugą liczbę"))
If IsNumeric(pom) Then
If (pom - Int(pom) = 0) And pom > 0 And pom < 32768 Then b = pom Else GoTo blad
Else
GoTo blad
End If



If a > b Then
c = a
a = b
b = c
End If

x = a
y = b


Do While a <> 0
c = b Mod a
b = a
a = c
Loop
wartosc = CDbl(x) * CDbl(y) / b
MsgBox " Odp: " & "NWD liczb " & x & " i " & y & " jest " & b
MsgBox " Odp: " & "NWW liczb " & x & " i " & y & " jest " & wartosc
Exit Sub

blad:
MsgBox "wprowadzane wartości muszą być liczbami naturalnymi" _
& Chr(13) & "z przedziału domkniętego od 1 do 32767", vbCritical

End Sub




liczy od 1 do maxymalnej wartosci jaka moze pomiescic typ integer , 0 wprowadzic nie pozwoli ani liczby innej niz naturalna, zreszta chyba nawet sie nie liczy dla zera bo to nie ma sensu , jesli chcesz zmienic wiekszy zakres wartosci to pozmieniaj typy z integer na long i wszedzie tam gdzie jest 32767 lub 32768 zamien na 2147483647
napisał: jvek
postów: 3


umieszczony:
4 czerwca 2007
19:06

  
welkie dzieki za pomoc, a czy mógłbys go jeszcze tak zmodyfikaowac zeby liczył nww i nwd tylko z liczb naturalnych to znaczy 0,1,2,3... itd. aha i gdy wpisze liczby 0 i 0 to liczy tylko nwd a potem jakis error (a nww chyba tez powinno byc 0) da sie go ominac? lub jezeli nie to zeby jakis stosowny komunikat wyskoczyl... to chyba pzez to ze nie mozna dzielic przez 0.
napisał: michal84
postów: 15


umieszczony:
2 czerwca 2007
23:01

  
wymarz jeszcze linijke:

iloczyn = a * b



bo w sumie nie warto definiowac nowej zmiennej 'iloczyn' dla prostego przypisania ktore mozna ominac
napisał: michal84
postów: 15


umieszczony:
2 czerwca 2007
22:56

  
witaj,dla dwoch liczb sprawa jest prosta , i tak na marginesie - raz uzyta zmienna mozna potem swobodnie wykorzystac jeszcze wielokrotnie jesli wartosc ktora ona przechowuje juz sie nie przyda


Private Sub CommandButton1_Click()
Dim a As Integer, b As Integer, x As Integer, y As Integer
Dim c As Integer, pom As Variant

MsgBox "Szukanie największego wspólnego dzielnika" & Chr(13) & _
"Szukanie najmniejszej wspólnej wielokrotności"

'najpiers sprawdza czy podana wartosc jest liczba a jesli tak to czy calkowita
pom = (InputBox("Wprowadź pierwszą liczbę"))
If IsNumeric(pom) Then
If (pom - Int(pom) = 0) Then a = pom Else GoTo blad
Else
GoTo blad
End If

pom = (InputBox("Wprowadź drugą liczbę"))
If IsNumeric(pom) Then
If (pom - Int(pom) = 0) Then b = pom Else GoTo blad
Else
GoTo blad
End If

iloczyn = a * b

If a > b Then
c = a
a = b
b = c
End If

x = a
y = b

Do While a <> 0
c = b Mod a
b = a
a = c
Loop
MsgBox " Odp: " & "NWD liczb " & x & " i " & y & " jest " & b
MsgBox " Odp: " & "NWW liczb " & x & " i " & y & " jest " & ( x*y)/ b
Exit Sub

blad:
MsgBox "wprowadzane wartości muszą być liczbami naturalnymi", vbCritical

End Sub

napisał: jvek
postów: 3


umieszczony:
2 czerwca 2007
20:26

edytowany:
2 czerwca 2007
20:35

  
witaj, ja od wczoraj troche to probowalem robic i troche znalazlem na necie do tej pory mam taki kod jak ponizej. Mysle ze to nawet bylby dobry, w sumie Twoj tez jest swietny ( o wiele bardziej rozbudowany), ale czy moglbys rzucic okiem na ten mój i zrobic poprawki - chodzi mi zeby wyswietlał komunikat gdy wpisze złe wartości (lub zamiast cyfry wpisze litere alfabetu lub jakis inny znak nie bedący liczbą). Byłbym wdzięczny za dalszą pomoc.

oto ten kod
Private Sub CommandButton1_Click()
Dim a, b, x, y, c, r As Integer
MsgBox "Szukanie największego wspólnego dzielnika" & Chr(13) & "Szukanie najmniejszej wspólnej wielokrotności"
a = CSng(InputBox("Wprowadź pierwszą liczbę"))
b = CSng(InputBox("Wprowadź drugą liczbę"))
iloczyn = a * b ' <---- nowa linia
If a > b Then
c = a
a = b
b = c
End If
x = a
y = b
Do While a <> 0
r = b Mod a
b = a
a = r
Loop
MsgBox " Odp: " & "NWD liczb " & x & " i " & y & " jest " & b
MsgBox " Odp: " & "NWW liczb " & x & " i " & y & " jest " & iloczyn / b ' <---- nowa linia
End Sub

napisał: michal84
postów: 15


umieszczony:
2 czerwca 2007
11:48

  
witaj

w przypadku szukania nww i nwd dla dwoch liczb skorzystac mozna z wydajnych algorytmow starozytnuch grekow np

Function nww1(a As Integer, b As Integer) As Long
Dim pom As Long
Dim iloczyn As Long

iloczyn = a * b

Do While (b)
pom = a Mod b
a = b
b = pom
Loop

nww1 = (iloczyn / a)

End Function




Function nwd1(a As Integer, b As Integer) As Long
Dim iloczyn As Long
iloczyn = a * b
nwd1 = iloczyn / nww1(a, b)
End Function




jesli natomiast badamy wieksza ilosc argumentow to trzeba troszke pokombinowac, zapewne sa na to wydajne algorytmy w necie ale moze taka propozycja Ci wystarczy:

Sub nwd()
Dim ile As Integer, a() As Long, i As Long, j As Long, wynik As Long
Dim czy As Boolean, liczby As String, pom As Variant

'On Error GoTo blad

pom = ((InputBox("podaj ilość liczb, dla których będziesz" & Chr(13) _
& "szukać największego wsólnego dzielnika", , 2)))

'toleruje tylko liczby naturalne
If IsNumeric(pom) And (pom - Int(pom) = 0) Then ile = pom Else GoTo blad

ReDim a(ile - 1)

liczby = ""
For i = 0 To ile - 1
pom = (InputBox("wprowadź " & i + 1 & " liczbę"))
If IsNumeric(pom) And (pom - Int(pom) = 0) Then a(i) = pom Else GoTo blad
liczby = liczby & CStr(a(i)) & ","
Next i

'liczby - sluzy do wyswietenia wartosci w okienku msgbox;pozbywamy sie ostaniego przecinka
liczby = Left(liczby, Len(liczby) - 1)



'domnienanym rozwiazaniem jest 1 ale jak znajdzie wieksza liczbe to podstawia ja za winik
wynik = 1

'zaczyna sprawdzanie od najmniejszej z podanych wartosci , powyzej nie ma co sprawdzac
For i = Application.WorksheetFunction.Min(a) To 2 Step -1
    czy = True
    For j = 0 To ile - 1
        If a(j) Mod i > 0 Then
        czy = False
        Exit For
        End If
    Next j

'jesli wartosc czy nie znienila sie z true na false to znaczy ze dana liczba jest
'dzielnikiem bez reszty wszystkich wprowadzonych wartosci
'mozemy teraz wyjsc z glownej petli bo i tak wiekszego dzielnika nie znajdziemy
If czy = True Then
wynik = i
Exit For
End If

Next i

MsgBox "największy wspólny dzielnik liczb:" & Chr(13) & liczby & " to: " & CStr(wynik)
Exit Sub

blad:
MsgBox "wprowadzane wartości muszą być liczbami naturalnymi", vbCritical

End Sub





Sub nww()
Dim ile As Integer, a() As Long, i As Long, j As Long, wynik As Long
Dim czy As Boolean, liczby As String, max As Long, pom As Variant

On Error GoTo blad

pom = (InputBox("podaj ilość liczb, dla których będziesz" & Chr(13) _
& "szukać najmniejszej wsólnej wielokrotności", , 2))

If IsNumeric(pom) And (pom - Int(pom) = 0) Then ile = pom Else GoTo blad

ReDim a(ile - 1)

liczby = ""
For i = 0 To ile - 1
pom = (InputBox("wprowadź " & i + 1 & " liczbę"))
If IsNumeric(pom) And (pom - Int(pom) = 0) Then a(i) = pom Else GoTo blad
liczby = liczby & CStr(a(i)) & ","
Next i
liczby = Left(liczby, Len(liczby) - 1)


'sprawdzanie zaczyna od najwiekszej z prowadzonych wartosci i bada wszyskie jej wielokrotnosci
max = Application.WorksheetFunction.max(a)
i = 1
Do
    czy = True
    For j = 0 To ile - 1
    If max * i Mod a(j) > 0 Then
    czy = False
    Exit For
    End If
    Next j
    
If czy = True Then
wynik = max * i
Exit Do
End If

i = i + 1
Loop

MsgBox "najmniejszy wspólny dzielnik liczb:" & Chr(13) & liczby & " to: " & CStr(wynik)
Exit Sub

blad:
MsgBox "wprowadzane wartości muszą być liczbami naturalnymi", vbCritical

End Sub

napisał: jvek
postów: 3


umieszczony:
1 czerwca 2007
18:11

  
witam mam zrobic projekt w visual basic w excelu liczący najmniejsza wspolna wielokrotnosc i najwiekszy wspólny dzielnik Do tego jezeli wpisze złe wartości ma wyskoczyc komunikat ze to sa zle wartosci i nalezy wpisac poprawne.
Czy ktoś może mi pomoc? z góry dzieki


<-wstecz  1  dalej->
wszystkich stron: 1


Sortuj posty: z