"lege" velden leegmaken

Status
Niet open voor verdere reacties.

AnnevdD

Verenigingslid
Lid geworden
8 mei 2007
Berichten
228
Als het resultaat van een formule "leeg" is ("") is het veld niet leeg. Je kunt in een macro alle velden langs gaan en als het veld leeg is de inhoud schoonmaken, maar dat kost bij grote bestanden veel tijd.
Ik zou dit willen doen met een replace opdracht, maar het lukt me niet om "" door "" te vervangen. Wel eerst "" door "@" en daarna "@"door "". zie bijlage.
Maar is er niet een mogelijkheid om met replace lege velden leeg te maken?
Voorbeeld code (het lukt me niet om mijn bestandje te uploaden. Waarom weet ik niet.)

Sub Testleegmaken()
Cells.Clear
Cells(2, 2) = 1: Cells(4, 2) = 2: Cells(6, 2) = 3

For Rij = 2 To 6
Cells(Rij, 3).FormulaR1C1 = "=RC[-1]&"""""
Next Rij

Range(Cells(2, 3), Cells(6, 3)).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Cells(2, 3).Select
Selection.End(xlDown).Select
'Selectie gaat naar rij 6, er zijn geen lege velden

Range(Cells(2, 3), Cells(6, 3)).Select
Selection.Replace What:="", Replacement:="@", LookAt:=xlWhole, _
SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
Selection.Replace What:="@", Replacement:="", LookAt:=xlWhole, _
SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
Cells(2, 3).Select
Selection.End(xlDown).Select
'Selectie gaat naar rij 4, want veld C3 is leeg

End Sub​
 
Als je iets wil leegmaken, dan ken je dat volgens mij de waarde NULL toe, voorbeeld cells(1,1) = NULL
 
Cells(1,1)= ""

Of

Cells(1,1).clearcontents
 
Hartelijk dank voor jullie reacties.

Maar ik denk dat ik niet duidelijk genoeg ben geweest.
Natuurlijk kan je een cel leegmaken met =Null of .clearcontents of =""
Die methoden gebruik ik (behalve = Null) allemaal regelmatig.

Maar het gaat mij erom dat ik niet cel voor cel langs wil maar dat ik in een groot gebied de cellen die door een formule met "" zijn leeg gemaakt (zie regel 6 in het voorbeeld) wil leegmaken met "replace" of een overeenkomstige functie.
Het probleem voor mij is dat replace "" door "" of replace null door "" niets doet. Maar replace "" door "@" werkt wel en replace "@" door "" maakt het veld wel echt leeg.
Zie mijn voorbeeld programmaatje.
 
Waar blijven de code tags ?
Gebruik nooit 'Select' of 'Activate' in VBA.
Ik zie geen voorbeeldbestand.
 
Ik begrijp niet goed wat je bedoelt. Zoals ik al schreef lukte het me niet om het voorbeeld bestand toe te voegen, nu wel. Ik denk dat er ergens in het systeem iets mis ging.
Ik begrijp niet goed wat je verder zegt, maar ik begrijp ook dat je geen oplossing biedt.

Mijn vraag staat dus nog open.
 

Bijlagen

  • Testleegmakenvelden.xlsm
    16 KB · Weergaven: 25
Code tags en inspringen bij code:

Code:
Sub Testleegmaken()
   Cells.Clear
   Cells(2, 2) = 1: Cells(4, 2) = 2: Cells(6, 2) = 3

   For Rij = 2 To 6
     Cells(Rij, 3).FormulaR1C1 = "=RC[-1]&"""""
   Next Rij

   Range(Cells(2, 3), Cells(6, 3)).Select
   Selection.Copy
   Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
   Application.CutCopyMode = False
   Cells(2, 3).Select
   Selection.End(xlDown).Select
  ' Selectie gaat naar rij 6, er zijn geen lege velden

   Range(Cells(2, 3), Cells(6, 3)).Select
   Selection.Replace What:="", Replacement:="@", LookAt:=xlWhole, _
             SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
             ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
   Selection.Replace What:="@", Replacement:="", LookAt:=xlWhole, _
         SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
         ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
   Cells(2, 3).Select
   Selection.End(xlDown).Select
'   Selectie gaat naar rij 4, want veld C3 is leeg
End Sub

Al 206 berichten in 16 jaar en onbekend met Code Tags en inspringen in code ?
 
Laatst bewerkt:
ik in een groot gebied de cellen die door een formule met "" zijn leeg gemaakt (zie regel 6 in het voorbeeld)
Je bestand bevat geen enkele formule.
 
Dag snb

Ik heb, denk ik, in die berichten nog niet gebruik gemaakt van code tags. Of misschien was ik dat even vergeten. Sorry dat ik me niet netjes heb gedragen.

Ik begrijp niet waarom u stelt dat er geen enkele formule in het bestand staat. Het gaat nu om de formule
Code:
 Cells(Rij, 3).FormulaR1C1 = "=RC[-1]&"""""
misschien is het niet perfect, maar ik noemde dat een formule. Die is overigens helemaal niet belangrijk, die staat er alleen maar om een voorbeeld te maken. In het echt gaat het om allerlei formules.

Ik zou het fijn vinden als er iemand probeerde antwoord te geven op mijn vraag. Die gaat over de replace opdracht.

Het probleem voor mij is dat replace "" door "" of replace null door "" niets doet.
Maar replace "" door "@" werkt wel en replace "@" door "" maakt het veld wel echt leeg.
Is er een alternatieve replace optie waardoor in één keer "" met een replace wel leeg gemaakt wordt?

Daarmee zou ik echt geholpen zijn.
 
Dag snb

Die gaat over de replace opdracht.

Het probleem voor mij is dat replace "" door "" of replace null door "" niets doet.
hetzelfde door hetzelfde vervangen doet inderdaad niets, dat is normaal. Als je "a" door "a" vervangt blijft daar ook gewoon a staan. Dus ik zie niet echt het probleem?
 
Ik begrijp niet waarom u stelt dat er geen enkele formule in het bestand staat. Het gaat nu om de formule
Code:
 Cells(Rij, 3).FormulaR1C1 = "=RC[-1]&"""""
Dat is geen formule, maar VBA-code om een formule in een werkblad te zetten.
Lees er je Handboek VBA maar op na.
 
Laatst bewerkt:
Als het resultaat van een formule "leeg" is ("") is het veld niet leeg.

Vervolgens zie ik in het voorbeeldbestand (Blad1) geen enkele formule.
 
Dag NoellaG
Ik dacht dat mijn probleem uit het voorbeeld programmaatje bleek.

"" vervangen door "" verandert inderdaad niets
Maar "" door "@" vervangen en vervolgens "@ door "" vervangen heeft als gevolg dat de cel die eerst niet echt leeg was nu wel echt leeg is. Dat verschil merk je als je met Ctrl/down door de kolom gaat.
Ik zou graag willen weten of dit ook met één vervangingsstap zou kunnen.

Weet u of iemand anders dat?
 
Inmiddels zijn we een week verder, zonder reacties.
Betekent dat dat mijn vraag opgelost kan worden (met een replace opdracht)?
Of dat niemand door heeft dat het een reële vraag is.

Ben benieuwd of er iemand met een echt antwoord komt.
 
Je bestandje bevat geen zinnige informatie, dus we kunnen er niks mee. Dat is door Senseo al aangestipt, maar je hebt daar niks mee gedaan. Althans: ik zie het niet. En dan valt er niks te testen.
 
Dag Anne,

met "" vervangen door "" bereik je niets bedoel ik: een lege cel in Excel bevat een lege string, dus als deze "" bevat dan is de cal leeg. Het enige dat je nog in de cel kan hebben is een formatering. Je kan alles: inhoud, formats, commentaren in één keer verwijderen door een clearall. Een replace opdracht gebruik je niet om iets leeg te maken, maar om iets te vervangen. Om iets leeg te maken heb je de clear opdrachten.
 
Beste mensen.
Zou iemand eens de moeite willen nemen om het programmaatje uit de bijlage op te halen en de macro te activeren.
Als je met F8 door de macro gaat zie je dat na de eerste keer
Code:
Selection.End(xlDown).Select
de selectie in rij 6 staat en na de tweede keer
Code:
Selection.End(xlDown).Select
staat de selectie in rij 4.

Dat is dus verschillend omdat de eerste keer de "lege" cell C3 niet leeg is en de tweede keer wel.
Daar gaat het mij om. Ik vroeg me af (en vroeg aan jullie) of het mogelijk is om dat leeg maken van cel C3 te realiseren door één keer een replace opdracht uit te voeren.

Let op. Het gaat er dus niet omdat dit programma iets belangrijks doet, ik heb het alleen maar gemaakt om mijn vraag duidelijk te kunnen maken. Dat is dus niet gelukt ;).

Ik hoop dat ik nu duidelijk genoeg ben geweest.

En dat er iemand met een echt antwoord op mijn vraag komt.
 
Ik moet zeggen dat het een lastig probleem is; ik had het zelf ook al eerder bij de hand gehad, maar er eigenlijk geen last van (wie wel?) omdat lege cellen in een kolom doorgaans niet echt een probleem zijn. En het is ergens wel fijn dat het 'datablok' als zodanig in tact blijft voor als je alles wilt selecteren (met <Ctrl>+<*> bijvoorbeeld). Als je veel rijen hebt, en ze zijn dan leeg, dan ben je wel even bezig :) (al zijn er dan wel andere trucjes natuurlijk).

Ik heb je test wat uitgebreid, en geconstateerd dat het rij voor rij doorlopen van de formules behoorlijk wat tijd in beslag neemt. De twee Replace formules achter elkaar uitvoeren daarentegen gaat behoorlijk snel.
Daarmee zou je kunnen stellen dat het een non-probleem is, en hooguit uit technisch/theoretisch oogpunt interessant :d).

Code:
Sub Testleegmaken()
Dim i As Long, Rij As Long
    
    Cells.Clear
    For i = 2 To 100000 Step 2
        Cells(i, 2) = i / 2
    Next i
    For Rij = 2 To 100000
        Cells(Rij, 3).FormulaR1C1 = "=RC[-1] & """""
    Next Rij
    With Range(Cells(2, 3), Cells(100000, 3))
        .Copy
        .PasteSpecial Paste:=xlPasteValues, SkipBlanks:=True
    End With
    Application.CutCopyMode = False
    Cells(2, 3).Select
    Selection.End(xlDown).Select
    With Range(Cells(2, 3), Cells(100000, 3))
        .Replace What:="", Replacement:="@"
        .Replace What:="@", Replacement:=""
    End With
    Cells(2, 3).Select
    Selection.End(xlDown).Select

End Sub
 
Fijn dat je ziet dat de vraag wel reëel is.
Dank voor het meedenken.

Voor de toepassing waar ik aan werk is het heel handig als de lege velden ook echt leeg zijn, bijvoorbeeld om snel naar het eerstvolgende lege veld in een gevulde kolom of naar het eerstvolgende gevulde veld in een "lege" kolom te gaan. Ik werk met bestanden met 15.000 tot 20.000 regels. Dus dan is dat wel plezierig.

Inderdaad werkt het op de huidige manier goed en redelijk snel al is het een rot gezicht als al die "@" eerst verschijnen en dan verdwijnen. Maar daar is nog best iets aan te doen natuurlijk.
Dat bracht me wel op de gedachte dat het mooi zou zijn als je direct in de (eerste) replace opdracht het veld leeg kon maken zoals dat wel in de tweede gebeurt.

Maar als het niet kan is er "geen man over boord". Het werkt nu, maar zou mooier moeten kunnen.

Als niemand hier een oplossing voor weet dan sluit ik de vraag binnenkort.
 
Ik denk dat een spatie ook wel zal werken; een @ is toch ook niet meer dan een teken dat je er in zet?
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan