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

Göra en beräkning i VBA utan att mellanlagra resultat i en cell

Rekommendera Poster

mon935

Hejsan!

Jag har en fil med en massa "grundrader" som underlag för en massa beräkningar. Varje sådan grundrad genererar tolv nya beräknade rader. Varje grundrad har ett radnummer som kopieras till de nya raderna. För att öka läsbarheten har jag färglagt alla rader med ett jämt radnummer.

 

Nu till mitt problem. Jag har inte kommit på hur man gör för att slippa "mellanlagra" resultatet av if-satsen i en separat cell (0,34). En 2 eller 1 beroende på om resultatet är sant eller falskt. Hur gör man för att komma förbi detta? 

Så här ser min kod ut idag:

 
Sub BytBakgrundsfärg()
               
        ActiveCell.Offset(0, -32).Select
        ActiveCell.Offset(0, 34).FormulaR1C1 = "=IF(ISEVEN(RC[-33])=TRUE,2,1)"
          
        If ActiveCell.Offset(0, 34).Value = 2 Then
        GoTo Markera
        Else: Exit Sub
        End If
        
Markera:
        ActiveCell.Rows("1:12").EntireRow.Interior.Color = rgbBeige
End Sub

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
MH_

Ughhh, vilka krånglig hopp du gör

 

En variant är att använda excelfunktionen direkt i VBA med hjälp av WorksheetFunction. Det enda är att du måste fixa till dina cellreferenser på något sätt.

 

 

Sub BytBakgrundsfärg()
ActiveCell.Offset(0, -32).Select

If Application.WorksheetFunction.IsEven(Cells(ActiveCell.Row, ActiveCell.Column + 34 - 33)) Then
       Rows("1:12").Interior.Color = RGB(255, 0, 0)
End If
End Sub

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Monshi

Usch och fy på er båda!

 

Bort med alla Select och Activecell anrop!

och ta en titt på villkorsstyrd formatering om inte denna funktion räddar dig helt från hiskelig VBA-kod.

 

Förlåt mina hårda ord men det blöder i mina ögon...

Activecell måhända användas för att hitta en referens i början av en loop med därefter ska alla referenser hållas relativa inom koden utan Select-satser.

Sub BytBakgrundsfärg()
Dim myRn as Range
Set myRn = Activecell.Offset(0, -32)
If Application.WorksheetFunction.IsEven(Cells(myRnl.Row, myRn.Column + 34 - 33)) Then
       Rows("1:12").Interior.Color = RGB(255, 0, 0)
End If
End Sub

Lite städat... men inte riktigt bra det ovan heller.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
mon935

Usch och fy på er båda!

 

Bort med alla Select och Activecell anrop!

och ta en titt på villkorsstyrd formatering om inte denna funktion räddar dig helt från hiskelig VBA-kod.

 

Förlåt mina hårda ord men det blöder i mina ögon...

Activecell måhända användas för att hitta en referens i början av en loop med därefter ska alla referenser hållas relativa inom koden utan Select-satser.

Sub BytBakgrundsfärg()
Dim myRn as Range
Set myRn = Activecell.Offset(0, -32)
If Application.WorksheetFunction.IsEven(Cells(myRnl.Row, myRn.Column + 34 - 33)) Then
       Rows("1:12").Interior.Color = RGB(255, 0, 0)
End If
End Sub

Lite städat... men inte riktigt bra det ovan heller.

Tack för ditt svar.

Jag är nybörjare i VBA och hade inte koll på WorksheetFunktion. (Ska läsa på mer om den funktionen). Har liksom tänkt att det måste finnas en annan väg att gå än just activecell och select. Det var därför jag lade ut denna fråga. Det är liksom lite svårt, att hitta möjliga kommandon och rätt syntax, när man är nybörjare.

Gillar lösningen med myRn, den ska jag lägga på minnet. Mycket användbart.

 

Din kod ovan funkar bra förutom att Then-satsens  "Rows(1":12")" inte är en relativ referens. Det var rad 1-12 som ändrade färg. Min intention är att färglägga den raden jag står på samt kommande 11 rader (dvs 12 rader tot). Hur skriver man den relativa referensen? (det var det här med syntaxen igen.)

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
MH_

Fasen vad känslig Monshi är :)

 

Det enklaste är nog att använda Resize(rader, kolumner). Typ:

 

myRn.EntireRow.Resize(12).Interior.Color = RGB(255, 0, 0)

eller, om du tycker att det är mer pedagogiskt att utöka först

myRn.Resize(12).EntireRow.Interior.Color = RGB(255, 0, 0)

 

/M

 

 

Om du har väldigt tråkigt kan du försöka lista ut hur det här kommer att se ut utan att tjuvkika :huh: :

Sub Ruotsi()
Dim myRn As Range
Set myRn = Range("a1")
myRn.Resize(10, 6).Interior.Color = RGB(0, 75, 135)
myRn.Offset(4, 0).Resize(1, 6).Interior.Color = RGB(255, 205, 0)
myRn.Offset(0, 2).Resize(10, 1).Interior.Color = RGB(255, 205, 0)
End Sub

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Monshi

Ska erkänna att koden bara är en omskrivning av MHs... ingen fel/funktionskoll.

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...