Filteren met Excel VBA - wel op Windows, niet op Apple

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Sleepoog
  • Registratie: September 2019
  • Laatst online: 18:04
Mijn vraag

Ik ben voor iemand bezig om een Excel te maken met eenvoudige VBA. Mijn code werkt wel in Windows, maar niet op een Mac. Met Mac ben ik totaal onbekend, maar ik heb wel gezien welk stuk code het probleem oplevert.

Een stuk van de code die op Windows wel werkt en op Mac niet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ActiveWorkbook.Worksheets("database").ListObjects("Table3").Sort.SortFields. _
        Add2 Key:=Range("Table3[check]"), SortOn:=xlSortOnValues, Order:= _
        xlDescending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("database").ListObjects("Table3").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    ActiveSheet.ListObjects("Table3").Range.AutoFilter Field:=12, Criteria1:= _
        "TRUE"
    Range("A2").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.EntireRow.Delete
    ActiveSheet.ListObjects("Table3").Range.AutoFilter Field:=12
    Range("A2").Select
    Selection.End(xlDown).Select
    ActiveCell.Offset(1, 0).Select


Bij het debuggen op de Mac zie ik dat de macro vastloopt op regel 20. Dat komt omdat Excel dan al in de onderste cel staat en niet verder naar beneden kan.

Ik vermoed dat de code vastloopt in regel 12 bij het filteren op TRUE. In plaats van dat de macro filter op TRUE en die regels verwijdert, wordt er helemaal geen filter toegepast en verwijdert de macro alles.

Nogmaals, op mijn Windows-machine loopt het prima.

Relevante software en hardware die ik gebruik
Windows 10 - Excel365 - Engelse versie
Mac (<-- een nieuwe met nieuwe Excel, da's alles wat ik weet. Zie daar ook geen probleem per se omdat het eenvoudige code is) - Nederlandse versie

Wat ik al gevonden of geprobeerd heb
- ik heb
code:
1
2
Criteria1:= _
        "TRUE"

vervangen door
code:
1
2
Criteria1:= _
        "1"

en
code:
1
2
Criteria1:= _
        "WAAR"

en
code:
1
2
Criteria1:= _
        1

en
code:
1
2
Criteria1:= _
        True

maar dat bood geen oplossing

- ik heb gekeken of de syntax anders is voor W of Mac, maar dat lijkt bij deze commands niet zo te zijn
- heb aan ChatGPT gevraagd hoe ik dit moet oplossen, maar ook zonder succes.

Ik vermoed dat het niet heel ingewikkeld is... maar goed, dat kunnen ook famous last words zijn.


Context: met de macro wil ik in een tabel filteren op de waarde TRUE. Alle regels met TRUE wil ik verwijderen. Daarna moet het filter uitgezet worden en ga ik naar de onderste regel van de tabel, plus één regel naar beneden om daar dan iets te plakken.

Beste antwoord (via Sleepoog op 29-03-2023 20:15)


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Je kunt het proberen door eerst de range te selecteren en dan daar autofilter op los te laten of direct aan te roepen vanuit het listobject ('similar methods on selection and Listobject are supported')

Of je loopt door alle rijen van de tabel heen (van onder naar boven en verwijdert elke rij waarin in column x de waarde true heeft.

Iets als
Visual Basic:
1
2
3
4
5
6
'nb: pseudocode
for i = objListRows.Count - 1) to 0 step -1
    if objListRange(i,12) then
          objListRows(iRowNumber).Delete 
    End If 
next i

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland

Alle reacties


Acties:
  • 0 Henk 'm!

  • SinergyX
  • Registratie: November 2001
  • Laatst online: 20:49

SinergyX

____(>^^(>0o)>____

Neem dezelfde stappen op met de macro recorder op Mac, kijk welk verschil er in dat sortering deel zit.

Nog 1 keertje.. het is SinergyX, niet SynergyX
Im as excited to be here as a 42 gnome warlock who rolled on a green pair of cloth boots but was given a epic staff of uber awsome noob pwning by accident.


Acties:
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

- ik heb gekeken of de syntax anders is voor W of Mac, maar dat lijkt bij deze commands niet zo te zijn
Dan heb je niet goed gekeken: de methode autofilter bestaat niet voor het range.object bij de MAc
Excel for Mac does not support this method. Similar methods on Selection and ListObject are supported.
https://learn.microsoft.c...pi/excel.range.autofilter

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Sleepoog
  • Registratie: September 2019
  • Laatst online: 18:04
Dan heb ik zeker niet goed gekeken |:(

Maar een echt alternatief is er niet denk ik?
Had vanochtend wel de workaround bedacht waarin ik het aantal rijen met TRUE ga tellen en dat als input gebruik om mijn range te bepalen.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Je kunt het proberen door eerst de range te selecteren en dan daar autofilter op los te laten of direct aan te roepen vanuit het listobject ('similar methods on selection and Listobject are supported')

Of je loopt door alle rijen van de tabel heen (van onder naar boven en verwijdert elke rij waarin in column x de waarde true heeft.

Iets als
Visual Basic:
1
2
3
4
5
6
'nb: pseudocode
for i = objListRows.Count - 1) to 0 step -1
    if objListRange(i,12) then
          objListRows(iRowNumber).Delete 
    End If 
next i

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


Acties:
  • 0 Henk 'm!

  • Sleepoog
  • Registratie: September 2019
  • Laatst online: 18:04
Dankjewel, @Lustucru , voor het meedenken!
Jouw oplossing is het meest elegant en daar ga ik me zeker in verdiepen. Ik heb het nu een beetje smerig opgelost door de tabel te sorteren en dan het aantal TRUE te tellen in cel AW1. Vervolgens heb ik de vba zo gemaakt, dat de Range-selectie een combinatie is van harde waarden en een (variabel) cijfer uit een cel:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sheets("database").Select
        Range("L2").Select
    ActiveWorkbook.Worksheets("database").ListObjects("Table3").Sort.SortFields. _
        Clear
    ActiveWorkbook.Worksheets("database").ListObjects("Table3").Sort.SortFields. _
        Add2 Key:=Range("Table3[check]"), SortOn:=xlSortOnValues, Order:= _
        xlDescending, DataOption:=xlSortTextAsNumbers
    With ActiveWorkbook.Worksheets("database").ListObjects("Table3").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
            
    Range("A2:V" & Worksheets("hulptabellen").Range("AW1")).Select
    Selection.EntireRow.Delete


Niet zoals het hoort, wel zodat ik het de volgende keer ook nog begrijp ;)
Pagina: 1