(excel) macro rij knippen naar ander werkblad

Pagina: 1
Acties:
  • 2.212 views sinds 30-01-2008
  • Reageer

  • tpijnappel
  • Registratie: Juli 2006
  • Laatst online: 07-12-2024
Hallo,

ik hoop dat jullie mij kunnen helpen. Ik ben voor mijn werk bezig om een
macro te maken waarin rijen van het ene werkblad naar het andere werkblad
geknipt worden. Dit alleen wanneer er bv in kolom T een waarde staat vermeld.
De macro is gemaakt alleen is er een apart probleem: hij knipt niet alle
rijen meer die aan de voorwaarde voldoen..... Kan iemand mij hepen?

een voorbeeld van de macro is:

Sub verplaatsen_van_Belbestand_naar_Later()

For i = 6 To 40007

'Wanneer veld Bx leeg is dan stoppen
If Sheets("Belbestand").Range("B" & i & "") = "" Then
Exit Sub
End If

'Wanneer veld Tx gevuld
If Sheets("Belbestand").Range("W" & i & "") <> "" Then
Sheets("Belbestand").Rows("" & i & ":" & i & "").Cut

'Bepalen welke regel leeg is
For j = 6 To 40007
'Wanneer Bx leeg is dan vullen
If Sheets("Later").Range("B" & j & "") = "" Then

'Rij invoegen
Sheets("Later").Rows("" & j & ":" & j & "").Insert
Shift:=xlDown

'Rij verwijderen uit het Belbestand
Sheets("Belbestand").Rows("" & i & ":" & i & "").Delete
Shift:=xlUp
GoTo volgende
End If

Next j

End If


volgende:
Next i

End Sub

alvast hartelijk bedankt

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB/AI

Front verplichte underscores

offtopic:
Welkom op GoT!

Voor de leesbaarheid van je code is het handig om even [ code ] .... [ / code ] tags om je code te zetten (zonder spaties dan) en om je code te "indenten". Leesbare code = sneller zelf snappen waar het fout gaat en = ook meer mensen die de moeite nemen je te helpen :)


Je slaat veel over doordat je rij i verwijderd en dan vervolgens verder gaat bij rij i+1, nu sla je over wat origineel i+1 was. Overigens zou ik ook niet copy en paste gebruiken maar de waarde rechtstreeks overzetten (x.value = y.value) of gebruik maken van een hulpvariabele. Het gaat nu namelijk fout als een andere applicatie iets kopieert.

edit:
Inderdaad natuurlijk de formule kopieren ipv. de waarde als dat relevant is.


Daarnaast nog twee tips: schakel tijdelijk de ScreenUpdating uit als je veel bewerkingen doet.

[ Voor 6% gewijzigd door F_J_K op 14-07-2006 18:10 ]

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


  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

De J-loop vind ik erg tijdverspillend, en zonde.

Ik weet niet de inhoud van je velden, maar ik ga een klein beetje mee met FJK, maar gebruik niet de .Value maar de .Fomula (als er een +, -, * of / in staat, is value de uitkomst daarvan, in niet gelijk aan het orgineel. De Cut / Paste is inderdaad dodelijk. Je kan gewoon zeggen dat de inhoud van het veld in het ene sheet, de waarde moet hebben van een cell in een andere sheet, en dan de inhoud van het orgineel Deleten.

Neem ook per Cell de properties mee, om er zeker te van zijn dat deze identiek zijn aan het orgineel.

In mijn macro's die ALTIJD tekst-cellen moesten worden, gaf ik dus een single quote mee in het veld waar ik wat mee deed.

Zoals hierboven ook staat vermeldt, bij een Delete, moet je niet ophogen, dus zou je na je Delete een i=i-1 moeten doen. Bij een insert maakt het niet zoveel uit, omdat je opzoek gaat naar het eerste lege veld.

Persoonlijk zou ik, omdat je Delete's en Inserts gebruikt niet met een for-next gaan werken. Je hoeft niet altijd i te ophogen, aleen als er niet een Delete plaatsvind.

Ey!! Macarena \o/


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:06

Dido

heforshe

is iets als dit niet veel simpeler?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub CommandButton1_Click()
Dim freerow As Integer
Dim currentrow As Integer
'Determine first free row on sheet2
freerow = 0
Do: freerow = freerow + 1
Loop Until Sheet2.Cells(freerow, 1).Value = ""
'Loop though rows on sheet1
currentrow = 1
Do
    If Sheet1.Cells(currentrow, 2).Value <> "" Then
        'Copy this row
        Sheet2.Rows(freerow).Value = Sheet1.Rows(currentrow).Value
        freerow = freerow + 1
        'Delete old row
        Sheet1.Rows(currentrow).Delete Shift:=xlUp
    Else
        currentrow = currentrow + 1
    End If
Loop Until Sheet1.Cells(currentrow, 1).Value = ""
End Sub

Hiermee ondervang je de row-skip die je had ingebouwd en je loopt in de toekomst niet tegen hardgecodeerde limieten aan :)

edit: dit is getest op een heel simpel testbestandje, zonder rekening te houden met jouw specifieke situatie. Ik werk liever niet met letters in VBa, row en column indexes hebben voordelen (je kunt er in beide richtingen mee rekenen, en je hoeft geen adressen samen te stellen).

[ Voor 16% gewijzigd door Dido op 14-07-2006 17:05 ]

Wat betekent mijn avatar?


  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Maak dan van die Integer's wel Double's, anders beukt ie eruit na 32xxx records ;)

Ey!! Macarena \o/


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:06

Dido

heforshe

RaZ schreef op vrijdag 14 juli 2006 @ 17:01:
Maak dan van die Integer's wel Double's, anders beukt ie eruit na 32xxx records ;)
Detail, maar klopt :)

Maar niks mis met een lekkere overflow op zijn tijd :P

[ Voor 13% gewijzigd door Dido op 14-07-2006 17:07 ]

Wat betekent mijn avatar?


  • tpijnappel
  • Registratie: Juli 2006
  • Laatst online: 07-12-2024
Bedankt, voor de reacties. Ik ga het vandaag eens proberen! Ik zal het resultaat melden!
Pagina: 1