Range select werkt niet

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

  • Zerveza
  • Registratie: Maart 2001
  • Laatst online: 17-12-2021

Zerveza

DoS porfavor

Topicstarter
ik heb op de sheet "invulblad" een tabel staan die onderaan de tabel op de sheet "datablad" moet worden geplakt, ik wil daarvoor de volgende VB code gebruiken:

code:
1
2
3
4
5
6
7
8
9
Private Sub CommandButton1_Click()
    Range("J4:N20").Select
    Selection.copy
    Sheets("Datablad").Select
    Range("A1").Select
    Selection.End(xlDown).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub


om een of andere rede krijg ik een foutmelding op de Range("A1").Select, nl:"Select method of Range class failed"
Ik ben nog lerende in de wereld van VB.. zal wel een domme fout zijn.

  • Zerveza
  • Registratie: Maart 2001
  • Laatst online: 17-12-2021

Zerveza

DoS porfavor

Topicstarter
heb hem al... private sub op sheet A gaat niets kunnen selecteren op een andere sheet..

heb er nu een macro van gemaakt in de module1 gezet en roep hem aan met een knop..

topic kan dicht

  • DukeBox
  • Registratie: April 2000
  • Niet online
Vaak kom je door het uitleggen van je probleem automatisch achter de oplossing.. :)
Volgende keer ff tot 10 tellen voordat je op submit klikt ;)

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Waarom selecteerd toch iedereen :?

Je kan gewoon gelijk het range-object gebruiken:
Visual Basic:
1
2
3
4
Private Sub CommandButton1_Click()
    Range("J4:N20").Copy
    Sheets("Datablad").Range("A1").PasteSpecial Paste:=xlPasteValues
End Sub


Dit werkt direct onder de knop, maar het is netter om de code als functie in een module te zetten. Je kan de functie dan ook makkelijker via een andere knop aanroepen, ergens in een andere functie, via een eigen userform etc..

[edit]
Je kan het ook zonder klembord doen:
Visual Basic:
1
2
3
4
5
6
7
8
9
Private Sub CommandButton1_Click()
    Dim src As Range
    Dim dest As Range
    
    Set src = Range("J4:N20")
    Set dest = Sheets("Datablad").Range("A1").Resize(src.Rows.Count, src.Columns.Count)
    
    dest.Value = src.Value
End Sub

[ Voor 24% gewijzigd door Daos op 15-04-2007 15:58 ]


  • Zerveza
  • Registratie: Maart 2001
  • Laatst online: 17-12-2021

Zerveza

DoS porfavor

Topicstarter
bedankt voor tips, ben alleen bang dat de laatste tips niet het gewenste resultaat zullen geven. Ik wil namelijk dat de gecopieerde data onderaan de tabel geplakt worden. Daarom stond er nog deze tussen:
code:
1
Selection.End(xlDown).Select

Verwijderd

dat kan je in regel 6 van Daos' script integreren:
Visual Basic:
1
Set dest = Sheets("Datablad").Range("A1").end(xldown).offset(1).Resize(src.Rows.Count, src.Columns.Count)

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Zerveza schreef op maandag 16 april 2007 @ 13:10:
bedankt voor tips, ben alleen bang dat de laatste tips niet het gewenste resultaat zullen geven. Ik wil namelijk dat de gecopieerde data onderaan de tabel geplakt worden. Daarom stond er nog deze tussen:
code:
1
Selection.End(xlDown).Select
Dat .End(xlDown) werkt niet bij mij (Excel2000) als er maar een of twee velden ingevuld zijn. Hij gaat dan naar de laatste cel (65536). Ik had het er daarom maar even uitgegooid.


Waar het mij om ging was dat je elke keer selecteert. Dat is nergens voor nodig.
Visual Basic:
1
2
    Range("J4:N20").Select
    Selection.copy

.Select selecteert Range("J4:N20") en vervolgens haal je met Selection dezelfde Range("J4:N20") weer op. Je kan dus ook gelijk Range("J4:N20").copy doen.

Een Range kan je ook in een variabele stoppen (voorbeeld aan de hand van je originele code):
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub CommandButton1_Click()
    Dim src as Range    
    Dim dest as Range    

    Set src = Range("J4:N20")
    src.copy
    Set dest = Sheets("Datablad")
    Set dest = dest.Range("A1")
    Set dest = dest.End(xlDown)
    dest.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub



Je moet niet vergeten dat _heretic_ ook nog ergens offset(1) heeft staan. Je mag zelf bedenken waarom...

  • Zerveza
  • Registratie: Maart 2001
  • Laatst online: 17-12-2021

Zerveza

DoS porfavor

Topicstarter
Daos schreef op maandag 16 april 2007 @ 16:39:

Je moet niet vergeten dat _heretic_ ook nog ergens offset(1) heeft staan. Je mag zelf bedenken waarom...
Anders overschrijft hij de laatste regel van het datablad..


toch..?

Verwijderd

Even een kick.

Ik zit met precies hetzelfde probleem. Ik heb al heel veel opgezocht, maar om onduidelijke redenen wordt er _altijd_ de laatste regel van het werkblad geselecteerd, in plaats van de laatste onbeschreven regel.

Ik gebruik nu letterlijk de code die Daos gaf (op de range waardes na). Hiermee wordt de informatie op de laatste regel geplakt. Met de aanvulling van _heretic_ krijg ik een foutmelding 1004, waarschijnlijk omdat VBA probeert iets op een niet bestaande regel te plakken.

Wat doe ik fout en hoe kan ik het aan de praat krijgen? Ik gebruik Excel 2000.
Ik wil gewoon dat elke keer als ik de macro start dat er in de "lijst" die ik gemaakt heb een regel met informatie onder de laatste regel geplakt wordt.

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 09-07 19:01
Zo dan:
code:
1
2
3
4
5
6
7
8
9
10
11
Private Sub CommandButton1_Click()
    Dim src as Range    
    Dim dest as Range    

    Set src = Worksheets("invulblad").Range("J4:N20")
    Set dest = Worksheets("Datablad").Range("A1").End(xlDown).Offset(1,0)

    src.copy
    dest.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub


edit: er ontbrak een offset

[ Voor 3% gewijzigd door Bolukan op 01-06-2007 09:27 ]


Verwijderd

Zo had ik het ongeveer ook. Nog steeds krijg ik een 1004 op regel 6. Als ik de offset weg haal, dan wordt de data op de laatste regel in de sheet geplakt (65536). Het is de bedoeling dat de data in A2:Q2 geplakt wordt. De volgende keer A3:Q3, dan A4:Q4, etc....

Dit is de code die ik nu gebruik:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
Sub Makro2()
    Dim src As Range
    Dim dest As Range

    Set src = Worksheets("Produktuppgifter").Range("B64:R64")
    Set dest = Worksheets("Översikt").Range("A1").End(xlDown)

    src.Copy
    dest.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub


Ik ben niet zo heel erg thuis in VB / VBA, maar na het lezen van vele sites en tips is het me nog steeds niet duidelijk waarom er steeds op de laatste regel geplakt wordt.

Heeft het iets te maken met Sub / Private Sub (wat is het eigenlijk?)

Edit:
Één van de twee heb ik opgelost door een regel in te voegen vóór regel A, deze vervolgens weer te verwijderen en dan de macro te draaien.

De andere (met identieke code) werkt nog weer anders. Er wordt netjes na de titel (eerste en laatste beschreven regel) data ingevoegd. Tot zo ver alles ok. Als je dan echter nog een keer de macro start, wordt de enige dataregel die er stond overschreven door een nieuwe. Ben ik nou zo dom of klopt er niets van dat VBA :X. Ik heb nog nooit een script / programmeertaal meegemaakt die met hetzelfde script verschillende acties uitvoert. 8)7

[ Voor 24% gewijzigd door Verwijderd op 01-06-2007 10:18 ]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Het probleem met .end(xldown) is dat als de selectie al de laatste cel in een bereik is, dat de selectie dan meteen helemaal naar het einde van het blad springt. Je kunt er op veelmanieren omheen werken, maar de meest simpele (en een van de lelijkste) is om ervoor te zorgen dat je lijst altijd minimaal 2 regels groot is. :)
Ik heb nog nooit een script / programmeertaal meegemaakt die met hetzelfde script verschillende acties uitvoert.
offtopic:
Toch wel. Alleen bij exact dezelfde ingangsparameters zou het vreemd zijn :X

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


Verwijderd

Visual Basic:
1
Set dest = Worksheets("Översikt").Range("A65536").End(xlup).offset(1)

Verwijderd

Als ik het goed begrijp doet dit hetzelfde, maar zoekt het de laatste regel die beschreven is van onderaf. Inmiddels heb ik het probleem opgevangen door de lijst 2 regels groot te maken.

Verder had ik (heb ik nog steeds) niet helemaal door wat het effect op scripts is met extra lege regels, of juist gevulde regels. Maar goed, het werkt nu.

Verwijderd

het gebruik van de methode end(richting) is equivalent aan de werking ervan in de gui:
ga met de cursor op de eerste cel van een volledig gevuld databereik staan, druk op end, dan op het pijltje naar beneden, de actieve cel is nu de laatst gevulde cel in de kolom van het databereik. druk nogmaals end, pijltje naar beneden. de actieve cel is nu de eerste in die kolom waar data staat, is er zo geen cel, zal de laatste rij geselecteerd worden (65536).
mijn suggestie om andersom te werken kan soms handig zijn als er lege rijen zijn in het datagebied, of als je telkens onder de niet-gekende laatst gevulde cel in de kolom gegevens moet invoeren.

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 09-07 19:01
@_heretic_: Onderaan beginnen en dan omhoog is een goede oplossing.
Is alleen niet Excel 2007-proof ;)

Verwijderd

Bolukan schreef op zaterdag 02 juni 2007 @ 13:15:
@_heretic_: Onderaan beginnen en dan omhoog is een goede oplossing.
Is alleen niet Excel 2007-proof ;)
explain?

  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 09-07 19:01
Excel 2007 heeft meer rijen en met 65536 begin je 'mogelijk' halverwege ....

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Erger is imho dat het niet denkbeeldig is dat ergens halverwege een gevulde cel is blijven staan nadat een gebruiker even naar beneden scrollde en daar wat heeft zitten uitproberen. Imho is de volgende constructie eenduidiger, makkelijker te begrijpen en minder foutgevoelig. :)
Visual Basic:
1
set dest=[A1].Offset([A1].CurrentRegion.Rows.Count, 0)

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

Pagina: 1