zadanie z vba

0

Witam, nigdy nie miałem styczności z programowaniem, a gość z informatyki zadał mi zadanie i nie jestem w stanie go wykonać, dodatkowo nie chce mi wyjaśnić niektórych kwestii bo "nie mogę za was wykonać tego zadania" mógłby mi ktoś pomóc? nie oczekuje gotowego rozwiązania ale przynajmniej jakichś podpowiedzi które mogły by mi pomóc. od razu uprzedzam, że jestem w tym zielony.

oto zadanie: w arkuszu danego skoroszytu znajdują się dwie kolumny liczb. należy znaleźć te kolumny i traktując pierwsza kolumnę jako ciąg argumentów funkcji, a drugą jako ciąg wartości funkcji, policzyć metodą trapezów całkę oznaczoną tak zdefiniowanej funkcji f(x) oraz funkcji: f^2(x), tg(x)f(x^2). odpowiedni wynik należy wstawić, w odstępie jednego wiersza, pod kolumną reprezentującą wartości danej funkcji. wśród wszystkich liczb wyróżnić liczby, których mantysy są mniejsze niż 0.5

z tego co mi wyjaśnił to trzeba tu wstawić tabelę która znajdowała by wpisane przez niego liczby, a następnie po włączeniu tego programu wszystko obliczyło. o ile wiem teoretycznie jak to zrobić tak praktycznie nic mi się nie udaje. największy problem mam właśnie ze stworzeniem tej tablicy i po mimo, że szukałem jak się to robi nic mi nie wychodzi.

0

Poniżej działający kod, przy założeniu że pierwotne ciągi liczb, w obu kolumnach są ciągłe (brak pustych komórek w kolumnach). Wszystkie obliczenia można wykonać w jednej pętli, dla przejrzystości umieściłem logikę w trzech osobnych.

W tym miejscu zaimplementuj wzór, ja umieściłem proste dodawanie:

For Each cell01 In Range(Cells(FirstCellAddress.Row, FirstCellAddress.Column), Cells(bottom01, FirstCellAddress.Column))
    cell01.Offset(RowSpan, 1).Value = cell01.Value + cell01.Offset(0, 1).Value ' tutaj zaimplementuj wzór
Next cell01
Sub abc()

Dim FirstCellAddress As Range
Dim cell01
Dim bottom01 As Single
Dim RowSpan As Single


Set FirstCellAddress = Range("a1:xfd1048576").Find(what:="*", LookIn:=xlValues) 'zakres dla Excel od 2007 w górę

bottom01 = Range(Cells(FirstCellAddress.Row, FirstCellAddress.Column), Cells(FirstCellAddress.Row, FirstCellAddress.Column)).End(xlDown).Row
RowSpan = bottom01 - FirstCellAddress.Row + 2


For Each cell01 In Range(Cells(FirstCellAddress.Row, FirstCellAddress.Column), Cells(bottom01, FirstCellAddress.Column))
    cell01.Offset(RowSpan, 1).Value = cell01.Value + cell01.Offset(0, 1).Value ' tutaj zaimplementuj wzór
Next cell01

For Each cell01 In Range(Cells(FirstCellAddress.Row, FirstCellAddress.Column), Cells(bottom01, FirstCellAddress.Column + 1))
    If Abs(cell01.Value) - Abs(Fix(cell01.Value)) < 0.5 Then
        cell01.Interior.Color = RGB(128, 128, 128)
    End If
Next cell01

For Each cell01 In Range(Cells(bottom01 + 2, FirstCellAddress.Column + 1), Cells(bottom01 + RowSpan, FirstCellAddress.Column + 1))
    If Abs(cell01.Value) - Abs(Fix(cell01.Value)) < 0.5 Then
        cell01.Interior.Color = RGB(128, 128, 128)
    End If
Next cell01

End Sub
1

Nagraj makro.
Stań w komorce A1. Wciśnij END -> i skoczysz do pierwszej niepustej kolumny. Drugą znajdziesz tak samo.
Potem popatrz, jak to makro zrobiło...

0

Marcin.Miga

Dobre i przydatne. Działa w poziomie i w pionie.
Podpowiedz jeszcze jak z pod VBA odczytać do której kolumny lub wiersza "skoczyło" zaznaczenie?

1

ActiveCell.Column i ActiveCell.Row

0

Coś nie tak jest z moim myśleniem bo nawet nie znając tych poleceń mogłem je "wykombinować". Popatrzeć co wyświetla "podpowiadacz".

0

Witam!
Z takiej racji iż widzę po treści posta i zadania, że z kolegą mamy tego samego Pana u którego zaliczamy nie tworzę nowego posta i podpinam się o pomoc, będąc w sytuacji jak autor.
Treść mojego zadania:

