Problem med VBA i Excel

Anonym
2024-09-12T09:34:14+00:00

Jag försöker få dessa 2 att funka ihop.

Vad som är tanken med denna kod är:

Om jag klickar i checkboxen i D1 så ska den lägga till en rad mellan rad 2 och 3 med texten Längd:

Om jag klickar i checkboxen i F1 så ska den lägga till en rad mellan 3 och 4 med texten Bryt till nock: i cell AB4 och en rad mellan rad 5 och 6 med texten Kvm 1sida: i cell AB6. Samt så ska cell AB 3 byta text från Fot till nock: till Fot till Bryt:

Klickar jag ur D1 eller F1 så ska det återgå till hur det var.

Sub ÄndraRadinnehåll() Dim ws As WorksheetSet ws = ThisWorkbook.Sheets("DittArknamn")On Error GoTo ErrHandler' Kontrollera kryssruta D1If ws.Range("D1").Value = True Thenws.Rows("3:3").Insert Shift:=xlDownws.Cells(3, 1).Value = "Längd:"ElseIf ws.Range("D1").Value = False Then' Kontrollera om rad 3 finns innan du tar bort denIf ws.Rows.Count >= 3 Thenws.Rows("3:3").Delete Shift:=xlUpEnd IfEnd If' Kontrollera kryssruta F1If ws.Range("F1").Value = True Then' ... liknande kod för F1 ...ElseIf ws.Range("F1").Value = False Then' ... liknande kod för F1, ta bort rader ...End IfExit SubErrHandler:MsgBox "Ett fel uppstod: " & Err.Description End Sub

Kryssruta F1 ska istället ha denna kod istället för den ovanför:

' Kontrollera kryssruta F1

If ws.Range("F1").Value = True Then 

    ' Lägg till nya rader och text 

    lastRow = ws.Rows.Count 

    ws.Rows(4).Insert Shift:=xlDown 

    ws.Rows(6).Insert Shift:=xlDown 

    ws.Cells(4, "AB").Value = "Bryt till nock:" 

    ws.Cells(6, "AB").Value = "Kvm 1sida:" 

ElseIf ws.Range("F1").Value = False Then 

    ' Ta bort de extra raderna 

    If ws.Rows.Count >= 5 Then 

        ws.Rows(6).Delete Shift:=xlUp 

        ws.Rows(4).Delete Shift:=xlUp 

    End If 

    ws.Cells("AB3").Value = "" ' Tömmer cell AB3 

End If			

Klickar jag i F1 så lägger den till extra rader men den skriver inte in någon text i cell AB4 och AB6 samt att den ändrar inte texten i cell AB3 från Fot till nock: till Fot till Bryt: samt att texten Ett fel uppstod: Ogiltigt proceduranrop eller argument dyker upp.

Om jag lägger in den övre röda texten i VBA så funkar D1 hur bra som helst men om jag byter ut delen kopplad till F1 med den nya gröna texten så händer något.

Klickar jag i D1 då så fuckar den upp totalt och börjar ta bort en massa rader istället som inte går att få tillbaka.

Kan någon hjälpa? Jag blir tokig!

Microsoft 365 och Office | Excel | Övrigt | Windows

Låst fråga. Den här frågan har migrerats från Microsoft Support Community. Du kan rösta på om det är till hjälp, men du kan inte lägga till kommentarer eller svar eller följa frågan.

0 kommentarer Inga kommentarer

2 svar

