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

Opgelost Melding bij verwijderen kolommen/rijen die gegevens bevatten

Dit topic is als opgelost gemarkeerd
Status
Niet open voor verdere reacties.
Het is me nog overkomen:(: in mijn vorig voorbeeldje had ik me laten misleiden door iets dat al bestaat, in dit geval de v.o.-formule van snb die ik zonder verder nadenken herwerkte voor kolommen.
Feit is dat het een stuk eenvoudiger kan, dus nieuw bestandje hierbij (of: hoe een stevige koffie 's morgens in de vroegte tot autonoom denken kan leiden).
 

Bijlagen

Op het blad kunnen formules staan die verwijzen naar lege kolommen of rijen.
Bij verwijderen gaat het mis.
 
Dat klopt. Natúúrlijk klopt dat, en dat geldt voor alle hier aangereikte oplossingen, ook die in #10;)
Daar was in de vraag ook geen sprake van, TS wou enkel een 'melding' over niet-lege rijen of kolommen. Die kan hij ofwel krijgen via Msgbox na op 'verwijderen' te hebben geklikt, ofwel preventief met v.o.
Wat jij hier aanhaalt lijkt me een stukje verantwoordelijkheid die we gerust bij TS mogen leggen, maar zeker goed dat je er de aandacht op vestigt!
 
Klopt AD1957, dit nu ook aangepast in de VBA oplossing
in een module:
Code:
Public myTargetRowBlanks As Double
Public myTargetColumnBlanks As Double
Public MyTargetHasFormulaRow As Variant
Public MyTargetHasFormulaColumn As Variant
In het codegedeelte van de Sheet:
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim RowColumnFormula As Boolean
 With Target
     If .Address = .EntireRow.Address Or .Address = .EntireColumn.Address Then
           If .Address = .EntireRow.Address Then
                RowColumnFormula = MyTargetHasFormulaRow
           Else
                RowColumnFormula = MyTargetHasFormulaColumn
           End If
              If Not Target.Cells.Count = myTargetRowBlanks And Not Target.Cells.Count = myTargetColumnBlanks Or RowColumnFormula Then
                If MsgBox("Er staat nog data in de te verwijderen rij(en)/kolom(men), toch verwijderen?", vbYesNo) = vbNo Then
                    Application.EnableEvents = False
                    Application.Undo
                    Application.EnableEvents = True
                End If
            End If
       End If
    End With
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ar As Range, r As Range, c As Range, WholeRow As Boolean, WholeColumn As Boolean
myTargetRowBlanks = 0
myTargetColumnBlanks = 0
MyTargetHasFormulaRow = False
MyTargetHasFormulaColumn = False

For Each ar In Selection.Areas
    If Not WholeRow Then WholeRow = ar.Columns.Count = Columns.Count
    If Not WholeColumn Then WholeColumn = ar.Rows.Count = Rows.Count
Next
For Each ar In Selection.Areas
    For Each r In ar.Rows
    If WholeColumn Then Exit For
      If WholeRow Then
        myTargetRowBlanks = myTargetRowBlanks + WorksheetFunction.CountBlank(r)
        If Not MyTargetHasFormulaRow Then MyTargetHasFormulaRow = r.HasFormula
        Else
        myTargetRowBlanks = myTargetRowBlanks + WorksheetFunction.CountBlank(r.EntireRow)
        If Not MyTargetHasFormulaRow Then MyTargetHasFormulaRow = r.EntireRow.HasFormula
        End If
    Next
    For Each c In ar.Columns
      If WholeRow Then Exit For
        If WholeColumn Then
            myTargetColumnBlanks = myTargetColumnBlanks + WorksheetFunction.CountBlank(c)
            If Not MyTargetHasFormulaColumn Then MyTargetHasFormulaColumn = c.HasFormula
        Else
            myTargetColumnBlanks = myTargetColumnBlanks + WorksheetFunction.CountBlank(c.EntireColumn)
            If Not MyTargetHasFormulaColumn Then MyTargetHasFormulaColumn = c.EntireColumn.HasFormula
        End If
    Next
Next
If IsNull(MyTargetHasFormulaRow) Then MyTargetHasFormulaRow = True
If IsNull(MyTargetHasFormulaColumn) Then MyTargetHasFormulaColumn = True
End Sub
 
@ E v R
Zonder enige twijfel op de goede weg, maar het lijkt erop dat verder gebruik van de tekentafel nog eventjes nodig zal zijn. In het scenario dat Albert in gedachten heeft kan zonder meer worden verwijderd. Als de formules 'buiten beeld' staan zal men dan niet eens zien dat er iets fout is, in het andere geval kan men wel 'ongedaan maken' voor zover ondertussen de selectie niet is gewijzigd. Uiteindelijk krijgt men dus de Msgbox enkel te zien door eerst de selectie te wijzigen, gevolgd door 'ongedaan maken', en in dat geval krijgt men volgens het gekozen antwoord het omgekeerde van wat verwacht wordt.
Dit is dus geen kritiek, hé, maar gewoon wat info die je mogelijk kan helpen de laatste aanpassing in orde te krijgen.
 
Juist, Kolom A is leeg, maar in kolom Z staan formules met een verwijzing naar cellen in Kolom A.
Daar is nog geen controle op.
Je zou dus ook nog moeten controleren of er elders op de werkbladen formules staan die verwijzingen hebben naar kolom A.
 
Laatst bewerkt:
@Enigmasmurf
Ik snap niet wat je bedoelt, maakt toch niet uit of het buitenbeeld is? TS wilde dat er een melding kwam.
@AD1957 👍Ja en dan ook nog formules verwijzend naar een andere rij met als uitkomst ""
Ik vond het leuk om even na te denken over de vraag uit post#1 hoor, geen verdere aanpassing van mijn kant in dit opgeloste draadje. ;)
 
@ E v R
Dat is het nu net, er komt namelijk géén melding (wat Albert blijkbaar ook heeft kunnen vaststellen, mijn fantasie is dus echt niet op hol geslagen).
Als je dan het geluk hebt dat de fout-indicatie 'binnen beeld' staat kan je nog herstellen, anders ben je de pineut.
Je hebt gelijk, het draadje staat als opgelost gemarkeerd, ik dacht gewoon dat je jezelf had uitgedaagd om het helemaal waterdicht te krijgen (soms doe ik dat ook;))
 
@Enigmasmurf

Kun je aan de hand van een vb-tje laten zien wat je bedoelt? (met de laatste code)
Dan wil ik dat voor de 'waterdichtheid' wel even bekijken
Als het gaat om een rij of kolom verwijderen waar ergens anders naar verwezen wordt is dat aan de gebruiker en komt er toch een melding want dan stond er iets toch?
 
Draadje staat inderdaad als opgelost, maar waterdicht zijn de oplossingen niet.
Mocht het mij lukken, dan laat ik nog van me horen.
 
Als het gaat om een rij of kolom verwijderen waar ergens anders naar verwezen wordt is dat aan de gebruiker en komt er toch een melding want dan stond er iets toch?
Toch niet, want er staat niets. Elders staat er een formule die verwijst naar een cel/range die binnen de te verwijderen range staat, en dan resulteert het in de cel waar de formule staat in een fout.
Maar als je nog een momentje geduld wil oefenen stop ik dat zoals je vroeg voorbeeldgewijs wel even in een bestand.
 
Vervolg: ik heb het héél simplistisch gehouden. Er staat een formule in F2. Kolom C verwijderen lukt zonder melding. Je ziet nu dat je dit niet had mogen doen maar de formule had ook in DG18203 kunnen staan.
 

Bijlagen

Hierbij bestandje met aangepaste code, welke ook dit zou moeten tegenhouden
Let wel: zolang de formule op dezelfde sheet staat.
 

Bijlagen

Deze kan volgens mij ook, maar ook alleen op 1 Blad
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Target.Columns.Count = Columns.Count Then
    
    ControleerVerwijzingen
    teller = Application.WorksheetFunction.CountA(Target.EntireRow)
    If teller > 0 Then
        MsgBox "er staan cellen met gegevens in deze rij/rijen" & Chr(10) & _
               "aantal:  " & teller & Chr(10) & _
               "LET OP MET VERWIJDEREN !"
    End If
End If

If Target.Rows.Count = Rows.Count Then
    ControleerVerwijzingen
    teller = Application.WorksheetFunction.CountA(Target.EntireColumn)
    If teller > 0 Then
        MsgBox "er staan cellen met gegevens in deze kolom/kolommen" & Chr(10) & _
               "aantal:  " & teller & Chr(10) & _
               "LET OP MET VERWIJDEREN !"
    End If
End If

End Sub

Sub ControleerVerwijzingen()
    Dim it As Range
    Dim afhankelijk As Range
      
    For Each it In Selection
        On Error Resume Next
        Set afhankelijk = it.Dependents

        If Not afhankelijk Is Nothing Then
           MsgBox "er zijn afhankelijke formules gevonden"
           Exit For
        End If
    Next

End Sub
 
@AD1957 Enkel wanneer je een hele rij of kolom selecteert om te verwijderen, als je middels het lint of rechtermuis een rij of kolom verwijdert na selectie van een aantal cellen krijg je geen melding. (was ook in vorige antwoorden)
Daarnaast lijkt het wegdrukken van meerdere meldingen bij enkel selectie rij/kolom, ook als je dat niet doet erg irritant, maar het doet wat het moet doen ;)
 
