[excel07]vba om inhoud meerdere cellen te vervangen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 07:30
Ik probeer van meerdere cellen tegelijk de inhoud te veranderen (en kleur, maar dat is niet zo moeilijk). Is dit überhaupt mogelijk? De waarde moet van 1 naar "V" gaan.
Het probleem is dat het aantal cellen iedere keer anders is, en natuurlijk de locatie. Voor 1 cell is het simpel: activecell.value="V", maar hoe krijg ik dit voor elkaar voor meerdere cellen tegelijk?

Is het mogelijk om met een script de selectie langs te lopen welke cellen er in zitten en daar de waarde van deze cellen te veranderen?

Acties:
  • 0 Henk 'm!

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Ja dat is mogelijk.

Anyways, het is voor mij wel erg lang geleden dat ik in Excel hele programmatuur heb geschreven, maar ik zou het laten lopen in een for-next lus, niet met ActiveCell.Value werken.. Dat werkt heel erg traag, vanwege dat je op je scherm alles ziet gebeuren. Zo heb ik hele adressenbestanden met ActiveCell.Value doorgelopen, en dat schiet niet op. Excel minimaliseren bij het starten van de macro is een snelheidwinst van waar je u tegen zegt.

Als ik het nog goed heb, dan kan je beter in een for-next lus Cell(A1).Value gebruiken (al kan het zijn dat ik dit doordat ik er al 10 jaar niet mee gestoeid heb, toch anders zijn).

Maar wat je wil kan prima.

Wat ik zelf altijd regelmatig deed, was gewoon een macro opnemen, wat dingetjes doen, vervolgens de opname stoppen, en in de editor kijken wat er aan code stond, en daarop verder gaan stoeien.

Edit:
En een hele range aan cellen veranderen, kijk eens hier: https://www.google.nl/?gws_rd=ssl#q=cell+range+excel

Ander puntje is, waar je flink nat mee kan gaan, is de .Value.. Je vraagt de waarde van een cell op bijvoorbeeld.. $var = ActiveCell.Value.. Als er in die cell bijvoorbeeld een huisnummer staat. 1 - 35 zeg maar.. Met .Value krijg je daar -34 voor terug. Want 1 - 35 is een berekening. Met adressen ga je daar volledig nat mee. Dan kan je beter de cell uitlezen door .Formula te pakken.

Het ligt er aan wat je precies wil doen, en wat er precies in de cellen staat..

[ Voor 25% gewijzigd door RaZ op 14-01-2015 10:50 ]

Ey!! Macarena \o/


Acties:
  • 0 Henk 'm!

Verwijderd

Paultje3181 schreef op woensdag 14 januari 2015 @ 10:36:Is het mogelijk om met een script de selectie langs te lopen welke cellen er in zitten en daar de waarde van deze cellen te veranderen?
Ja, dat is mogelijk, maar wat meer info is wel gewenst.
Zijn het ALLE cellen in je bereik die moeten wijzigen, of alleen cellen die aan een bepaalde voorwaarde voldoen (bv. die nu een bepaalde waarde hebben die je wil wijzigen)?

@RaZ,
Als celwaarden door Excel als getal kunnen worden opgevat, dan moet je die celwaarden tussen aanhalingstekens plaatsen, dan doet dat probleem zich niet voor.

Acties:
  • 0 Henk 'm!

  • Belindo
  • Registratie: December 2012
  • Nu online

Belindo

▶ ─🔘─────── 15:02

Als je alle cellen in een bepaalde range wilt veranderen kun je met een simple loop door alle kolommen en cellen in de range al een eind komen.

Staan de cellen echter niet in een mooie range, dan zul je toch je uitzonderingen aan de code moeten toevoegen, welke cellen wél en niet vervangen moeten worden. Zoals alfas al zegt, iets meer info is wel handig

@RaZ; een Application.Screenupdating = False bovenaan je code help al een hoop :)

Coding in the cold; <brrrrr />


Acties:
  • 0 Henk 'm!

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

@alfas:
Zeg dat tegen de klanten die dat niet weten ;) Die draaien een export naar Excel uit hun ERP programma, en daar wordt geen rekening mee gehouden. Overigens is een single-quote prefix als inhoud al genoeg om aan te geven dat de inhoud van een cell niet nummeriek is.

Excel is een rekenprogramma, en als je macro's gaat maken en je gebruikt zaken als .Value, gaat ie rekenen als een cell nummeriek. Met .Formula rekent Excel helemaal niet. Die pakt dan echt de inhoud, en niet de som van de inhoud.