Sortera efter: Mest användbara
  1. Anonym
    2024-09-12T13:22:23+00:00

    Det här svaret har översatts automatiskt. Det kan därför finnas grammatiska fel eller konstiga formuleringar.

    Bäste Anders Hallfors,

    Välkommen till Microsoft-communityn.

    Efter att ha följt din beskrivning testade jag följande kod som du kan hänvisa till:

    Sub ChangeRowcontent()
    
        Dim ws As Worksheet
    
        Set ws = ThisWorkbook.Sheets("YourSheetName")
    
        On Error GoTo ErrHandler
    
        ' Check checkbox D1
    
        If ws.Range("D1").Value = True Then
    
            ws.Rows("3:3").Insert Shift:=xlDown
    
            ws.Cells(3, 1).Value = "Length:"
    
        ElseIf ws.Range("D1").Value = False Then
    
            ' Check for line 3 before deleting it
    
            If ws.Rows.Count >= 3 Then
    
                ws.Rows("3:3").Delete Shift:=xlUp
    
            End If
    
        End If
    
        ' Check checkbox F1
    
        If ws.Range("F1").Value = True Then
    
            ' Add new lines and text
    
            ws.Rows(4).Insert Shift:=xlDown
    
            ws.Rows(6).Insert Shift:=xlDown
    
            ws.Cells(4, "AB").Value = "Break to Ridge:"
    
            ws.Cells(6, "AB").Value = "Sqm 1 side:"
    
            ws.Cells(3, "AB").Value = "Foot to Break:"
    
        ElseIf ws.Range("F1").Value = False Then
    
            ' Remove the extra lines
    
            If ws.Rows.Count >= 6 Then
    
                ws.Rows(6).Delete Shift:=xlUp
    
                ws.Rows(4).Delete Shift:=xlUp
    
            End If
    
            ws.Cells(3, "AB").Value = "Foot to ridge:"
    
        End If
    
        Exit Sub
    
    ErrHandler:
    
        MsgBox "An error occurred: " & Err.Description
    
    End Sub
    

    Logik för infogning och borttagning av fast rad: Säkerställde att rader infogas och tas bort korrekt.

    Uppdaterade cellvärden: Fixade logiken för att uppdatera värdena för cellerna AB3, AB4 och AB6.

    Säkerhetskopiering: Säkerhetskopiera alltid dina Excel-filer innan du kör skript som ändrar strukturer eller data.

    Men eftersom mitt modersmål inte är språket i ditt land kan jag ha några missförstånd om din beskrivning, om det passar dig kan du dela din fil med oss i ett privat meddelande så hjälper vi dig att göra ytterligare tester och implementering.

    Du kan dela den här:

    Tveka inte att kontakta oss när som helst om du har några frågor.

    Tack för din förståelse och ditt tålamod.

    Varma hälsningar Isabella-MSFT | Microsoft Community Support Specialist

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer
  2. Anonym
    2024-09-12T13:07:02+00:00

    Allmänt:

    ws.Rows.Count

    ger det totala antalet rader i bladet. Så:

    lastRow = ws.Rows.Count

    Borde bli en dryg miljon rader

    Test att stega med F8. eller lägg in en

    msgbox ws.Rows.Count

    så dina kontroller, exempelvis koden:

            ' Kontrollera om rad 3 finns innan du tar bort den If ws.Rows.Count >= 3 Then Kommer alltid att bli sant eftersom radräkningen alltid är en miljon-ish.

    För att återgå till ditt problem så tror jag att ett bidragande bekymmer är att koden för både D1 och F1 jämt körs

    Dvs om du kryssar i D1 men inte F1 så kommer den att peta in rad3. Sen ser den att F1 inte är ikryssat och eftersom dina rad-villkor alltid är uppfyllda så tar den bort raderna 4 och 6.

    Samma sak om D1 är tom men F1 är ifyllt osv. Du måste nog lägga in en massa kontroller för at lista ut hur bladet ser ut innan du stökar runt.

    Exempel där jag undviker nästlade villkor. Men även här kommer det att bli konstigt om du kryssar i och ur båda rutorna.

    Jag skulle nästan fundera på att lägga två separata makron som triggas av respektive kryssruta.

    Sub ÄndraRadinnehåll()
       Dim ws As Worksheet
        Set ws = ThisWorkbook.ActiveSheet
        On Error GoTo ErrHandler
    
        ' Kontrollera kryssruta D1 och om cell A3 inte är ändrad redan
        If (ws.Range("D1").Value = True And ws.Range("A3").Value <> "Längd:") Then
            ws.Rows(3).EntireRow.Insert Shift:=xlDown
            ws.Range("A3").Value = "Längd:"
        End If
    
        If (ws.Range("D1").Value = False And ws.Range("A3").Value = "Längd:") Then
                ws.Rows(3).Delete Shift:=xlUp
        End If
    
    ' Kontrollera om kryssruta F1 är true och AB3 inte är ändrat till "Fot till Bryt:" redan
    ' Det får representera hela paketet
        If (ws.Range("F1").Value = True And ws.Cells(3, "AB").Value <> "Fot till Bryt:") Then
            ' Lägg till nya rader och text
            ws.Rows(6).Insert Shift:=xlDown
            ws.Rows(4).Insert Shift:=xlDown
            ws.Range("AB6").Value = "Kvm 1sida:"
            ws.Range("AB4").Value = "Bryt till nock:"
            ws.Range("AB3").Value = "Fot till Bryt:"
        End If
    
        If ws.Range("F1").Value = False Then
            ' Ta bort de extra raderna om det finns ett värde i AB
            If ws.Cells(6, "AB").Value = "Kvm 1sida:" Then
                ws.Rows(6).Delete Shift:=xlUp
            End If
            If ws.Cells(4, "AB").Value = "Bryt till nock:" Then
                ws.Rows(4).Delete Shift:=xlUp
            End If
            If ws.Cells(3, "AB").Value = "Fot till Bryt:" Then
                ' Tömmer cell AB3
                ws.Range("AB3").Value = ""
            End If
        End If
    
    Exit Sub
    
    ErrHandler:
        MsgBox "Ett fel uppstod: " & Err.Description
    End Sub
    

    Var det här svaret till hjälp?

    0 kommentarer Inga kommentarer