Of ?
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Application.EnableEvents = False
   
   Select Case Target.Address
   Case Target.EntireColumn.Address, Target.EntireRow.Address
      If Not Intersect(Cells.SpecialCells(2), Target) Is Nothing Or Not Intersect(Cells.SpecialCells(-4123), Target) Is Nothing Then MsgBox "niet leeg"
   End Select

  Application.EnableEvents = True
End Sub
 
Ik was ondertussen ook iets aan het proberen, maar door Parijs-Nice vertraging opgelopen, en ondertussen al twee werkende oplossingen.
De vraag van één miljoen is inderdaad of er een melding gewenst is vóór of na de 'verwijderen'-klik, en het antwoord zou wel eens kunnen afhangen van het volgende:
@ Albert
Als ik dus nog een minuscule bedenking mag maken: als er géén afhankelijke cellen zijn zal je code er, vooral als je een kolom selecteert, nogal lang over doen... De volgorde omkeren (eerst checken of de selectie leeg is, en enkel indien ja vervolgens naar afhankelijke cellen speuren) zou een beetje winst kunnen opleveren, maar er helemáál gelukkig van worden?
Onwaarschijnlijk leuk draadje is het inmiddels echt wel geworden (lees: ik kijk ook nog wel eens verder), met of zonder feedback van TS😂

Edit: @ snb
We zijn, ter ontspanning, al een tijdje iets heel anders aan het doen...
 
Laatst bewerkt:
@snb
Lekker kort, maar lees #26
@Enigmasmurf
Die meldingen had ik er voor mezelf even ingezet, ter controle ( niet leuk als je die steeds moet wegklikken)
De selectie van 1 kolom, pffff dat had ik ook al ontdekt, dat duurt wel effe.
Voor TS is dat nog wel te omzeilen door de range te beperken tot pakweg 10000 rijen, meer zullen er zeker niet zijn.
Verder: voor mij is het gewoon leuk/leerzaam om oplossingen te vinden( welliswaar met boerenverstand)
 
Laatst bewerkt:
Ja en neen, TS wil op tijd en stond ganse kolommen verwijderen, dan ontkom je helaas niet aan de noodzaak om +1000000 cellen te checken, laat staan dat hij in één beweging 10 kolommen zou willen verwijderen. En jouw methode gaat al aan de slag van zodra hij die kolommen selecteert.
"leuk/leerzaam om oplossingen te vinden", daar staan onze neuzen voor de volle 100% in dezelfde richting, dus beschouw mijn bedenkingen a.u.b. niet als kritiek hé!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan