PNG32 PNG32 PNG32 PNG32
PNG32
Forum Excel, VBA, VSTO, Exceltips, Excelhj�lp PNG32 drivs av Excelspecialisten    Logga in     English
PNG32
PNG32 PNG32
PNG32

Logga in

PNG32

Du är inte inloggad. Logga in eller registrera dig för att skriva inlägg eller svara på inlägg.

För frågor om forumet, kontakta oss på webmaster@excelforum.se

PNG32 PNG32
PNG32 PNG32
PNG32

Excelforum

PNG32

 
ForumForumDiskussionerDiskussionerVBAVBAResize Range som fungerar dynamiskt?Resize Range som fungerar dynamiskt?
Föregående Föregående
 
Nästa Nästa
Nytt inlägg
 2024-01-04 14:12
 

Har två cellområden def. som tabeller. I kolumnerna efter tabellerna finns färdiga formler. När jag manuellt drar ut tabellen så att ytterligare en kolumn ingår finns formlerna kvar i det utvidgade tabellområdet samtidigt som grafer över tabellerna uppdateras.

Men eftersom detta ska göras ofta vill jag göra ett mackro. Hur kan jag referera till sista kolumnen i tabellen, så att makrot fungerar även gång 2, 10 och 50?

Ett alternativ är att makrot infoga en kolumn sist i tabellen, men då finns inte formlerna. Finns det en funktion som kan dra över formlerna från fåregående kolumn kanske?

Sub test1()

'

' test1 Makro

'

    ActiveSheet.ListObjects("CVLåg").Resize Range("$A$31:I$51")

    ActiveCell.Select

    ActiveSheet.ListObjects("BiasL").Resize Range("$A$54:I$75")

    ActiveCell.Select

End Sub

Nytt inlägg
 2024-01-04 17:33
 
 Ändrad av Gondi  på 2024-01-04 17:34:00

Hej och välkommen till forumet annbr59!

Det är lite otydligt exakt vad du menar med beskrivningarna samt var tabellerna respektive formlerna återfinns.

Kan du infoga ett par skärmklipp så vi kan se strukturen på din data samt bättre förstå vad det är du vill åstadkomma. Du kan exempelvis infoga ett skärmklipp "före" och ett "efter" det du vill att makrot/koden ska göra åt dig.

Om arket innehåller känslig information kan du ändra den. Det är strukturen, formlerna och ev. befintlig kod du skrivit som är viktiga inte själva innehållet i arbetsbladet.

Får vi lite mer "kött på benen" ska vi nog kunna hjälpa till.

Nytt inlägg
 2024-01-05 07:43
 

Försöker förklara lite tydligare. 

Jag har ett ark med data med flera tabeller

Lägst ned en tabell med "rådata" för i detta fall analysen ALAT  och de kontroller som analyserats på olika analysinstrument. Dessa ska jämföras så vi ser att alla analysinstrument ligger lika i vår region. Tabellen med rådata uppdateras med ny data varje kvartal.

När data för ett nytt kvartal har lagts in i den nedre tabellen, så skriver man in på rad 5 vilket lotnummer som kontrollmaterialet har och benämningen på kvatalet för det lotnumret läggs in på rad 4. På rad 6 räknas medelvärdet för samtliga instrument under aktuellt kvartal ut.

När detta är gjort vill får jag manuellt dra ut tabellen för CV% och %Bias så att den nya kvartalet inkluderad i dessa tabeller. Det är detta som jag vill ha ett makro för.

Som du ser på bilden så ligger det redan formler i kolumnerna efter sista kolumnen för tabelll CV% och %Bias. Fördelen med det är att i rubrikraden där det står 0 ligger hänvisning till cellen för kvartalet, så att rätt kvartal automatiskt skrivs in i rubriken (hittade inget sätt att göra det i själva tabellen som automatiskt skriver in en rubrik som inte stämmer). 

Jag har spelat in ett makro när jag drar ut tabellerna, men makrot blir för ett specifikt tabellområde. Nästa gång som makrot ska köras så slutar inte tabellen på tex G51 utan F51 och inget nytt händer därför med tabellen. Så hur kan jag skriva i makrot för att det ska veta vilken den sista cellen är i tabellen?

