05. maj 2005 - 20:42Der er
36 kommentarer og 1 løsning
udvælgelse af tal
jeg har et regne ark i excel med tal der enten har 2 cifre, 4 cifre eller 6 cifre altså: xx xxxx xxxxxx
man skal så kunne vælge, om man kun vil beholde dem med 2, 4 eller 6 cifre har nogen god ide til en kode så jeg kan skille dem fra hinanden? problemet er også at der efter alle tallene står en tekst fx: 12 her er en tekst 1221 her er mere tekst 122111 her er endnu mere tekst
jeg regner med at jeg skal bruge vba streng funktionen Mid, for at finde mellemrummet mellem tal og tekst, men jeg er ikke sikker, og kan ikke få det til at virke
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Prøv denne, hvis det er ok at slette rækkerne med uønskede tal. Men du kan jo altid ændre hvad der skal ske. Den kører fra A1 til A10.
Dim i, o, p As Integer
p = 2 'ønsket antal
For i = 1 To 10 o = InStr(1, Cells(i, 1).Value, " ") If Cells(i, 1).Value = "" Then Exit Sub If Not o = p + 1 Then Rows(i & ":" & i).Select Selection.Delete Shift:=xlUp i = i - 1 End If Next i
jo det er skam vba kode jeg skal bruge, og mange tak! når jeg bruger din kode virker det dog ikke i regnearket brynil jeg har lidt svært ved at forstå din løkke, men har bare implementeret den i mit modul! kan du se hvad jeg har gjort forkert?
Public Sub aabenfil1() Dim cifferniveau As Integer, mincelle As Range, streng As String
Workbooks.Open Filename:="c:\autdnkmv.wk1" cifferniveau = InputBox("vælg ciffernivau 2, 4 eller 6")
For Each mincelle In Range("B8:N7000") If mincelle = "-" Then mincelle = "0" End If Next
Dim i, o, p As Integer
p = 2 'ønsket antal
For i = 1 To 10 o = InStr(1, Cells(i, 1).Value, " ") If Cells(i, 1).Value = "" Then Exit Sub If Not o = p + 1 Then Rows(i & ":" & i).Select Selection.Delete Shift:=xlUp i = i - 1 End If Next i
altså jeg kan godt se den skal gå længere end til A10, du må meget gerne forklare den hvis det ikke er til for meget besvær! ja, den må gerne slette hele rækken med det uønskede tal
Husk at lukke for makroen hvis der skrives et forkert tal:
p = InputBox("vælg ciffernivau 2, 4 eller 6")
If Not p = 2 Or p = 4 Or p = 6 Then MsgBox ("Du skal vælge 2, 4 eller 6") Exit Sub End If
' Første/sidste række er 8/7000. Det er dit loop For i = 8 To 7000
' gem placeringen af første mellemrum i o o = InStr(1, Cells(i, 1).Value, " ")
'hvis cellen er tom, så afslut makroen. Årsagen er, at når du sletter 'en linie så rykker du de underliggende linier op. For at tage højde 'for dette, trækker du 1 fra i. Ellers ville du springe en linie over 'ved næste check. Men det giver samtidig problemet at når du når til 'den første tomme celle i bunden så vil du få et uendeligt loop. Derfor 'et check for om cellen er tom. SÅ INGEN TOMME CELLER INDE I ARKET! If Cells(i, 1).Value = "" Then Exit Sub
'p er placeringen af mellemrummet, d.v.s 3, 5 eller 7. o er valget 'mellem 2, 4 eller 6 cifre. 'Hvis de ikke er ens, så er cellens værdi uønsket. If Not o = p + 1 Then
'Marker hele rækken der skal slettes (værdien i) Rows(i & ":" & i).Select
'Slet rækken Selection.Delete Shift:=xlUp
'Læg 1 til i når der slettes en række, som nævnt ovenfor i = i - 1 End If 'næste celle Next i
En mere hensigtsmæssig måde at foretage loopet på, når der slettes rækker, er at starte det fra bunden. Så undgår du problematikken med ændret rækkenummer og de tomme celler:
For i = 7000 To 8 Step -1 o = InStr(1, Cells(i, 1).Value, " ") If Not o = p + 1 Then Rows(i & ":" & i).Select Selection.Delete Shift:=xlUp End If Next i
Og du skal også ændre input valideringen til dette:
If Not p = 2 And Not p = 4 And Not p = 6 Then MsgBox ("Du skal vælge 2, 4 eller 6") Exit Sub End If
Jeg har lige testet det sidste eksempel og det ser ud til at fungere efter hensigten.
Prøv denne for at se hvad makroen finder:
p = InputBox("vælg ciffernivau 2, 4 eller 6")
If Not p = 2 And p = 4 And p = 6 Then MsgBox ("Du skal vælge 2, 4 eller 6") Exit Sub End If
For i = 70 To 8 Step -1 o = InStr(1, Cells(i, 1).Value, " ") If Not o = p + 1 Then Rows(i & ":" & i).Select Selection.Interior.ColorIndex = 4
End If Next i
De farvede rækker ville være blevet slettet. Hvis der iblandt dem er rækker som ikke skulle slettes, så prøv at se på formatet i cellen. Har du fx. foranstillede mellemrum?
Det burde ikke betyde noget. Den giver dig det førstkommende mellemrum regnet fra venstre. Men foranstillede mellemrum vil ødelægge makroens tænkte funktion.
hej brynil! vi har godt nok lidt svært ved at få det til at virke, jeg kunne godt tænke mig at sende det vi skal løse til dig hvis det ville være ok? det virker som om det er noget du har ret godt styr på, og så ville du også kunne se vores problem!
§2.1.12 [Det er ikke tilladt, at] "tildele point for en løsning, der ikke er tilgængelig for alle Eksperten.dk’s brugere."
§2.1.13 [Det er ikke tilladt, at] "tildele point for en opgave løst uden om Eksperten.dk (f.eks. opgaver løst via mail, ICQ eller telefon), eller blot et andet spørgsmål på Eksperten.dk (lovlig pointoverførsel undtaget)."
Offentliggør venligst svaret, jvf. Ekspertens regel §2.7., så andre kan få gavn af svaret..
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.