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

Macro starten wanneer cellen worden ingevuld

Status
Niet open voor verdere reacties.

Kam313on

Gebruiker
Lid geworden
7 mei 2012
Berichten
15
Goedemiddag,

Voor deze sheet heb ik twee items waar ik niet uit kom.

Item 1
Voor bijgevoegd document ben ik op zoek naar een vba code waardoor de macro voor het aanpassen van de tabbladnamen automatisch start wanneer de cellen B1 t/m B4 ingevuld zijn (nu handmatig middels knop). Ik heb al meerdere opties geprobeerd, maar ik krijg het niet voor elkaar. Na een dag googlen en diverse tests, leek het mij tijd om jullie te raadplegen:d
Het allermooiste zou zijn dat wanneer de datum in B3 en B4 wordt ingevuld dat er tabbladen worden aangemaakt met als naam de periode vanuit cel J5, L5, N5, P5, enz. Maar ik kan mij voorstellen dat het excel document daar erg traag van gaat worden. Mocht hier iets voor zijn waardoor dit niet het geval is, dan zou dat het gewenste eindresultaat zijn.

kortom:
- macro voor wijzigen tabblad namen automatisch starten nadat cellen B3 en B4 zijn ingevuld

Nice to have (mits document niet te traag wordt):
- nadat datums zijn ingevuld in B3 en B4 dat er per periode een apart tabblad wordt toegevoegd.

Item 2
Ik heb kolom A t/m I geblokkeerd in het beeld. Wanneer het document geopend wordt zou het mooi zijn als de periode (oftewel kolommen) direct in beeld komen van de huidige periode (welke altijd wordt weergegeven in cel E2). Dus als voorbeeld, in cel E2 staat periode 7-2020 en op basis van start en einde project staat deze periode in kolom V en W, dat kolom V en W bij het openen naast kolom I komen te staan door automatisch te scrollen oid
 

Bijlagen

  • Materieelschema probeersel.xlsm
    45,9 KB · Weergaven: 87
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B3") <> "" And Range("B4") <> "" Then

'jouw code

    
End If
End Sub
 
of zo

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B3") <> "" And Range("B4") <> "" Then
    For i = 10 To Columns.Count
        On Error GoTo oops
        If Cells(5, i) <> "" Then
           blad = Cells(5, i)
            If Not Evaluate("ISREF('" & blad & "'!A1)") Then [COLOR="#008000"]'controleren of het tabblad nog niet bestaat[/COLOR]
                Sheets.Add after:=Sheets(Sheets.Count)
                ActiveSheet.Name = blad
            End If
        End If
    Next i

End If
oops:
End Sub
 
Weet je wel hoeveel....
Code:
columns.count
....is in een xlsm versie @AD1957?
 
pfffff, dat zijn er inderdaad heel veel :shocked::shocked:

zo beter?
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B3") <> "" And Range("B4") <> "" Then
   [COLOR="#FF0000"] LastCol = Cells(5, Columns.Count).End(xlToLeft).Column[/COLOR]

    For i = 10 To[COLOR="#FF0000"] LastCol[/COLOR]
        On Error GoTo oops
        If Cells(5, i) <> "" Then
           blad = Cells(5, i)
            If Not Evaluate("ISREF('" & blad & "'!A1)") Then 'controleren of het tabblad nog niet bestaat
                Sheets.Add After:=Sheets(Sheets.Count)
                ActiveSheet.Name = blad
            End If
        End If
    Next i

End If
oops:
End Sub

aanvulling: columns.count = 16384
 
Laatst bewerkt:
Stukken beter.

Kan ook zo.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("b4:b5")) Is Nothing And Target.Count = 1 Then
 If [counta(b3:b4)] = 2 Then
   sv = Range("J5", Cells(5, Columns.Count).End(xlToLeft))
     For j = 1 To UBound(sv, 2) Step 2
       If Not IsError(sv(1, j)) Then If Not Evaluate("ISREF('" & sv(1, j) & "'!A1)") Then Sheets.Add(, Sheets(Sheets.Count)).Name = sv(1, j)
     Next j
  End If
End If
End Sub

En als de formulefouten eruit gehaald zijn kan de iserror() eruit.
 
Harry,

