15. januar 2004 - 14:55Der 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?
Brug af AI afslører de svagheder, virksomheder allerede har opbygget gennem års cloud-transformation, nye SaaS-løsninger og fragmenterede sikkerhedssystemer.
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.
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.
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.
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
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.
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.
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?
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
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.
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.
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))"
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.