• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

fout bij sheet kopieren vba

Status
Niet open voor verdere reacties.

bowlingman

Gebruiker
Lid geworden
17 okt 2007
Berichten
433
Hallo,
Met onderstaande code kopieer ik een sheet en dit werkt perfect als ik de teams inbreng met een frm
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    [COLOR="#FF0000"]If Target = "" Or Target.Cells.Count > 1 Then[/COLOR] Exit Sub
        If Target.Column = (2) Then
            Sheets("Teamssheet").Copy , Sheets(Sheets.Count - 2)
            With ActiveSheet
                .Name = Target.Offset(, -1).Value
                .Range("O1") = Target.Offset(, -1).Value
            End With
        End If
        If Target.Column = (6) Then
            Sheets("Spelerssheet").Copy , Sheets(Sheets.Count - 2)
            With ActiveSheet
                .Name = Target.Offset(, -1).Value
                .Range("K2") = Target.Offset(, -1).Value
            End With
        End If
End Sub
maar wanneer ik dan de spelers met een frm inbreng krijg ik een foutmelding op de rode regel.
Wanneer ik de spelers handmatig inbreng in kolom F lukt het wel.

Frm zelf moet je niet naar de opmaak enzo kijken. Dit moet nog gebeuren

Grtjs.
Armand
 

Bijlagen

  • 8 Teams met Forms.xlsb
    1,3 MB · Weergaven: 43
Probeer het eens zo:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target = "" Or Target.Cells.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    Select Case Target.Column
        Case 2
            Sheets("Teamssheet").Copy , Sheets(Sheets.Count - 2)
            With ActiveSheet
                .Name = Target.Offset(, -1).Value
                .Range("O1") = Target.Offset(, -1).Value
            End With
        Case 6
            Sheets("Spelerssheet").Copy , Sheets(Sheets.Count - 2)
            With ActiveSheet
                .Name = Target.Offset(, -1).Value
                .Range("K2") = Target.Offset(, -1).Value
            End With
    End Select
    Application.EnableEvents = True
End Sub
 
Hallo Ed,

Juist geprobeert en krijg dezelfde foutmelding op dezelfde regel.

Grtjs.
Armand
 
Je zegt alleen op welke regel maar de foutmelding vertel je er niet bij en die is veel belangrijker.
 
Denk dat ik het al gezien heb. Probeer deze maar eens:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
    If Target = "" Then Exit Sub
    Application.EnableEvents = False
    Select Case Target.Column
        Case 2
            Sheets("Teamssheet").Copy , Sheets(Sheets.Count - 2)
            With ActiveSheet
                .Name = Target.Offset(, -1).Value
                .Range("O1") = Target.Offset(, -1).Value
            End With
        Case 6
            Sheets("Spelerssheet").Copy , Sheets(Sheets.Count - 2)
            With ActiveSheet
                .Name = Target.Offset(, -1).Value
                .Range("K2") = Target.Offset(, -1).Value
            End With
    End Select
    Application.EnableEvents = True
End Sub
 
Hallo Ed,
De foutmelding was "Typen komen niet met elkaar overeen"
Nu krijg ik die foutmelding wel niet meer, maar de "Spelerssheet" wordt ook niet gekopieerd.
Ook weer wel als ik de gegevens in kolom 6 handmatig invul.

Grtjs.
Armand
 
Loop er dan in debug mode door om te zien wat er gebeurt.
 
Benoem even waar wat staat. In welke sheet staat het Change event? Om welk frm (is een userform?) gaat het? Er eerst een goede vraag van maken scheelt de helpers een hoop onnodig zoekwerk. Het doel ontgaat mij trouwens volledig. Via (aanname) een Userform wil je data wegschrijven naar een werkblad die vervolgens een Change event aanroept die weer wat anders met de input gaat doen?
 
Hallo VenA