Waarom heb je dit stukje code er tussen staan, kun je dit eens uitleggen?
Code:
If Not Intersect(Target, Range("[COLOR="#FF0000"]b4:b5[/COLOR]")) Is Nothing And Target.Count = 1 Then
 
betekent dat slechts 1 cel veranderd mag zijn (=target.count) op heel je werkblad en dat die of B4 of B5 moet zijn.
 
Stukken beter.

Kan ook zo.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("b4:b5")) Is Nothing And Target.Count = 1 Then
 If [counta(b3:b4)] = 2 Then
   sv = Range("J5", Cells(5, Columns.Count).End(xlToLeft))
     For j = 1 To UBound(sv, 2) Step 2
       If Not IsError(sv(1, j)) Then If Not Evaluate("ISREF('" & sv(1, j) & "'!A1)") Then Sheets.Add(, Sheets(Sheets.Count)).Name = sv(1, j)
     Next j
  End If
End If
End Sub

En als de formulefouten eruit gehaald zijn kan de iserror() eruit.

Harry,

Superbedankt! Bist een topper! Dit is exact wat ik bedoel. Ik heb zelf nog Sheets("Materieelplanning").Select toegevoegd, zodat het eerste tabblad weer geselecteerd wordt nadat de code klaar is.
Nog wel een vraagje, wat bedoel jij met het weglaten van de iserror() als de formulefouten eruit zijn gehaald? Heb ik fouten in mijn formules staan?

En AD1957 ook bedankt voor jouw reactie en eerste opzet.

Ik heb nog meer handigheidjes die ik in dit document wil verwerken, maar die probeer ik eerst zelf uit te vogelen alvorens ik hier er naar ga vragen.
 
Probeer dit eens voor Item 2 in #1
Code:
Private Sub Workbook_Open()
    With Sheets("Materieelplanning")
        .Activate
        For Each cell In .Range("J5:BI5")
            If Not IsError(cell) Then
                If cell = .Range("E2") Then
                Application.Goto cell.Offset(-4), True
                End If
            End If
        Next cell
     End With
End Sub
 
Probeer dit eens voor Item 2 in #1
Code:
Private Sub Workbook_Open()
    With Sheets("Materieelplanning")
        .Activate
        For Each cell In .Range("J5:BI5")
            If Not IsError(cell) Then
                If cell = .Range("E2") Then
                Application.Goto cell.Offset(-4), True
                End If
            End If
        Next cell
     End With
End Sub

Thanks! Ik probeer het straks even uit
 
Harry,

Superbedankt! Bist een topper! Dit is exact wat ik bedoel. Ik heb zelf nog Sheets("Materieelplanning").Select toegevoegd, zodat het eerste tabblad weer geselecteerd wordt nadat de code klaar is.
Nog wel een vraagje, wat bedoel jij met het weglaten van de iserror() als de formulefouten eruit zijn gehaald? Heb ik fouten in mijn formules staan?

En AD1957 ook bedankt voor jouw reactie en eerste opzet.

Ik heb nog meer handigheidjes die ik in dit document wil verwerken, maar die probeer ik eerst zelf uit te vogelen alvorens ik hier er naar ga vragen.

Helaas, na wat aanpassingen in het document krijg ik een foutmelding nadat de macro klaar is. Het werkt wel, maar met die foutmelding lijkt het voor de gebruikers natuurlijk alsof het nu niet goed werkt. Enig idee wat dit kan zijn?

Zie bijlage voor nieuwste document
 

Bijlagen

  • Materieelschema probeersel.xlsm
    38,1 KB · Weergaven: 33
Probeer dit eens voor Item 2 in #1
Code:
Private Sub Workbook_Open()
    With Sheets("Materieelplanning")
        .Activate
        For Each cell In .Range("J5:BI5")
            If Not IsError(cell) Then
                If cell = .Range("E2") Then
                Application.Goto cell.Offset(-4), True
                End If
            End If
        Next cell
     End With
End Sub

Hij werkt! Ik heb er tevens een knop van gemaakt voor als iemand in het document naar een andere periode kijkt en snel terug wil naar de huidige periode.
 
Code:
zo?
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("b3:b4")) Is Nothing And Target.Count = 1 Then

    If [counta(b3:b4)] = 2 Then
          sv = Range("J5", Cells(5, Columns.Count).End(xlToLeft))
        For j = 1 To UBound(sv, 2) Step 2
           If sv(1, j) <> "" Then
             If Not Evaluate("ISREF('" & sv(1, j) & "'!A1)") Then
               Sheets.Add(, Sheets(Sheets.Count)).Name = sv(1, j)
             End If
          End If
        Next j
    End If
End If
Application.Goto Sheets(1).Range("B4"), False

End Sub
 
Laatst bewerkt:
Code:
zo?
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("b3:b4")) Is Nothing And Target.Count = 1 Then

    If [counta(b3:b4)] = 2 Then
          sv = Range("J5", Cells(5, Columns.Count).End(xlToLeft))
        For j = 1 To UBound(sv, 2) Step 2
           If sv(1, j) <> "" Then
             If Not Evaluate("ISREF('" & sv(1, j) & "'!A1)") Then
               Sheets.Add(, Sheets(Sheets.Count)).Name = sv(1, j)
             End If
          End If
        Next j
    End If
End If
Application.Goto Sheets(1).Range("B4"), False

End Sub

Bedankt Albert! De fout opsporing komt niet meer in beeld en de tabbladen worden automatisch toegevoegd. Opgelost!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan