Toon posts:

[VBA] een Range bepalen adhv een variable

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

Verwijderd

Topicstarter
hallo

Ik heb een probleempje met een procedure die ik moet schrijven voor school.

De procedure moet de som berekenen van een willekeurig aantal getallen in kolom A, en het resultaat onder de laatst ingevulde cel schrijven (van kolom A).

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Sub p_kolom_som()
    Dim v_Testcel As Range
    Dim v_Lastcel As Range
    Dim v_Kolom As Range
    Dim v_Som As Integer
    Const c_Resultaat As String = "Slecht resultaat"
    
    
    Set v_Lastcel = [A1].End(xlDown)
    v_Lastcel.Select
    
    Set v_Kolom = Range("A1:v_Lastcel")

For Each v_Testcel In v_Kolom
        v_Som = v_Som + v_Testcel.Value
        'controleren op 0-waarden
        If v_Testcel = 0 Then
            v_Testcel.Offset(0, 1).Value = c_Resultaat
        End If
    Next v_Testcel
    
    v_Lastcel.Offset(1, 0).Value = v_Som
    
End Sub

om de laatst ingevulde cel te bepalen gebruik ik dus "End(xlDown)" om vervolgens de range te bepalen waarvan Exel alle getallen moet optellen dacht ik aan "Set v_Kolom = Range("A1:v_Lastcel") ". Dit geeft echter een error: "Run-time error 1004; Method 'Range' of object '_Global failed"

mijn vraag is dus:"Hoe kan je een range bepalen van A1 tot aan een variable?"

dank bij voorbaad

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02-04 14:17

Janoz

Moderator Devschuur®

!litemod

Dit topic lijkt me meer op zijn plek in Officesuites en -software dan in Programming.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Kijk eens wat de string v_Lastcel bevat middels debug.print. En kijk ook wat de sting "A1:v_Lastcel" bevat. Bedenk dan hoe je strings samenvoegt, want na die .print weet je dat het niet zo is :P
"A1:"& v_Lastcel. ALS v_Lastcel bijv. de string "A100" bevat dan.

[ Voor 0% gewijzigd door een moderator op 12-11-2006 01:52 . Reden: O-) ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


  • SierdW
  • Registratie: April 2004
  • Laatst online: 23-09-2025
Ik heb niet verstand van VBA, maar kan me voorstellen dat het net zo kan als in VB:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub tellen()
Dim rij, kolom As Integer
Dim optellen As Integer
Dim laatstecell As Integer

laatstecell = Cells(1, 1).End(xlDown)

optellen = 0

kolom = 1

For rij = 1 To laatstecell
    If Cells(rij, kolom) <> "" Then
        optellen = optellen + Cells(rij, kolom)
    Else
        Cells(rij, kolom) = optellen
        Exit Sub
    End If
Next
End Sub


/edit bij nader inzien geen antwoord op je vraag, leidt misschien wel tot nieuwe ideeën :+

[ Voor 9% gewijzigd door SierdW op 12-11-2006 13:07 ]


Verwijderd

Topicstarter
F_J_K schreef op zondag 12 november 2006 @ 01:01:
Kijk eens wat de string v_Lastcel bevat middels debug.print. En kijk ook wat de sting "A1:v_Lastcel" bevat. Bedenk dan hoe je strings samenvoegt, want na die .print weet je dat het niet zo is :P
"A1:"& v_Lastcel. ALS v_Lastcel bijv. de string "A100" bevat dan.
wel ik had dat al geprobeerd (Set v_Kolom = Range("A1:" & v_Lastcel)), maar dit gaf ook een run-time error (1004).
als ik test wat er in "A1:v_Lastcel" zit, is dat A167. (de laatst ingevulde waarde in de kolom is 67, dus hij plakt die 67 gewoon aan die A1, en komt dus Range(A167) uit ;(

zou het kunnen dat er iets mis is met
code:
1
Set v_Lastcel = [A1].End(xlDown)


hij ziet ernaar uit dat v_Lastcel niet meer aanzien wordt als een Range... denk ik :?

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

Daarom gaf ik ook aan om eens te kijken wat je nu precies doet. Middels F1 of door Debug.Print [A1].End(xlDown) eens te vergelijken met Debug.Print [A1].End(xlDown).Address :Y)

code:
1
2
3
4
5
6
Dim v_Lastcel As Range
Set v_Lastcel = [A1].End(xlDown)
Debug.Print v_Lastcel.Address
Debug.Print "A1:v_Lastcel"
Debug.Print "A1:" & v_Lastcel
Debug.Print "A1:" & v_Lastcel.Address

-->
$A$15
A1:v_Lastcel
A1:56
A1:$A$15

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Verwijderd

Topicstarter
bedankt voor je hulp _/-\o_
(ik nog maar ben pas begonnen met VBA en ik kende die debug en address nog niet. )

  • Daos
  • Registratie: Oktober 2004
  • Niet online
Verwijderd schreef op zondag 12 november 2006 @ 14:48:
wel ik had dat al geprobeerd (Set v_Kolom = Range("A1:" & v_Lastcel)), maar dit gaf ook een run-time error (1004).
als ik test wat er in "A1:v_Lastcel" zit, is dat A167. (de laatst ingevulde waarde in de kolom is 67, dus hij plakt die 67 gewoon aan die A1, en komt dus Range(A167) uit ;(
Als het "A1:A67" moet worden en er zit 67 in je variabele, dan kan je gewoon ("A1:A" & v_Lastcel) doen. (Het is alleen vreemd dat : verdween bij jou.)
Pagina: 1