Wątek przeniesiony 2021-01-28 13:24 z Inne języki programowania przez cerrato.

[Excel VBA] Niedziałający iterator w pętli

0

Pracuję nad funkcją, która ma rozwiązać problem kilku wierszy w jednej komórce. Funkcja ma za zadanie podzielić każdy z tych wierszy i przekształcić go na kod w innym języku (Syntax SPSS). Każda komórka w odniesieniu do której ta funkcja ma pracować ma różną liczbę wierszy w środku, dlatego funkcja obejmuje również mechanizm zliczania znaku końca wiersza. Ten mechanizm jest zainspirowany znalezioną w necie funkcją i działa bez zarzutu.
Kluczowy element funkcji nad która pracuję obejmuje pętlę for, która z każdego wiersza wewnątrz komórki przekształca tekst i dopisuje go do zmiennej zwracanej ostatecznie jako wynik funkcji. Niestety z nieznanych mi powodów funkcja przestaje działać gdy wstawiam iterator jako argument do tablicy będący w tym przypadku numerem wiersza wewnątrz komórki. Jeżeli wstawiam tam na sztywno np. 0 to otrzymuje odpowiednią liczbę razy tę samą wartość (tyle razy ile wierszy), natomiast jeżeli wstawiam tam iterator to funkcja przestaje działać. Chodzi o linijkę kodu 'wers = wersy(y)' Będę wdzięczny za wszelkie sugestie. Próbowałem już z innymi pętlami ale nic to nie dało. Poniżej wklejam kod.

Function wart(tekst As String) As String

'liczę ile razy występuje znak końca wiersza
' i dodaję 1 żeby mieć liczbę wierszy

        Dim pk_ZliczZnak As Integer
        Dim Szukany_znak As String
        Szukany_znak = Chr(10)
        Dim a, l, i As Integer
        a = 0
        i = 1
        l = Len(tekst)
        For i = 1 To l
        If Mid(tekst, i, 1) = Szukany_znak Then
        a = a + 1
        End If
        Next i
        pk_ZliczZnak = a + 1

'dzielę komórkę przez separator znaku końca wiersza

wersy = Split(tekst, Chr(10))

Dim lr As String
lr = ""

' pętla ma dla każdego wiersza przekształcić tekst w taki sposób aby liczba znajdująca się przed dwukropkiem 
' została oddzielona od jej opisu, który ma się znaleźć w cudzysłowie.
' Tak przekształcony tekst ma być dopisany do zmiennej lr która potem jest zwracana w całości jako wynik funkcji

Dim y As Integer

For y = 0 To pk_ZliczZnak
wers = wersy(y)
wersr = Split(wers, ":")

kod = wersr(0)
etyk = Trim(wersr(1))

ly = kod & " " & Chr(34) & etyk & Chr(34)
lr = lr & ly

Next y


wart = lr

End Function

0

Witam wszystkich.
Nie podałeś jaki błąd się wyświetla, ale wydaje się, że linia:
pk_ZliczZnak = a + 1
powinna wyglądać tak:
pk_ZliczZnak = a

Pozdrawiam
Krzysztof

0

Dziękuję za pochylenie się nad moim kodem. Pierwszy mechanizm który liczy wiersze w komórce działa bez zarzutu (w którym tez jest pętla for). Do pk_ZliczZnak trzeba dodać jeden, ponieważ mechanizm liczy znaki końca wiersza, a w ostatnim wierszu takiego znaku nie ma. Iterator który nie działa osadzony jest w drugiej pętli (wiersz 34 - y). Kiedy wpisuję tam 0 zamiast y to funkcja działa tak jak trzeba tylko powtarza ten sam wiersz a nie każdy z nich osobno. Błąd jaki jest zwracany to tylko #ARG w komórce. Nie ma żadnego osobnego komunikatu

1

Sorry, ale Twój kod jest lekko do d**y.
Sprawdź ten kod:

Option Explicit

Function wart$(tekst$)
Dim wersy() As String
Dim wers As Variant, wynik$, position&

wersy = Split(tekst, Chr(10))

For Each wers In wersy
    position = InStr(wers, ":")
    If position > 0 Then
        wynik = wynik & Mid(wers, 1, position - 1) & " " & """" & Mid(wers, position + 1) & """" & vbNewLine
    End If
Next

wart = wynik

End Function

Sub test()
Debug.Print wart("zrób:to" & Chr(10) & "albo:coś innego" & Chr(10) & "ale pamiętaj o wolnej linii" & Chr(10) & "na:końcu")
End Sub
0

Trudno mi się z tym nie zgodzić, tym bardziej że to moje pierwsze makro :). Bardzo dziękuję za pomoc, problem udało się rozwiązać. Przeanalizowałem dość szczegółowo Twój kod i sporo się nauczyłem przy tej okazji. Raz jeszcze bardzo dziękuję, zaoszczędzę dzięki temu sporo czasu.

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