Avatar billede Peter Praktikant
15. januar 2004 - 14:55 Der er 25 kommentarer og
1 løsning

Select range, range kan være tom: Problemer!

Hej
Jeg har en tabel hvor jeg skal selecte alt indholdet uden overskrifter i vba. Overskrifterne er i linje 6. Dvs. jeg skal selecte fra A7 til Ix hvor x er sidste linje med indhold. Hvis der ikke er noget indhold i tabellen skal jeg ikke selecte nogle linjer. Lige pt bruger jeg:
Range("A7", Range("I5").End(xlDown).Offset(1, 0)).Select
Men der får jeg jo altid en linje ekstra med.
Hvis jeg fjerner offset sletter den også overskrifterne. Hvis jeg erstatter I5 med I6 vælger den fra A7 og i bund i tilfælde af tom tabel.
Hvordan vælger jeg hele min tabel og kun den i vba?
Avatar billede bak Forsker
15. januar 2004 - 15:11 #1
Et forslag
If Not IsEmpty([I7]) Then Range([A7], [I6].End(xlDown)).Select
Avatar billede Peter Praktikant
15. januar 2004 - 15:17 #2
Det virker, helt perfekt. Jeg bruger det til at ændre alle cellerne indenfor den range, dette gør jeg med
For Each c In Selection.Cells
Test af om cellen er NA, hvis ikke, så ligges en værdi til
Next c
Men det går utroligt langsomt, kan du fortælle mig hvorfor og om der er en anden metode der er bedre at bruge.
Avatar billede bak Forsker
15. januar 2004 - 15:19 #3
vis lige hele koden til ændring af cellerne
Avatar billede Peter Praktikant
15. januar 2004 - 15:28 #4
Call getRates
        If Not IsEmpty([A7]) Then
        Range([A7], [A6].End(xlDown)).Select
        For Each c In Selection.Cells
            If c.Offset(0, 1).Value = "NA" Then c.Offset(0, 1).Value = "" Else c.Offset(0, 1).Value = c.Offset(0, 1).Value + 50
            If c.Offset(0, 2).Value = "NA" Then c.Offset(0, 2).Value = "" Else c.Offset(0, 2).Value = c.Offset(0, 2).Value + 0.5
            If c.Offset(0, 3).Value = "NA" Then c.Offset(0, 3).Value = "" Else c.Offset(0, 3).Value = c.Offset(0, 3).Value + 0.5
            If c.Offset(0, 4).Value = "NA" Then c.Offset(0, 4).Value = "" Else c.Offset(0, 4).Value = c.Offset(0, 4).Value + 0.5
            If c.Offset(0, 5).Value = "NA" Then c.Offset(0, 5).Value = "" Else c.Offset(0, 5).Value = c.Offset(0, 5).Value + 0.5
            If c.Offset(0, 6).Value = "NA" Then c.Offset(0, 6).Value = "" Else c.Offset(0, 6).Value = c.Offset(0, 6).Value + 0.25
            If c.Offset(0, 6).Value = "NA" Then c.Offset(0, 6).Value = "" Else c.Offset(0, 6).Value = c.Offset(0, 6).Value + 0.25
            ActiveSheet.Cells(c.Row, 10).Formula = "=VLOOKUP(A" & c.Row & ",Dates,2,FALSE)"
            ActiveSheet.Cells(c.Row, 10).NumberFormat = "dd/mm/yyyy"
        Next c
        End If
        Application.ScreenUpdating = True

getRates genererer tabellen med et advanced filter.
Det drejer sig om at jeg har alle disse indgange i en tabel i et andet sheet, når de skal vises i denne tabel skal de have lagt en værdi til alt efter kolonne. Før havde jeg bare den bagvedliggende tabel 2 gange, men det drejer sig om 2000 linjer, så det var ca. 500KB ekstra jeg gerne ville være fri for.
Avatar billede bak Forsker
15. januar 2004 - 16:03 #5
Jo, jeg kan godt komme op med en hurtigere metode, men jeg skal lige vide om "NA" er en rigtig fejlværdi ( #NA") eller bare en tekststreng du har indsat.
Avatar billede bak Forsker
15. januar 2004 - 16:04 #6
:-) den rigtige er #N/A.
Avatar billede bak Forsker
15. januar 2004 - 16:32 #7
Test denne. Den skulle gerne være hurtigere ;-)

Sub dtest()
Dim Matrix
Dim rgSetPlace As Range
Dim Lastrow As Long
'find området og sidste række
If Not IsEmpty([I7]) Then Set rgSetPlace = Range([A7], [I6].End(xlDown))
Lastrow = [I6].End(xlDown).Row
'Overfør værdierne til et matrix
Matrix = rgSetPlace
'Gå igennem matricen kolonne 2-6
For x = 1 To UBound(Matrix, 1)
    For y = 2 To UBound(Matrix, 2)
    If Not IsNumeric(Matrix(x, y)) Then
    'hvis det er en fejl eller en tekst så skriv ""
        Matrix(x, y) = ""
        Else
    'ellers læg et tal til
        Select Case y
            Case 2: Matrix(x, y) = Matrix(x, y) + 50
            Case 3 To 5: Matrix(x, y) = Matrix(x, y) * 0.5
            Case 6: Matrix(x, y) = Matrix(x, y) * 0.25
        End Select
    End If
    Next