Det är en lite uppgift som kan göras manuellt, men då det förutom denna analysen ALAT finns 90 analyser till och varje analys har 2 olika kontrollnivåer så hade det varit till hjälp med ett makro.

Formeln i tabell CV% ska hämta CV% för ett specifikt instrument&lotnummer&kvartal från tabellen med "rådata" längst ned i arket. I cell G32 står =INDEX(RådataL[[%CV]:[%CV]];PASSA(G$4&G$5&$A32;RådataL[[Kvartal]:[Kvartal]]&RådataL[[Lot number]:[Lot number]]&RådataL[[Analyser]:[Analyser]];0))

Formeln i tabell för %Bias ska räkna ut biasen mellan medelvärdet för samtliga instrument medelvärdet för kontrollkörningarna på ett specifikt instrument i G55 står =(G10-G$6)/G$6

Nytt inlägg
 2024-01-05 19:08
 
 Ändrad av Gondi  på 2024-01-05 19:17:41

Hej annbr59,

Tack för en mycket bra och detaljerad beskrivning!

Vi måste fixa så att tabellrubrikerna är länkade till cellområde B4:M4 där du skriver in kvartal. I Excel kan man tyvärr inte ange en formel som en tabellrubrik. För att kringgå detta problem kan vi använda VBA och uppdatera rubrikerna i tabellerna med det du skriver in på rad 4 på arbetsbladet. 

Vad jag har förstått så vill du dynamiskt ändra storlek på tabellerna ”CVLåg” och ”BiasL” så fort du lägger till eller tar bort något kvartal i de orangea fälten längst upp. Vidare så har jag - baserat på din skärmdump - kommit fram till att ni har 19 olika instrument. Hoppas det är rätt uppfattat.

Lösning med hjälp av VBA

Starta VBA-editorn med Alt+F11 och dubbelklicka på arbetsbladet (Blad1 i mitt fall) där du har tabellerna i projektutforskaren på vänster sida.

I procedurfönstret välj ”Worksheet”-objektet till vänster samt ”Change”-eventet från högra dropdown-listan. Då ser det ut så här. Koden som är blåmarkerad i skärmdumpen nedan kan tas bort. Den läggs automatiskt dit av VBA-editorn när man dubbelklickar på ”Worksheet”-objektet första gången.

 
När du raderat ovan kod ska det se ut så här.
 
 
Kopiera efter det nedan kod och klistra in den i VBA-editorn.
 

Private Sub Worksheet_Change(ByVal Target As Range)

 

    If Target.Cells.count > 1 Then GoTo done

 

    If Application.Intersect(Target, ActiveSheet.Range("B4:M4")) Is Nothing Then GoTo done

 

    Dim lcol As Long

    Dim lrow As Long

    Dim lastCol As String

    Dim ws As Worksheet

    Dim tblCV As ListObject

    Dim tblBias As ListObject

   

    Set ws = ActiveSheet

    Set tblCV = ws.ListObjects("CVLåg")

    Set tblBias = ws.ListObjects("BiasL")

   

    With ws

        lcol = .Cells(Target.Row, .Columns.count).End(xlToLeft).Column

        lastCol = Split(.Cells(, lcol).Address, "$")(1)

    End With

   

    With tblCV

        lrow = .DataBodyRange.Rows.Row + .DataBodyRange.Rows.count - 1

        .Resize Range(.HeaderRowRange.Cells(, 1).Address & ":" & lastCol & lrow)

        .HeaderRowRange.Cells(, Target.Column) = Target.Value

    End With

   

    With tblBias

        lrow = .DataBodyRange.Rows.Row + .DataBodyRange.Rows.count - 1

        .Resize Range(.HeaderRowRange.Cells(, 1).Address & ":" & lastCol & lrow)

        .HeaderRowRange.Cells(, Target.Column) = Target.Value

    End With

done:

    Exit Sub

End Sub 

 
När du klistrat in koden ska det se ut så här.
 
 
 
 
Nu kommer makrot ovan köras automatiskt varje gång du ändrar eller tar bort ett kvartal i någon av cellerna i området B4:M4 på arbetsbladet.