@Belindo:
Daar was ik later inderdaad achter gekomen. Ik ben dan, net als de TS, gewoon geen VBA-guru, en dan doe je eigenlijk veel op basis van trial & error, ook zonder je in de gaten hebt dat je met de verkeerde commando's aan het werken bent.

Zelf had ik mijn macro's ook met ActiveCell gedaan, en dan de focus verplaatsen in een for-next lus. Trage bagger. Minimaliseren bij aanvang macro, en weer maximaliseren gaf een snelheid winst waar je u tegen zei.

Later wel alles herschreven naar Cell.Range("C1").Value = $var zelfs nog sneller ging omdat je gewoon niet constant de focues hoeft te verplaatsen.




Juist omdat we niet weten hoe het Excel-bestand is, vind ik het zeker de moeite waard om te melden dat $var = ActiveCell.Value wel eens niet geeft wat je verwacht.. Dat ligt bij de kennis aan de gene die het schrijft natuurlijk.. Zeker als het gaat om belangrijke data, kan dat best kostbare geintjes zijn..

Ey!! Macarena \o/


Acties:
  • 0 Henk 'm!

Verwijderd

RaZ schreef op woensdag 14 januari 2015 @ 12:41:
Zeg dat tegen de klanten die dat niet weten. Die draaien een export naar Excel uit hun ERP programma, en daar wordt geen rekening mee gehouden.
Dat begrijp ik ook wel.
Maar als jij hun gegevens moet bewerken, dan ben jij het die daar met je vba-code rekening mee moet houden!

Acties:
  • 0 Henk 'm!

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

De TS heeft denk ik gewoon een macro opgenomen, en heeft nu iets in de trend van:
code:
1
2
Cell.Range("A1").Select
ActiveCell.Value = "blaat"

Dat kan sneller, want selecteren hoef je niet te doen..
code:
1
Cell.Range("A1").Value = "blaat"

Doet het zelfde, maar is een veelvoud sneller vanwege de screenupdate.

En hier nog een voorbeeld van hoe snel je de mist in kan gaan door niet weten wat je doet, en macro's opneemt.
code:
1
2
3
4
5
6
7
Cell.Range("A1") = "03-12-1976"

$var1 = Cell.Range("A1").Value
$var2 = Cell.Range("A1").Formula

// $var1 = "-1985"
// $var2 = "03-12-1976"

Even m'n ggeboortedatum gebruikt als voorbeeld.
Disclaimer: typo's en syntax fouten kunnen aanwezig zijn vanwege het na 10 jaar niet meer te hebben gebruikt, en ik dit uit m'n hoofd doe.

Ey!! Macarena \o/


Acties:
  • 0 Henk 'm!

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 07:30
Nee, precies andersom. Er worden een aantal willekeurige cellen geselecteerd die vervolgens een ander kleurtje en de waarde "V" moeten krijgen. Dat kan a1:a2 zijn, maar ook c5:d8 bijv

Acties:
  • 0 Henk 'm!

  • Belindo
  • Registratie: December 2012
  • Nu online

Belindo

▶ ─🔘─────── 15:02

Een voorbeeld zou zijn:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub bla()

    Dim rng As Range
    Set rng = Application.Selection
    
    Dim cell As Range
    
    For Each cell In rng
        cell.Value = "V"
        
        With rng.Interior
            .Color = 65535
        End With
    
    Next
    
End Sub

Hou dan weer wel rekening met het formatten van je cellen zoals RaZ al zei. Wanneer je bijvoorbeeld de value 1 in een cel zet die geformatteerd is als percentage, zal hier 100% in verwschijnen ipv. 1%.

Coding in the cold; <brrrrr />


Acties:
  • 0 Henk 'm!

Verwijderd

Als je een keuze kunt maken, kun je nieuwe (evt. andere) inhoud en kleur invoeren, maar ook weghalen.
Selecteer de gewenste cellen en voer onderstaande macro uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Sub mijnmacro()
Dim y As Integer, x
x = InputBox("Welke waarde moeten de geselecteerde" & Chr(10) & _
"cellen krijgen? (blanco = niets invullen)")
y = InputBox("En welke kleur (0-56, 0 = geen kleur)?")
With Selection.Cells
.Value = x
If WorksheetFunction.And(y >= 0, y <= 56) Then
.Interior.ColorIndex = y
End If
End With
End Sub

[ Voor 14% gewijzigd door Verwijderd op 16-01-2015 04:01 ]

Pagina: 1