Op de "Start" pagina staat een button "Liga/Teams" inbrengen.
Deze opent het frmLigaGegevens.
Op deze frm worden de nodige gegevens voor de Liga alsook de Teams ingebracht en weggeschreven naar de sheet "LigaData".
De teams komen dan in kolom B daarvan te staan en wordt de sheet "Teamssheet" gekopieerd en benoemd.
Dit alles lukt perfect.
Met de button "Spelers Inbrengen" worden de gegevens van de spelers weggeschreven naar dezelfde sheet van kolom E tot I. (wat correct verloopt.
En moet dan ook de sheet "Spelerssheet" gekopieerd en benoemd worden.
En dit gebeurd niet.
Dit gebeurt omdat ik anders een heleboel (+/- 250 sheets) op voorhand moet maken en er van deze sheets dan heleboel niet gebruikt zullen worden.

Grtjs.
Armand
 
Wat ik al zei, loop het door in debug mode. Dam zie je precies wat er gebeurt en dus waar het mis gaat.
 
Hallo Ed,
Op de "Worksheet_Change" kan ik geen foutcontrole doen. Telkens ik op F8 klik krijg ik telkens een ping inplaats van een gele lijn.
Achter "Data2" heb ik dezelfde code geschreven als in mijn origineel prog
Ik heb nu in onderstaande file een frm bijgevoegd om de teams in te brengen op de sheet ("Data2")en wanneer dat gebeurt zal je zien dat de "Teamssheet" (groen) wordt gekopieerd en benoemd.
En met het inbrengen van de spelers, worden ook de gegevens ingebracht maar gebeurd het kopieeren van de "Spelerssheet" (rood) niet

Grtjs.
Armand
 

Bijlagen

  • Kopie van Test Wegschrijven_2 (1).xlsm
    42,5 KB · Weergaven: 45
En met het inbrengen van de spelers, worden ook de gegevens ingebracht maar gebeurd het kopieeren van de "Spelerssheet" (rood) niet

Grtjs.
Armand

Maar er staat ook helemaal geen code in de Private Sub die dat zou moeten doen
 
Waarom voor elke speler een eigen blad? Waarom voor elk team een eigen blad? De Userforms begrijp ik niet. Je hebt een tab met een ledenlijst (of de leden er blij van worden dat je dit zomaar op een openbaar forum zet, mag je aan hun vragen) dit zijn toch je stamgegevens van waaruit je verder kan werken?

Om een Event te debuggen kan je Stop of een msgbox gebruiken.
bv
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Stop
  MsgBox Target.Value
  MsgBox Target.Count
  'rest van de code
End Sub
 
@VenA
Ja van die ledenlijst had ik te laat aan gedacht om die zo veel mogelijk leeg te maken.
De reden waarom voor elke speler en elk team een sheet, is dat ze op het einde van het seizoen allemaal een overzicht krijgen van hun prestaties.
Wat de formulieren betreft. Die voor de Ligaggegevens worden de gegevens voor het nieuwe seizoen weggeschreven alsook de teams
Userform1 is om de spelende leden (op Data2) in te brengen
Userform2 is om nieuwe leden aan de ledenlijst toe te voegen. Dit wordt geopend dat wanneer je in Userform1 onder iD een getal invoert en op zoek klikt en het nummer komt niet voor in de ledenlijst kan je kiezen om verder te gaan ja of nee.

@JanBG
De code staat toch in het event "Worksheet_change" van Data2 en de code met de "Teamssheet" werkt wel volledig.
Enkel de code met de "Spelerssheet" werkt niet volledig.

Grtjs.
Armand
 
De reden waarom voor elke speler en elk team een sheet, is dat ze op het einde van het seizoen allemaal een overzicht krijgen van hun prestaties.
En dat zou niet kunnen vanuit 1 tabel?

Qua code kunnen de meeste helpers je wel verder helpen maar in mijn optiek moet je eerst eens goed bedenken wat je nu allemaal wil. In databasetermen heet dit een FD (Functional Design).

Nb. Werkt het debuggen nu wel met de suggesties in #13?
 
Hallo helpers,

Ik kan er nu nog kop of staart aan krijgen.
Ik heb dus even een nieuw filetje gemaakt met alleen het nodige in
Op Start staan 2 buttons.
Een voor de Ligaggevens en Teams en één voor de leden in te brengen
Code voor de teams achter het formulier
Code:
Private Sub cmbWegschrijven_Click()
Application.ScreenUpdating = False
    With Sheets("LigaData")
        For jTel = 1 To 8
            .Range("A" & 2 + (jTel)).Value = Me.Controls("txtiD" & jTel).Value
            .Range("B" & 2 + (jTel)).Value = Me.Controls("txtLigaTeam" & jTel).Value       
        Next
    End With
        For Each ctrl In Me.Controls
            If TypeOf ctrl Is MSForms.TextBox Then
                ctrl.Text = vbNullString
        End If
        Next
Application.ScreenUpdating = True
End Sub
Code voor het kopieeren van de teamssheets (achter de sheet "LigaData")
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Cells.Count > 1 Then Exit Sub
    If Target = "" Then Exit Sub
        If Target.Column = (2) Then
            Sheets("Teamssheet").Copy , Sheets(Sheets.Count - 2)
            With ActiveSheet
                .Name = Target.Offset(, -1).Value
                .Range("O1") = Target.Offset(, -1).Value
            End With
        End If
        If Target.Column = (5) Then
            Sheets("Spelerssheet").Copy , Sheets(Sheets.Count - 2)
            With ActiveSheet
                .Name = Target.Offset.Value
                .Range("K2") = Target.Offset.Value
            End With
        End If
End Sub
code voor de spelers (achter het formulier Spelers)
Code:
Private Sub cmbOpslaan_Click()
Dim data(4)
    data(0) = TextBox1.Value
    data(1) = TextBox2.Value
    data(2) = TextBox3.Value
    data(3) = ComboBox1.Value
    data(4) = TextBox4.Value
    Sheets("LigaData").Cells(Rows.Count, 5).End(xlUp).Offset(1).Resize(, 5) = data
End Sub
en de code voor de sheets voor de spelers staat in dezelfde worksheet_change hierboven
Alles perfect voor de teams, maar voor de spelers worden enkel de gegevens netjes op zijn plaats weggeschreven en niet de sheet "Spelerssheet" gekopieerd.

@VenA
Ja ik het debuggen lukt nu wel met Uw tip.
Maar ik vind niet precies wat of waar het fout gaat.

Grtjs.
Armand
 

Bijlagen

  • Test Wegschrijven 3.xlsm
    51,2 KB · Weergaven: 42
Wat moet er gekopieerd worden van een leeg 'Spelerssheet'?
 
Hallo Harry,

In mijn originele file staan daar allerlei formules in en ook zo in de Teamssheet.
In dit Filetje staan enkel sheets in met dezelfde namen.
Zoals je kan zien staat in die Teamssheets (A tot H) ook niets, want dit zijn copies van de eigenelijke "Teamssheet".
In dit filetje is het maar enkel om te testen, daarom zijn dat lege sheets.
Enkel wat in de code van de "Worksheet_change" staat wordt automatisch toegevoegd als de sheet wordt gekopieerd.
Als je op de sheet "LigaData" handmatig onder iD (kolom E) in de volgende lege cel een getal inbrengt en op enter drukt, kan je zien wat er gebeurt.

Grtjs.
Armand
 
Verwijder het gedeelte van target.column = 5 en bouw het in de code voor het wegschrijven van het formulier.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan