Avatar billede gladhund Nybegynder
12. juli 2010 - 13:55 Der er 12 kommentarer og
1 løsning

Hjælp til at forklare kode...

Hej,

Jeg har "stjålet" den her kode fra kabbak:

Public Sub test2()
Dim RW As Long, D As Variant, I As Long
RW = Range("O65536").End(xlUp).Row + 1
D = Range("O1:O" & RW)
For I = RW To 2 Step -1
If D(I - 1, 1) = "U" Then
Range("O" & I).EntireRow.Insert
  Range("O" & I).Select
  Exit For
  End If
  Next
  D = Empty
End Sub

Nu prøver jeg bare at finde en den værdi der er valgt i en combobox (cbid) i en formular (frmtrs) i stedet for som her "U". Og jeg prøver at finde den i range B21:B65536. Men jeg får "Subscript out of range ved linjen "If D(I-1, 1).... Kan nogen forklare hvorfor det går galt? Her er min egen kode:

Public Sub Findogret()

Dim RW As Long, I As Long, D As Variant, CBV As Long
  RW = Range("B65536").End(xlUp).Row + 1
    ' finder den række der er under den sidste udfyldte celle

D = Range("B21:B" & RW)
CBV = frmtrs!cbid.Value

  For I = RW To 20 Step -1
      ' læser baglæns, for st finde det sidste U
        If D(I - 1, 1) = CBV Then
           
            Range("B" & I).Select
            ' aktiverer cellen
             
            Exit For
            ' hopper ud af løkken
        End If
    Next

End Sub

Thanx
Avatar billede Ialocin Novice
12. juli 2010 - 14:41 #1
Hej gladhund

Jeg smugkigger med på denne tråd :o)

mvh Nicolai
Avatar billede excelent Ekspert
12. juli 2010 - 17:55 #2
Hvis det er den sidste forekomst du søger så prøv denne

Hvad er  frmtrs!cbid.Value ?

Sub tst()
CBV = frmtrs!cbid.Value
RW = Range("B65536").End(xlUp).Row + 1
Range("B21").Select
For t = 1 To Application.CountIf(Range("B21:B" & RW), CBV)
Range("B" & ActiveCell.Row & ":B" & RW).Find(CBV, LookIn:=xlValues).Select
Next
End Sub
Avatar billede gladhund Nybegynder
12. juli 2010 - 18:09 #3
Tak for svar, excelent. Men jeg er lidt i tvivl...

Jeg søger ikke den "sidste forekomst". Tallene i kolonnen er unikke, hvilket jeg måske burde have skrevet. Der er altså tal fra 1 til "antal rækker", og hvert tal forekommer kun en gang.

Værdien i cbid er så netop det tal fra den kolonne, som brugeren har valgt, altså fra 1 til det antal poster der er oprettet, fx "32", hvis der er oprettet 32 poster.

Og jeg ville meget gerne forstå hvad s.... der sker i den linje med If D(I-1, 1)...
Avatar billede excelent Ekspert
12. juli 2010 - 19:35 #4
Du får fejlen når du forsøger at uddrage værdier uden for variablens rækkevidde (D)

Herudover er det ikke helt klart for mig hvad du vil

Jeg lukker lige ned et times tid, uvejret er lige over os
Avatar billede gladhund Nybegynder
12. juli 2010 - 20:07 #5
OK, fair nok... :).

Det jeg vil er kort:
- Jeg har en form, hvor en bruger kan ændre, slette og tilføje poster
- Brugeren vælger et ID i en combobox (cbid)
- Så vises det ID's data (navn, dato, type mv.) i combo- og tekstbokse
- Brugerne kan også tilføje nyt ID. Så oprettes et nyt med +1 nummer højere end det højeste nu
- Brugerne kan også slette, så findes den post der skal slettes (valg i cbid) og linjen med den posts data slettes (entirerow.delete)
- Alle ID'er og deres data er i rækker i arket "Dashboard", og ID står i B21 og ned

Så det jeg vil bruge koden til er at finde den celle i kolonne B, som har en værdi magen til den der er valgt i comboboxen cbid! :)
Avatar billede excelent Ekspert
12. juli 2010 - 20:47 #6
Du har vel ikke en comboboks med et ! i navnet ?

Denne markerer valgt værdi i comboboxen i arket
Ret evt. B65000 til maks forventet rækkenr. med data

Private Sub cbid_Change()
Range("B21:B65000").Find(cbid.Value, LookIn:=xlValues).Select
End Sub
Avatar billede gladhund Nybegynder
12. juli 2010 - 20:57 #7
Grunden til at jeg har ! er pga af referencen til userform'en: "frmtrs!cbid" - altså cbid comboboxen i userform frmtrs.

OK, tak for det - det er jo en meget kortere kode... Men jeg kunne stadig rigtig godt tænke mig at vide, hvad der sker i kabbaks kode og hvorfor jeg får værdier uden for variablens rækkevidde :).
Avatar billede gladhund Nybegynder
12. juli 2010 - 21:04 #8
Din kode virker, når man smækker frmtrs! foran cbid :) - ellers ved den ikke hvor den skal lede
Avatar billede excelent Ekspert
12. juli 2010 - 21:17 #9
Hvis vi antager at der er data til og med række 40 i kolonne B
så vil følgende linie
D = Range("B21:B" & RW)
reelt indeholde værdier for området B21:B40

Men den første værdi i variablen D er D(0,1) som svarer til værdien i celle B21
Næste værdie i D er D(1,1) som svarer til værdien i celle B22. Sidste værdi i D er så D(20,1) som svarer til værdien i celle B40

Når du så med følgende linie
For I = RW To 20 Step -1
forsøger du jo at hente D(40,1) som ikke findes i variablen D, den højeste værdi er jo D(20,1)

I øvrigt er jeg ret sikker på at kabbaks kode virkede til det den var tiltængt :-)
Avatar billede excelent Ekspert
12. juli 2010 - 21:41 #10
I øvrigt kan du også anvende listindeks i stedet for som i mit første forslag Find
cbid.ListIndex + 21 returnerer rækkenummer på den valgte værdi

så kan du markere cellen med :
cells(frmtrs.cbid.ListIndex + 21 ,"B").select
Avatar billede gladhund Nybegynder
12. juli 2010 - 21:56 #11
God forklaring, men jeg er stadig desværre ikke helt med :). Jeg har også prøvet med 2 og 1 i stedet for 20 og 21 i "For I = RW To 20 Step -1" og det gav samme fejl.

Hvad er (0,1) osv - betyder det celler, rækker eller kolonner eller hvad? Den venstre værdi tæller op, men den højre bliver ved med at være 1?
Avatar billede excelent Ekspert
12. juli 2010 - 22:12 #12
D(0,1) er første værdi i variablen
hvor 0 =række og 1 tallet er kolonne

Hvis du i stedet havde D = Range("B21:C" & RW)
altså 2 kolonner, så skal du anvende D(0,2) for første værdi i kolonne 2 (C)
Avatar billede gladhund Nybegynder
12. juli 2010 - 23:13 #13
Ah, så er jeg med. Mange tak :). Jeg accepterer dit svar!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester