Avatar billede Nervatos Seniormester
24. september 2017 - 17:21 Der er 15 kommentarer og
1 løsning

Fjerne tekst men bevare tal og formler

Hej igen

Nu er jeg på spanden igen, har søgt på google og fundet dette som er tættest på.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
    Application.EnableEvents = False
    For Each cell In Target
        If Not Application.Intersect(cell, Range("A1:D4")) Is Nothing Then
          If Not IsNumeric(cell.Value) Then
              cell.Value = vbNullString
          End If
        End If
    Next cell
    Application.EnableEvents = True
End Sub

Denne gør, at man kun kan skrive tal. Men kunne godt tænke mig, hvis man nu skrev. f.eks. h293, at den så kun skrev 293. Samme med hvis #-293% bliver også til 293.
Dog er der nogle formler også, hvis det kan lade sig gøre at bevare dem med mindre man selv skriver i feltet.

Lige nu drejer det om felt A2:A5 og C2:D5, giver det mening?

Takker for Jeres tid og hjælp!
Avatar billede Jan Hansen Ekspert
24. september 2017 - 18:28 #1
prøv noget ala



Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Dim lCount as Long, sString as String
    Application.EnableEvents = False
    For Each cell In Target
        If Not Application.Intersect(cell, Range("A1:D4")) Is Nothing Then
          if Left(Target.text)="=" Then Exit For
          for lCount=1 to len(Target)
                  if IsNumeric(Mid(Target.Value,lCount,1)) then sString=sString & Mid(Target.Value.lCount,1)
          Next
          Target.Value=sString
          If Not IsNumeric(cell.Value) Then
              cell.Value = vbNullString
          End If
        End If
    Next cell
    Application.EnableEvents = True
End Sub



Ej testet

Jan
Avatar billede Nervatos Seniormester
24. september 2017 - 18:36 #2
Hej Jan

Jeg får fejl ved "Left" i Left(Target.text)="=" Then Exit For

Compile error: Argument not optional
Avatar billede Jan Hansen Ekspert
24. september 2017 - 20:26 #3
prøv Target.formula istedet
Avatar billede Jan Hansen Ekspert
24. september 2017 - 20:28 #4
Altså Left(Target.formula)="="
Avatar billede Nervatos Seniormester
24. september 2017 - 20:39 #5
Får desværre samme fejl.
Avatar billede Nervatos Seniormester
24. september 2017 - 20:51 #6
If Left(Target.Formula, 1) = "=" Then Exit For

Giver ikke fejl, så det må være rigtigt nok.
Til gengæld kommer der fejl ved denne:

sString = sString & Mid(Target.Value.lCount, 1)

Run-time error '424': Object required
Avatar billede Jan Hansen Ekspert
24. september 2017 - 22:23 #7
sString = sString & Mid(Target.Value,lCount, 1)

Target.Value,lCount, 1 det skal være "Target punktum Value koma lCount koma 1"
Avatar billede Nervatos Seniormester
25. september 2017 - 17:59 #8
Tusind tak Jan, hvis C2:C24 kun må være på max 100 og - (minus/negativ) tal ikke tilladt, hvad kan man så gøre?
Avatar billede Jan Hansen Ekspert
25. september 2017 - 18:14 #9
ind sæt mellem 2. og 3. sidste linie

If target.value<0 or target.value>100 then
      Msgbox "Du har tastet et tal mindre end 0 eller større end 100, Tast noget andet"
      Target.value=""
end if
Avatar billede Nervatos Seniormester
25. september 2017 - 18:18 #10
Kan man få den til at skrive 100, hvis man har skrevet 100 eller derover i stedet for en msgbox?
Avatar billede Jan Hansen Ekspert
25. september 2017 - 18:51 #11
If target.value<0  then
      Msgbox "Du har tastet et tal mindre end 0. Tast noget andet!!"
      Target.value=""
end if
if target.value>100 then target.value=100
Avatar billede Nervatos Seniormester
25. september 2017 - 19:46 #12
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Dim lCount As Long, sString As String
    Application.EnableEvents = False
    For Each cell In Target
    On Error GoTo MyEnd
        If Not Application.Intersect(cell, Range("A1:D5")) Is Nothing Then
        If Left(Target.Formula, 1) = "=" Then Exit For
          For lCount = 1 To Len(Target)
                  If IsNumeric(Mid(Target.Value, lCount, 1)) Then sString = sString & Mid(Target.Value, lCount, 1)
          Next
          Target.Value = sString
          If Not IsNumeric(cell.Value) Then
              cell.Value = vbNullString
          End If
        End If
    Next cell
   
    If Not Application.Intersect(Target, Range("C2:C25")) Is Nothing Then
        If Target.Value > 100 Then Target.Value = 100
    End If
   
    Application.EnableEvents = True
On Error GoTo 0
MyEnd:
End Sub


Blev enig med mig selv, det kun skal være over 100.
Desuden, hvis cellen er formateret til procent - så virker det slet ikke. Kan man trylle her? Det er i min C række som er procent.
Er det ellers rigtigt, det som jeg forsøger på?
Avatar billede Jan Hansen Ekspert
25. september 2017 - 20:21 #13
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Dim lCount As Long, sString As String
    Application.EnableEvents = False
       
    If Not Application.Intersect(Target, Range("C2:C25")) Is Nothing Then
        If Target.Value > 100 Then Target.Value = 100
        goto MyEnd
    End If
   
    For Each cell In Target
    On Error GoTo MyEnd
        If Not Application.Intersect(cell, Range("A1:D5")) Is Nothing Then
        If Left(Target.Formula, 1) = "=" Then Exit For
          For lCount = 1 To Len(Target)
                  If IsNumeric(Mid(Target.Value, lCount, 1)) Then sString = sString & Mid(Target.Value, lCount, 1)
          Next
          Target.Value = sString
          If Not IsNumeric(cell.Value) Then
              cell.Value = vbNullString
          End If
        End If
    Next cell

    Application.EnableEvents = True
On Error GoTo 0
MyEnd:
End Sub

prøv denne jeg har flyttet testen af C? så man kan ryge til slut før anden test
Avatar billede Nervatos Seniormester
25. september 2017 - 20:35 #14
Det er ligesom om, at jeg skal lukke excel ned hver gang der sker en fejl - før VBA koden virker igen. Kan det være rigtigt, eller er der noget alternativt så det virker?

Lige nu, hvis cellen er formateret til procent, så virker det ikke. Kan man gøre, så koden selv tilføjer % efter tallet i stedet for formatering til procent? Ellers så virker rimeligt, det eneste er bare, hvis man sætter - (minus) foran tallet, så skriver den stadig tallet. Hvor i det andet VBA kode, der fjernede den bare - (minus) og skrev det tal.
Avatar billede Jan Hansen Ekspert
26. september 2017 - 18:49 #15
Endelig løsning


Private Sub Worksheet_Change(ByVal Target As Range)
    Test Target, Range("A2:B25") ' Kolonner før C
    Test Target, Range("E2:F25") ' kolonner efter C
    If Not Intersect(Target, Range("C2:C25")) Is Nothing Then ' Formater c til procent
        If Target.Value > 1 Then Target.Value = 1
    End If
End Sub

Private Sub Test(ByVal Target As Range, ByVal rRange As Range)
    Dim sString As String, dTal As Double, Icount As Integer
    If Not Intersect(Target, rRange) Is Nothing Then
        sString = Target.Text
        For Icount = 1 To Len(sString)
            If IsNumeric(Mid(sString, Icount, 1)) Then
                sString = Mid(sString, Icount, Len(sString) - Icount + 1)
                Exit For
            End If
        Next
        dTal = Val(sString)
        If Not Target.Value = dTal Then Target.Value = dTal
    End If

End Sub


Jan
Avatar billede Nervatos Seniormester
26. september 2017 - 19:05 #16
Takker for hjælpen Jan, endnu engang er du dagens mand i skysovs :o).
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

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