Zatrzymująca się pętla

0

Witam wszystkich,
Zrobiłem następującą konstrukcję. Wpierw utworzyłem formularz z kontrolkami. Formularz wywołuję przy pomocy funkcji wpisanej w arkusz Excela. Do przycisku dodałem następującą procedurę:

Private Sub CommandButton1_Click()
Dim address As String
Dim city As String
Dim addressCell As String
Dim cityCell As String
Dim startDate As String
Dim endDate As String
'Dim groups As String
Dim sDate As Date
Dim eDate As Date
Dim objRec As ADODB.Recordset
Dim objConn As ADODB.Connection
Dim objCmd As ADODB.Command
Dim ConnectionString As String
Dim cmdString As String
Dim destCol As Integer

Set objRec = New ADODB.Recordset
Set objConn = New ADODB.Connection
Set objCmd = New ADODB.Command


startDate = TextBox1.Text
endDate = TextBox2.Text
destCol = Range(TextBox3.Text & 1).Column
MsgBox (destCol)
Count = CInt(TextBox4.Text)

sDate = CDate(startDate)
eDate = CDate(endDate)
ConnectionString = "Provider=SQLOLEDB;Data source=Server;Initial catalog=Database;User ID=sa;Password=Password"
objConn.Open ConnectionString
objRec.ActiveConnection = objConn

For i = 4 To Count

    addressCell = Cells(i, 4)
    cityCell = Cells(i, 5)
    address = Replace(addressCell, " ", "%")
    city = Replace(cityCell, " ", "%")
    'MsgBox (address)


    cmdString = "SET NOCOUNT ON;"
    cmdString = cmdString & "DECLARE @table AS TGroups" + Chr(13)
    cmdString = cmdString & "INSERT INTO @table (groupName) VALUES ('Grupa1')" + Chr(10) + Chr(13)
    cmdString = cmdString & "INSERT INTO @table (groupName) VALUES ('Grupa2')" + Chr(10) + Chr(13)
    cmdString = cmdString & "INSERT INTO @table (groupName) VALUES ('Grupa3')" + Chr(10) + Chr(13)
    cmdString = cmdString & "INSERT INTO @table (groupName) VALUES ('Grupa4')" + Chr(10) + Chr(13)
    cmdString = cmdString & "EXEC dbo.SprzedazPoAdresieDostawy @groups = @table, @address = '" & address & "', @city = '" & city & "', @startDate = '" & CStr(sDate) & "', @endDate = '" & CStr(eDate) & "'" + Chr(10) + Chr(13)
    cmdString = cmdString & "SET NOCOUNT OFF;"

    objRec.Open cmdString
    
    
    If objRec.EOF = True Then
        Cells(i, destCol) = 0
    Else
        Cells(i, destCol) = objRec.Fields(0).Value
    End If
    objRec.Close
Next
    
objConn.Close
End Sub

Jeśli uruchomię program bezpośrednio z konsoli VBA, wszystko jest w porządku. Wpiszę daty, docelowa kolumna i ilość wierszy i naciskam przycisk. Iteracje ładnie przechodzą. Natomiast gdy wywołam to z funkcji. Formularz się odpala, wpisuję dane wejściowe i po naciśnięciu przycisku iteracja zatrzymuje się wewnątrz warunku if. Nawet nie wykonuje tego polecenia w if.
O co może chodzić?

1

Skąd wiesz że zatrzymuje się na if?

0

Bo zrobiłem debugowanie i zobaczyłem gdzie

0

Jak funkcją wpisaną w arkusz excela "wywołujesz" formularz? funkcje co do zasady zwracają wartość a nie robią coś.
Przez "wywołanie" masz na myśli otwarcie formularza?

0
TytusRomek napisał(a):

Jak funkcją wpisaną w arkusz excela "wywołujesz" formularz? funkcje co do zasady zwracają wartość a nie robią coś.
Przez "wywołanie" masz na myśli otwarcie formularza?

A nowmalnie.

Public Function Wylicz()
UserForm1.Show
End Function

0
Buster napisał(a):
TytusRomek napisał(a):

Jak funkcją wpisaną w arkusz excela "wywołujesz" formularz? funkcje co do zasady zwracają wartość a nie robią coś.
Przez "wywołanie" masz na myśli otwarcie formularza?

A nowmalnie.

Public Function Wylicz()
UserForm1.Show
End Function

Dosyć ciekawe.
A jak się przelicza arkusz? ręcznie czy automatycznie?
jesteś w stanie zapanować nad tym kiedy furnkcja "Wylicz" się uruchamia? bo mi się wydaje, że to w tym problem.
W trybie automatyczne przeliczania to może się uruchamiać nawet non stop chyba...więc moze być tak, że do pętli to wykonanie nawet nie dociera..

0

Chodzi o to, żeby nie bawić się w przyciski. Arkusz wypełnia się danymi z bazy danych. Nie musi się przeliczać automatycznie. W dowolnej komórce, która ma nie być wypełniona, wpisuję =Wylicz() i wtedy otwiera mi się okienko z formularzem. Wypełniam parametrami i klikam przycisk pobierz dane. Ot i cała filozofia. Funkcja Wylicz() ma tylko pokazać formularz.

0
Buster napisał(a):

Chodzi o to, żeby nie bawić się w przyciski.

Jasne, do przycisku funkcji nie przypniesz.

Arkusz wypełnia się danymi z bazy danych. Nie musi się przeliczać automatycznie.

Oczywiście. nie pytam czy musi się przelicząc automatycznie tylko jak to działa u Ciebie bo to istotne.

W dowolnej komórce, która ma nie być wypełniona, wpisuję =Wylicz() i wtedy otwiera mi się okienko z formularzem. Wypełniam parametrami i klikam przycisk pobierz dane. Ot i cała filozofia. Funkcja Wylicz() ma tylko pokazać formularz

Rozumiem doskonale co chcesz osiągnać. Masz w tym arkuszu inną funkcję? ona też się wykonuje tylko raz? zrób komórkę niżej =suma i zmień parametry.
chodzi o to, żebyś zrozumiał, że w w tym samym arkuszu, w jednej komórce chcesz wywołać funkcję która wykona się tylko raz (wykonanie funkcji to nie to samo co jej wpisanie). Ćwiczenie z sumą CI pomoże.
tylko pamiętaj żeby zmienić argumenty. i obserwuj co się dzieje.
być moze to przybliży Cię do rozwiązania problemu.

0

Przerobiłem na procedurę i umieściłem przycisk w Arkuszu. Działa.

0
Buster napisał(a):

Przerobiłem na procedurę i umieściłem przycisk w Arkuszu. Działa.

Świetnie. Bardzo dobre podejście, teraz będziesz zadowolony.
PS
Jeśli przycisk w arkuszu nie zbyt Ci odpowiada bo też z tym różnie bywa np ja przerabiałem temat przycisku w który trudno trafić jak masz 2 ekrany (coś się współrzędne pikseli gubią).
Być może to wiesz, ale możesz sobie dorobić swoje menu na wstążce. I tam dodać przycisk czy jakikolwiek for ant, a obsługuje się go "on action" jak dobrze pamiętam.
Estetetyka lepsza, tylko to menu w tym jednym konkretnym pliku zapisane będzie.

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