[Excel 2007] VBA - opmaak vorige rij meenemen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb een VBA-code gevonden waarmee automatisch nieuwe regels worden aangemaakt wanneer er iets in een cel getypt wordt en er daarna op enter gedrukt wordt.
Echter wil ik nog wat dingen toevoegen waar ik niet uitkom:
1. Ik wil de opmaak van de vorige rij overnemen. Dus wanneer er een bepaalde rij omlijnt is en ik typ daar iets in en druk op enter dan moet deze nieuw aangemaakte rij exact dezelfde opmaak hebben. Is dit mogelijk?
2. Bovendien heb ik rijen waarbij bijvoorbeeld een aantal cellen zijn samengevoegd. Als ik daar iets in typ moet de volgende, automatisch gegenereerde rij, ook deze samengevoegde cellen op dezelfde plek hebben.

Huidige VBA-code:

Ik hoop dat iemand mij kan helpen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 ' Dim b As Byte
 'Dim c As Integer
' [A1].Select
' b = 2
 'c = 0
 '  While ActiveCell.Value <> ""
      'c = c + 2
      'ActiveCell.Insert Shift:=xlDown
      'ActiveCell.Offset(a, 0).Select
  ' Wend

End Sub


Option Explicit


Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 2 Then Exit Sub
    If Target.Value <> "" Then
        Rows(Target.Row + 1).EntireRow.Insert
    End If
End Sub


Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Het kan veel makkelijker door een kopie te maken en dan de content van die regel te legen
Visual Basic:
1
2
3
Rows(i + 1).Insert
Rows(i).Copy Destination:=Rows(i + 1)
Rows(i + 1).ClearContents

Nadeel: je clipboard (copy/cut) is achteraf leeg. Misschien kan je met bijv. http://www.cpearson.com/excel/Clipboard.aspx je clipboard 'opslaan' als dat nodig is.

Alternatief is een stuk complexer maar voornamelijk 'dom typwerk': loopje dat alle cellen langs gaat en de opmaak overneemt en inderdaad goed nadenken over samengevoegde cellen: zeker als dat over rijen heen gaat!.

offtopic:
Inkoppertje: VBA vind je niet, die maak je. En als je het wel vindt, wees dan eerst heel zeker van wat het precies doet :Y)

[ Voor 10% gewijzigd door F_J_K op 02-06-2010 10:14 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Acties:
  • 0 Henk 'm!

Verwijderd

pas de code van een opgenomen actie plakken speciaal>opmaak verder aan. dit neemt zowel opmaak & samengevoegde cellen in aanmerking.
het heeft wel hetzelfde clipboardnadeel als reeds gemeld door F_J_K

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De opmaak wordt meegenomen van de vorige rij tnx :D . Was gisteren zo lang bezig met zoeken blijkt het toch wel redelijk simpel :P.
Misschien dat jullie mij nog een tip willen geven.
Ik wil dat deze VBA-code pas werkt vanaf rij 21 is dit mogelijk?

Alvast bedankt :)

Acties:
  • 0 Henk 'm!

  • MrAngry
  • Registratie: December 2001
  • Laatst online: 20:54
Op zich staat het antwoord al in de code die je hebt, kijk even goed en probeer te begrijpen wat er staat, daar leer je meer van dan dat wij het voorkauwen.

Er is maar één goed systeem en dat is een geluidsysteem - Sef


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nu de volgende code:

code:
1
2
3
4
5
6
7
8
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 2 And Target.Row < 21 Then Exit Sub
    If Target.Value <> "" Then
        Rows(Target.Row + 1).Insert
        Rows(Target.Row).Copy Destination:=Rows(Target.Row + 1)
        Rows(Target.Row + 1).ClearContents
       End If
End Sub


Vanaf regel 21 voert hij nu pas regels in en dit is zoals ik het wil :) .
Echter na het invoeren krijg ik een nieuwe regel maar ook een foutmelding: run-time error 13 'type mismatch'.
Kom er helaas niet uit, iemand die kan helpen?

Acties:
  • 0 Henk 'm!

  • onkl
  • Registratie: Oktober 2002
  • Laatst online: 23:29
Als tip: Als het goed is wordt er een regel in je code geel gemaakt als je bij de foutmelding debugging/foutopsporing kiest. Daar zit de fout.
Wat er fout gaat is het volgende:
Als je een rij toevoegd is dat an sich ook een verandering op je worksheet. Dus wordt worksheet_change opgeroepen. Een soort oneindige loop eigenlijk. De foutmelding kwam omdat "Target" de hele rij is. En een groep cellen heeft geen ".Value" (regel3). Eigenlijk een puur gelukje, anders was Excel simpelweg rijen blijven toevoegen.

Dat kan je oplossen door ervoor te zorgen dat de macro 'weet' dat de change komt door de macro zelf en dan niet nog een rij invoegt.
Op de eerste regel declareer ik een variabele. Handig, want zo kan ik Excel iets laten onthouden tussen twee macro-uitvoeringen door. (Zie voorbeeld)
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim zeur_niet_ben_bezig As Boolean
Dim dit_is_een_voorbeeld As Integer

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (zeur_niet_ben_bezig) Then
        If Target.Column <> 2 And Target.Row < 21 Then Exit Sub
        If Target.Value <> "" Then
            zeur_niet_ben_bezig = True
            Rows(Target.Row + 1).Insert
            Rows(Target.Row).Copy Destination:=Rows(Target.Row + 1)
            Rows(Target.Row + 1).ClearContents
            zeur_niet_ben_bezig = False
            'haal dat stukje hieronder vooral weg als het idee helder is.
            dit_is_een_voorbeeld = dit_is_een_voorbeeld + 1
            MsgBox dit_is_een_voorbeeld, vbOKOnly, "Hoeveel rijen heb ik al ingevoegd?"
        End If
    End If
End Sub

Acties:
  • 0 Henk 'm!

  • MrAngry
  • Registratie: December 2001
  • Laatst online: 20:54
Ik weet niet zeker of je analyse juist is, bij mij werkt ie prima als je And vervangt door Or (is dat niet sowieso de bedoeling trouwens?) Ik heb geen idee waarom eigenlijk, maar kwam er toevallig achter bij het debuggen.
code:
1
2
3
4
5
6
7
8
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column <> 2 Or Target.Row < 21 Then Exit Sub
    If Target.Value <> "" Then
        Rows(Target.Row + 1).Insert
        Rows(Target.Row).Copy Destination:=Rows(Target.Row + 1)
        Rows(Target.Row + 1).ClearContents
       End If
End Sub


edit: je analyse is juist dat komt door de loop die ontstaat, die Or ondervangt dat omdat van de volgende target de column niet 2 is. Je zou het ook kunnen ondervangen met een count van de cells in de target variabele, maar jouw manier is waarschijnlijk netter.

[ Voor 19% gewijzigd door MrAngry op 03-06-2010 14:12 ]

Er is maar één goed systeem en dat is een geluidsysteem - Sef

Pagina: 1