Just nu i M3-nätverket
Gå till innehåll

Stoppa Loop via Userform


Tommy H

Rekommendera Poster

Hej!

Ja, nu har jag kört fast igen...

Jag har en kod (tack Monshi) som loopar sig igenom ett Excelark enligt nedan, får jag en träff i loopen, så öppnar jag Userform9.

I Userform9 har jag en textruta där jag kan skicka text till Excelarket, men jag skulle även vilja ha en "Avbryt" knapp i Userform9.

Denna "Avbrytknappen" ska då gå in och "döda" makrot där vi råkar bifinna oss just då.

Jag lyckas inte få till det.

Koden stoppar ju upp vid Userform9.Show så det borde väl gå att skicka ett anrop in i loopen därifrån?

 

/

Public Sub Symbolkoll()

    Dim rnSource As Range
    Set rnSource = Worksheets("Prenad").Range("L:L").SpecialCells(xlCellTypeConstants)
    Dim myAr As Range
    Dim myCell As Range
    Dim doRun As Boolean
    Dim c As Range
    For Each myAr In rnSource.Areas
        For Each myCell In myAr

            Set c = Worksheets("Symboler").Range("A3:A200").Find(myCell)
            If c Is Nothing Then
                Set c = Worksheets("Symboler").Range("D3:D200").Find(myCell)
            End If
                If c Is Nothing Then
                    myCell.Interior.ColorIndex = 3
                    Application.Goto reference:=myCell, Scroll:=True
               
                        UserForm9.Show

                        myCell.Value = mystring 'värde från textboxen
                        myCell.Interior.ColorIndex = xlNone 'avmarkerar cellen

                End If
        Next myCell
    Next myAr

End Sub

/

???

/TH

Länk till kommentar
Dela på andra webbplatser

Stoppa kod/köra kod parallellt är inte VBAs starka sida...

 

Dvs VBA är inte speciellt trådat även om vissa operationer tycks gå att köra parallellt, vissa event.

Helt enkelt att exempelvis en QueryTable kan genererar ett event medans kod väntar på att föregående event ska köras klart. Brukar ge icke förutsägbara resultat det.

 

Fast vad du vill är kanske att lämna ett argument från ditt UserForm till koden, när du kört klart ditt UserForm ska koden försöka igen med det nya värdet?

 

Tre alternativ

1: Du läser av en property i ditt Userform när det stängs

2: Ditt userform sparar ett värde i en variabel som din kod läser av.

3: Ditt UserForm är det som kör koden. Koden returnerar resultat och vid visst svar försöker du köra den igen med nytt argument.

 

Allt beror på vad du vill uppnå, hur du vill att koden ska fungera.

Länk till kommentar
Dela på andra webbplatser

Stoppa kod/köra kod parallellt är inte VBAs starka sida...

 

Dvs VBA är inte speciellt trådat även om vissa operationer tycks gå att köra parallellt, vissa event.

Helt enkelt att exempelvis en QueryTable kan genererar ett event medans kod väntar på att föregående event ska köras klart. Brukar ge icke förutsägbara resultat det.

 

Fast vad du vill är kanske att lämna ett argument från ditt UserForm till koden, när du kört klart ditt UserForm ska koden försöka igen med det nya värdet?

 

Tre alternativ

1: Du läser av en property i ditt Userform när det stängs

2: Ditt userform sparar ett värde i en variabel som din kod läser av.

3: Ditt UserForm är det som kör koden. Koden returnerar resultat och vid visst svar försöker du köra den igen med nytt argument.

 

Allt beror på vad du vill uppnå, hur du vill att koden ska fungera.

 

Jag försökte att skicka via "property" utan att lyckas.

 

/Public Property Get MittVal1() As Boolean

  MittVal1 = CommandButton4

'End Property

/

I koden puttade jag sedan in "If MittVal1= true then exit sub" efter Userform9.show raden.

Detta köptes dock inte....

Länk till kommentar
Dela på andra webbplatser

Ne, så skriver man inte :-)

CommandButton1 är ju inte ett värde, den är ett objekt. Om det är en flervalsknapp, en du kan trycka ned,  kan du iofs läsa av värdet på den via några argument till på knappen.

 

Sedan får du även hantera om användaren inte gör ett val, om användaren trycker på krysset och stänger formuläret kontra trycker på Ok-knapp för att stänga.

Sub Knapp1_Klicka()
    With UserForm1
        .Show
        On Error GoTo errHandle
        Dim blVal As Boolean
        blVal = .MyVal
        On Error GoTo 0
        MsgBox blVal
        
    End With
Exit Sub
errHandle:
    blVal = False
    Resume Next
End Sub
Option Explicit

Dim myValue As Boolean

Public Property Get MyVal() As Boolean
    MyVal = myValue
End Property


Private Sub CommandButton1_Click()
    myValue = True
    Me.Hide
End Sub

Private Sub CommandButton2_Click()
    myValue = False
    Me.Hide
End Sub

Felhanterar för att hantera om formuläret termineras, dvs stängs via kryssklick istället för knapp.

 

 

Länk till kommentar
Dela på andra webbplatser

Hmmm...

Ja, så lite man kan och så mycket "andra" kan :)

Allt verkar så enkelt när du gör det....

 

Bara för att jag är med på funktionen, så ska jag ha med något motsvarande

"If MyValue= true then exit sub" i mitt "Public Sub Symbolkoll()" makro....

 

 

/TH

Länk till kommentar
Dela på andra webbplatser

Det var tänkt som ett påstående som du skulle bekräfta....

Det är ju mitt förslag och jag har ju väldigt ofta fel vilket ger mig mycket gråa hår....

Med andra ord...Är det rätt kod i "huvudmakrot" eller inte?

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...