Next
'Overfør fra matrix tilbage cellerne
rgSetPlace = Matrix
'indsæt formel i J7 og fyld til nederste række
With [J7]
    .Formula = "=VLOOKUP(A7,Dates,2,FALSE)"
    .NumberFormat = "dd/mm/yyyy"
    .AutoFill Destination:=Range("J7:J" & Lastrow)
End With
End Sub
Avatar billede bak Forsker
15. januar 2004 - 16:36 #8
Jeg har vist ganget istedet for at lægge til, men det fikser du nok selv
Avatar billede Peter Praktikant
15. januar 2004 - 16:41 #9
jeg tester den lige, men det er en tekststreng der hedder "NA" og ikke en fejl fra en formel. Har ikke kigget på det endnu, så kan ikke se om det gør en forskel.
Avatar billede bak Forsker
15. januar 2004 - 16:46 #10
Gør ingen forskel.
Bemærk at en i forvejen tom celle også får lagt en værdi til
kan ændres
Avatar billede Peter Praktikant
15. januar 2004 - 16:59 #11
ok, men jeg kan vel ændre denne linje If Not IsNumeric(Matrix(x, y)) Then til
If IsNumeric(Matrix(x, y)) Then og så bytte om på indholdet i if-sætningen?

Mht til datoformatteringen, kan man så vælge et andet format, jeg ville gerne have det til at være dd-month-yyyy, f.eks 15-Jan-2004.

Du må meget gerne ligge et svar.
Avatar billede Peter Praktikant
15. januar 2004 - 17:00 #12
lige en anden ting, lige nu bruger jeg
With ActiveSheet.Cells(c.Row, 9).Borders(xlEdgeBottom)
            .LineStyle = xlContinuous
            .Weight = xlThin
            End With
            With ActiveSheet.Cells(c.Row, 9).Borders(xlEdgeRight)
            .LineStyle = xlContinuous
            .Weight = xlThin

For at få gitter omkring datoerne, findes der ikke en kommando der sætter en ramme om hele cellen?
Avatar billede Peter Praktikant
15. januar 2004 - 17:54 #13
Nu har jeg prøvet at kopiere din kode ind, jeg får en fejl når jeg vil køre det. Den siger der er noget galt i linjen:
Matrix = rgSetPlace
Avatar billede Peter Praktikant
15. januar 2004 - 18:08 #14
Problemet opstår når rangen er tom. Jeg kan ikke helt se hvorfor.
Avatar billede bak Forsker
15. januar 2004 - 18:16 #15
Erstat
If Not IsEmpty([I7]) Then Set rgSetPlace = Range([A7], [I6].End(xlDown))
med
If Not IsEmpty([I7]) Then Set rgSetPlace = Range([A7], [I6].End(xlDown)) else exit sub
Avatar billede Peter Praktikant
15. januar 2004 - 18:17 #16
Jeg har fikset det ved at udvide den if-sætning der tester om indholdet af I7 er tomt, hvis det er, så skal den slet ikke foretage sig noget.
Avatar billede Peter Praktikant
15. januar 2004 - 18:19 #17
ok, det er også en måde, havde ikke set din post da jeg postede.
Har du nogle forslag til hvordan jeg kan lave ramme omkring datoerne og evt. vælge et andet format. Jeg kan ikke lige få det til at virke med .Borders.
Avatar billede bak Forsker
15. januar 2004 - 18:21 #18
Mht datoformatering kan du selv sætte en anden.
Det skal så være:
  .NumberFormat = "dd/mmm/yyyy"

bemærk de 3 m'er

mht rammer

ActiveSheet.Cells(c.Row, 9).Borders.Weight = xlThin

er nok til at sætte ramme om hele cellen
Avatar billede Peter Praktikant
15. januar 2004 - 18:24 #19
super, det prøver jeg lige.
Hvorfor virker denne linje ikke:
.Formula = "=if(isna(=VLOOKUP(A7,Dates,2,FALSE));"Unknown";=VLOOKUP(A7,Dates,2,FALSE))"
Jeg vil gerne have det sådan, at der kommer til at stå Unknown istedet for #N/A hvis datoen ikke findes i tabellen jeg slår op i, men det virker ikke i vba, den vil ikke have de ekstra "" omkring unknown.
Avatar billede Peter Praktikant
15. januar 2004 - 18:27 #20
Nu kører det, og det kører super hurtigt, så det er bare lækkert.
Jeg mangler kun at få den lookup på plads.
Avatar billede bak Forsker
15. januar 2004 - 18:28 #21
Du skal huske at i VBA skal alle semicolons erstattes af komma. Du har også et lighedstegn for meget.
Avatar billede Peter Praktikant
15. januar 2004 - 18:32 #22
ok, det prøver jeg.
Avatar billede Peter Praktikant
15. januar 2004 - 18:35 #23
den vil heller ikke tage denne her linje, den brokker sig over "unknown" og siger den forventer en endt of statement:
.Formula = "=if(isna(VLOOKUP(A7,Dates,2,FALSE)),"Unknown",VLOOKUP(A7,Dates,2,FALSE))"
Avatar billede bak Forsker
15. januar 2004 - 18:48 #24
unknown skal nok have  ""Unknown""  2 anførselstegn på hver side
Det nemmeste er at optage en makro, mens du taster formlen ind.
Avatar billede Peter Praktikant
15. januar 2004 - 19:02 #25
jeg fulgte dit råd, nu kører det bare. Du skal have 1000 tak for hjælpen, det var fedt lige at få det optimeret.
Avatar billede bak Forsker
15. januar 2004 - 19:10 #26
velbekomme og tak for pointz
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