W arkuszu danego skoroszytu znajdują się dwa wiersze liczb. Należy znaleźć te wiersze i traktując pierwszy wiersz jako ciag argumentów a drugi jako ciag wartoci, obliczyć metodą trapezów całkę oznaczoną tak zdefiniowanej funkcji f(x) oraz funkcji |x|f(x), tg(x)f(x^0.5). Odpowiedni wynik wstawić w odstępie jednej kolumny na prawo od wiersza reprezentującego wartości danej funkcji. Wśród liczb wyróżnić liczby parzyste.

Proszę o pomoc z mniej więcej objaśnieniem co gdzie i jak tak bym mogł się czego kolwiek nauczyć :)

0

Poniżej gotowiec, zmodyfikowana wersja poprzedniego kodu, umieściłem komentarze, co robi dana część kodu. Opisu funkcji poszukaj w google i na stacku, tam są dokładnie opisane.

Sub abc1()
 
Dim FirstCellAddress As Range 'adres pierwszej komórki z wartością
Dim cell01 As Range 'komórka do operacji na pętlach
Dim right01 As Single 'numer ostatniej kolumny pierwszego zakresu
Dim RowSpan As Single ' szerokość zakresu

If Range("a1").Value = "" Then
    Set FirstCellAddress = Range("a1:xfd1048576").Find(What:="*", LookIn:=xlValues) 'zakres dla Excel od 2007 w górę, tutaj przeszukujesz zakres
Else
    Set FirstCellAddress = Range("a1") 'gdy pierwsza niepusta komórka to A1
End If

right01 = Range(Cells(FirstCellAddress.Row, FirstCellAddress.Column), Cells(FirstCellAddress.Row, FirstCellAddress.Column)).End(xlToRight).Column
RowSpan = right01 - FirstCellAddress.Column + 2 'wartośc przesunięcia kolumny, czyli gdzie wstawić wartości z wyniku
 Debug.Print FirstCellAddress.Address
For Each cell01 In Range(Cells(FirstCellAddress.Row, FirstCellAddress.Column), Cells(FirstCellAddress.Row, right01))
    cell01.Offset(1, RowSpan).Value = cell01.Value + cell01.Offset(1, 0).Value ' tutaj zaimplementuj wzór
    'Debug.Print cell01.Address
Next cell01 'tutaj iterujesz po każdej komórce w zakresie i wstawiasz wynik zgodnie z przesunięciem
 
For Each cell01 In Range(Cells(FirstCellAddress.Row, FirstCellAddress.Column), Cells(FirstCellAddress.Row + 1, right01))
    If cell01.Value - (Int(cell01.Value / 2) * 2) = 0 Then
        cell01.Interior.Color = RGB(128, 128, 128)
    End If
Next cell01 'również iterujesz po zakresie, sprawdzasz czy liczba jest parzysta
 
For Each cell01 In Range(Cells(FirstCellAddress.Row + 1, FirstCellAddress.Column + RowSpan), Cells(FirstCellAddress.Row + 1, right01 + RowSpan))
    If cell01.Value - (Int(cell01.Value / 2) * 2) = 0 Then
        cell01.Interior.Color = RGB(128, 128, 128)
    End If
    'Debug.Print cell01.Address
Next cell01 'iterujesz po zakresie z wynikiem, sprawdzasz jw.
 
End Sub
0

niestety, program został zwrócony, musimy używać tablic i funkcji. Chciałbym prosić o wytłumaczenie mi w jaki sposób zapisać mój wzór z którego liczę całkę by działał wraz z wcześniejszym definiowaniem i tablicą. Mój wzór:title
Nie potrafię określić jeszcze jakie zmienne muszę tu zdefiniować i w jaki sposób pobierać wartości z mojej tablicy t, by w pętli ten wzór zwracał mi wartość dla określonych punktów. Oczywiście f to nasze y a x to x ;)
Część mojego kodu:

Option Explicit
Dim i As Byte, j As Integer, k As Integer
Dim zawartosc As Variant, t(100 * 25) As Variant
Function przeszukajW() As Variant 'funkcja wyszukująca liczby wierszami
k = 0
    For i = 1 To 100
        For j = 1 To 25
            zawartosc = Cells(i, j)
            If Not IsEmpty(zawartosc) Then 'komorka nie jest pusta
                If IsNumeric(zawartosc) Then 'komórka zawiera liczbę
                        k = k + 1
                        t(k) = zawartosc 'przypisuje wartości do tablicy t
                        'MsgBox t(k) 'uzywany w celu sprawdzenia czy dobrze działa tablica
                    End If
                End If
        Next j
    Next i
End Function
Function calka()
 
End Function

Zgóry dziękuję za pomoc!

1 użytkowników online, w tym zalogowanych: 0, gości: 1