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

Stoppa en loop vid ett visst cellnamn


VillVeta

Rekommendera Poster

Jag har ett makro som ska arbeta sig genom ett antal celler. Makrot börjar i en namngiven cell, StartCell och ska sluta i en annan namngiven cell SlutCell. Jag tänkte mig en while-loop som avslutas när vi kommer till SlutCell. Jag vet hur man kan stoppa en loop vid ett visst värde t.ex. cellen har värdet 0 eller är tom, men hur stoppar jag loopen vid ett givet cellnamn (inte t.ex. K27 utan SlutCell)?

Jag har försökt med address men inte fått det att fungera.

 

/VillVeta

 

Länk till kommentar
Dela på andra webbplatser

varför inte for-sats? tar reda på radnummer för start- och slutcell och därmed antalet rader däremellan?

 

Eller allockera utrymmet mellan cellerna och stega med for each:

    Dim myRn As Range
   Dim myCell As Range
   Set myRn = Range("startcell", "slutcell")

   For Each myCell In myRn

   Next myCell

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

Tack Monshi!

Jag har aldrig tidigare använt each. På namnet låter det som att varje cell gås igenom. I mitt fall så ska inte alla celler behandlas, utan när Excel har behandlat en cell, så ska Excel hoppa vidare några celler. Hoppet kan vara åt höger eller neråt. Därefter ska den cellen behandlas. Osv. Det är olika många rader i området som ska gås igenom. Därför tänkte jag namnge den sista cellen och när Excel kommer dit så avslutas loopen. Men det är kanske ett mindre bra sätt.

 

/VillVeta

 

Länk till kommentar
Dela på andra webbplatser

Exakt vad är det du vill göra? For Each stegar igenom alla celler i området, mycket riktigt. Har du annan regel för hur den ska stega får du komplicera till det eller göra det enkelt och i For Each kontrollera om det är en cell du ska arbeta med eller ej. Svårare än så behöver det inte vara.

 

 

Annars om du verkligen vill kolla om du nått en viss cell finns det tekniker att nyttja

If myCell.Adress = Range("slutCell").Adress Then....

 

är ett sätt

 

ett annat

If Not Intersects(myCell, Range("slutCell")) Is Nothing Then...

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

Tack Monshi!

Som alltid har du svar och förslag på det mesta. Jag provade med:

If myCell.Adress = Range("slutCell").Adress Then

Jag har gjort:

Dim myCell As Range

Men jag får problem med myCell.

Jag försökte med:

myCell = ActiveCell.Range

Då fick jag feltexten: Argumentet är inte valfritt

Jag provade också en del andra varianter, men jag lyckas inte.

Ser du vad som är fel?

 

/VillVeta

 

Länk till kommentar
Dela på andra webbplatser

Range är ett objekt, objekt måste tilldelas med Set argumentet.

 

ett tips däremellan - satser som Activecell och Select har INGET i skriver kod att göra. Bort bort bort! Adressera ALLTID celler unikt och helt kvalificerat. Exempelvis

With Blad1
  Set myCell = .Range("A1")
End With

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

Återigen, Tack så mycket. Jag har gjort följande:

Dim myCell As Range

   With Blad1
       Set myCell = .Range("A1")
   End With

   If myCell.Adress = Range("StoppCell").Adress Then ...

 

Jag får tyvärr ett felmeddelande:

Körfel nr 438.: Objektet stöder inte egenskapen eller metoden.

 

Ser du vad som är fel, så vore jag tacksam.

 

/VillVeta

 

Länk till kommentar
Dela på andra webbplatser

därför att någon av oss inte kan stava....(och den andra ännu ej har riktigt full koll på koden (inget ont menat))

 

Dim myCell As Range

   With Blad1
       Set myCell = .Range("A1")
   End With

   If myCell.Address = Range("StoppCell").Address Then
       MsgBox "Jaaaaa"
   Else
       MsgBox "neeeej "
   End If

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Länk till kommentar
Dela på andra webbplatser

Återigen Tack till Monshi.

Jag borde ha sett att address inte stavas likadant på engelska som på svenska.

 

Du gav mig ett tips tidigare och jag tar mycket tacksamt emot tips.

Du skrev att man inte ska använda ActiveCell när man skriver kod. Varför?

 

För att hålla reda på radnumret har jag skrivit:

Rad_Nr = ActiveCell.Row

 

För att flytta mig i kalkylbladet har jag skrivit:

ActiveCell.Offset(0, 14).Range("A1").Select

 

Sen hade jag också tänkt använda något liknande för att hålla reda på addressen (eng. stavning).

 

Har du några bättre förslag, så lyssnar jag mer än gärna.

 

/VillVeta

 

Länk till kommentar
Dela på andra webbplatser

ActiveCell - du kan aldrig vara 100% säker vilken cell det är du får tag på. Visst, vid start av makron kan det ibland finnas en poäng att hämta in radnumret men bättre då att låta användaren ange cell/rad via en dialog.

 

Select - är av ondo, tar bara prestanda. Enda, och då ENDA, tillfället man ska använda Select är när man vill visa för användaren vad som sker eller flytta fokus så att användaren hamnar i rätt cell. I kod för koden. Nej, aldrig.

 

Annat NoNo med ett undantag är Goto-satser. Använd ALDRIG dessa i kod. I VBA finns undantaget felhantering som kräver Goto men annars, undvik!

 

Min rekommendation med referenser är enkel.

1: Ge celler namn och adressera dessa istället för att ge absoluta rad/kolumnnummer.

2: Arbeta relativt dessa kända celler om du behöver stega i bladet

3: Håll alltid reda på exakt i koden var du är på bladet. Stega i celler i koden, inte på bladet.

 

 

Lite demo...

 

Sub demo()
   Dim startRn As Range
   Dim slutRn As Range
   Dim i As Integer
   Dim myCell As Range
   With Blad1
       Set startRn = .Range("startcell")
       Set slutRn = .Range("slutcell")
       For i = startRn.Row To slutRn.Row
           .Cells(i, startRn.Column) = .Cells(i, startRn.Column).Row
       Next i
       For i = 1 To (slutRn.Row - startRn.Row) + 1
           startRn.Cells(i, 2) = i
       Next i
       For i = 0 To (slutRn.Row - startRn.Row)
           startRn.Offset(i, 2) = i
       Next i
   End With
   For Each myCell In Range(startRn, slutRn)
       myCell.Offset(0, 3) = myCell.Row
   Next myCell

   'och så användaren
   Set startRn = Application.InputBox("ange startcell", Type:=8)
   If startRn Is Nothing Then Exit Sub
   Set slutRn = Application.InputBox("ange slutcell", Type:=8)
   If slutRn Is Nothing Then Exit Sub
   If slutRn.Row < startRn.Row Or slutRn.Column <> startRn.Column Then
       MsgBox "Cellerna måste vara i samma kolumn och startcell ovan slutcell!", vbCritical
       Exit Sub
   End If
   Range(startRn, slutRn).Select
   If MsgBox("Du har valt dessa celler, vill du fortsätta?", vbYesNo) = vbNo Then Exit Sub
   For Each myCell In Range(startRn, slutRn)
       myCell = myCell.Row
   Next myCell
End Sub

 

 

Länk till kommentar
Dela på andra webbplatser

  • 1 month later...

Hej och tack!

Jag tycker att jag börjar få ganska bra koll på det här nu.

/VillVeta

 

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...