Avatar billede sus82 Nybegynder
15. august 2011 - 13:38 Der er 19 kommentarer og
1 løsning

Start makro når celle ændres

Hej alle

Jeg ønsker at sætte makro4 igang når celle BQ23 skifter fra ikke at have noget indhold til at have et tal i sig. Jeg har fundet frem til følgende kode, hvor der bare ikke sker noget:

Private Sub Worksheet_Change1(ByVal Target As Range)
  If Target.Range("bq23") <> "" Then Makro4
  End If
 
End Sub

Den skulle da være ret ligetil..

Hilsen Sus
Avatar billede natkatten Mester
15. august 2011 - 14:06 #1
Prøv med:

Private Sub Worksheet_Change(ByVal Target As Range)
If Range("$BQ$23").Value <> "" Then
[Udfør din makro]
End If
End Sub
Avatar billede sus82 Nybegynder
15. august 2011 - 14:19 #2
Hej natkatten

Der sker ikke noget. Jeg fik først en besked om "Ambiguous name",
og skiftede derfor navn til:

Private Sub Worksheet_Change1(ByVal Target As Range)

Altså med 1 efter change. Jeg har nemlig en anden Private sub Worksheet change procedure ovenover. Ved ikke om det har nogen betydning, men der var ingen protester, men altså heller ingen handling.
Avatar billede supertekst Ekspert
15. august 2011 - 14:33 #3
Prøv at vise den "første" Worksheet_Change med kode.
Avatar billede sus82 Nybegynder
15. august 2011 - 14:38 #4
Hej supertekst
Her er første kode:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
  Dim DoSendSMS As Boolean
    Dim besked As String
    Dim result As String
    DoSendSMS = False
    For Each c In Application.Names("WatchArea").RefersToRange.Cells
        If c <> "" Then
            DoSendSMS = True
            besked = besked & c.Text & " "
        End If
    Next
    If DoSendSMS Then
        For Each c In Application.Names("Specialtegn").RefersToRange.Cells
            besked = Replace(besked, c.Value, c.Offset(0, 1).Value)
        Next
        besked = Replace(besked, Chr(10), "%0A%0D") 'Håndtering af linjeskift
         
        If Len(besked) > 459 Then
          ' MsgBox "Besked for lang " & Len(besked) & vbCrLf & besked
            besked = "For mange data til, at de kunne sendes"
        End If
        'result = sendSMS(Application.Names("SendFra").RefersToRange.Value, Application.Names("SendTil").RefersToRange.Value, besked)
    End If
End Sub
Avatar billede jkrons Professor
15. august 2011 - 14:49 #5
Du kan kun have en Worksheet_Change i arket. Du er derfor nødt til at skrive koden sammen.
Avatar billede supertekst Ekspert
15. august 2011 - 14:51 #6
Måske kan dette bruges:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
  Dim DoSendSMS As Boolean
    Dim besked As String
    Dim result As String
    DoSendSMS = False
   
    If Target.Address = "$BQ$23" And IsNumeric(Target.Value) = True Then
        testMakro
    Else
        For Each c In Application.Names("WatchArea").RefersToRange.Cells
            If c <> "" Then
                DoSendSMS = True
                besked = besked & c.Text & " "
            End If
        Next
        If DoSendSMS Then
            For Each c In Application.Names("Specialtegn").RefersToRange.Cells
                besked = Replace(besked, c.Value, c.Offset(0, 1).Value)
            Next
            besked = Replace(besked, Chr(10), "%0A%0D") 'Håndtering af linjeskift
             
            If Len(besked) > 459 Then
              ' MsgBox "Besked for lang " & Len(besked) & vbCrLf & besked
                besked = "For mange data til, at de kunne sendes"
            End If
            'result = sendSMS(Application.Names("SendFra").RefersToRange.Value, Application.Names("SendTil").RefersToRange.Value, besked)
        End If
    End If
End Sub
Private Sub testMakro()
    MsgBox "BQ23 indeholder nu et tal"
End Sub
Avatar billede sus82 Nybegynder
15. august 2011 - 14:59 #7
Hej jkrons

Jeg har flettet koden ind i bunden af den første Worksheet_Change
Men der sker stadig ikke noget. Hvordan vil du skrive den sammen?

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
  Dim DoSendSMS As Boolean
    Dim besked As String
    Dim result As String
    DoSendSMS = False
    For Each c In Application.Names("WatchArea").RefersToRange.Cells
        If c <> "" Then
            DoSendSMS = True
            besked = besked & c.Text & " "
        End If
    Next
    If DoSendSMS Then
        For Each c In Application.Names("Specialtegn").RefersToRange.Cells
            besked = Replace(besked, c.Value, c.Offset(0, 1).Value)
        Next
        besked = Replace(besked, Chr(10), "%0A%0D") 'Håndtering af linjeskift
         
        If Len(besked) > 459 Then
          ' MsgBox "Besked for lang " & Len(besked) & vbCrLf & besked
            besked = "For mange data til, at de kunne sendes"
        End If
        'result = sendSMS(Application.Names("SendFra").RefersToRange.Value, Application.Names("SendTil").RefersToRange.Value, besked)
     
        If Range("$BQ$23").Value <> "" Then
Makro4
End If
   
    End If
End Sub
Avatar billede sus82 Nybegynder
15. august 2011 - 15:07 #8
Til supertekst

Du har også flettet de to koder ( der intet har med hinanden at gøre), sammen. Jeg ser du bruger "Else". Betyder det så ikke at hvis udsagnet er sandt så udføres makro4, men ikke den "første", worksheet change kode?
Avatar billede supertekst Ekspert
15. august 2011 - 15:17 #9
Ja..
Avatar billede sus82 Nybegynder
15. august 2011 - 15:20 #10
Det er jo ikke så godt. De skal virke begge to.
Avatar billede supertekst Ekspert
15. august 2011 - 15:30 #11
Er dette bedre?

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
  Dim DoSendSMS As Boolean
    Dim besked As String
    Dim result As String
    DoSendSMS = False
   
    If Target.Address = "$BQ$23" And IsNumeric(Target.Value) = True Then
        testMakro
    End If
   
    For Each c In Application.Names("WatchArea").RefersToRange.Cells
        If c <> "" Then
            DoSendSMS = True
            besked = besked & c.Text & " "
        End If
    Next
    If DoSendSMS Then
        For Each c In Application.Names("Specialtegn").RefersToRange.Cells
            besked = Replace(besked, c.Value, c.Offset(0, 1).Value)
        Next
        besked = Replace(besked, Chr(10), "%0A%0D") 'Håndtering af linjeskift
         
        If Len(besked) > 459 Then
          ' MsgBox "Besked for lang " & Len(besked) & vbCrLf & besked
            besked = "For mange data til, at de kunne sendes"
        End If
        'result = sendSMS(Application.Names("SendFra").RefersToRange.Value, Application.Names("SendTil").RefersToRange.Value, besked)
    End If
End Sub
Private Sub testMakro()
    MsgBox "BQ23 indeholder nu et tal"
End Sub
Avatar billede sus82 Nybegynder
15. august 2011 - 15:30 #12
Til supertekst

Ok, man kan selvfølgelig sige, at først bliver den ene udført, og derefter den anden. jeg har derfor erstatter den gamle kode med din, men stadig ingen handling.
Avatar billede supertekst Ekspert
15. august 2011 - 15:30 #13
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
  Dim DoSendSMS As Boolean
    Dim besked As String
    Dim result As String
    DoSendSMS = False
   
    If Target.Address = "$BQ$23" And IsNumeric(Target.Value) = True Then
        testMakro
    End If
   
    For Each c In Application.Names("WatchArea").RefersToRange.Cells
        If c <> "" Then
            DoSendSMS = True
            besked = besked & c.Text & " "
        End If
    Next
    If DoSendSMS Then
        For Each c In Application.Names("Specialtegn").RefersToRange.Cells
            besked = Replace(besked, c.Value, c.Offset(0, 1).Value)
        Next
        besked = Replace(besked, Chr(10), "%0A%0D") 'Håndtering af linjeskift
         
        If Len(besked) > 459 Then
          ' MsgBox "Besked for lang " & Len(besked) & vbCrLf & besked
            besked = "For mange data til, at de kunne sendes"
        End If
        'result = sendSMS(Application.Names("SendFra").RefersToRange.Value, Application.Names("SendTil").RefersToRange.Value, besked)
    End If
End Sub
Private Sub testMakro()
    MsgBox "BQ23 indeholder nu et tal"
End Sub
Avatar billede supertekst Ekspert
15. august 2011 - 15:31 #14
se venligst bort fra #13..
Avatar billede supertekst Ekspert
15. august 2011 - 15:38 #15
Denne udgave skulle virke - din egen koden med en lille ændring:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
  Dim DoSendSMS As Boolean
    Dim besked As String
    Dim result As String
    DoSendSMS = False
    For Each c In Application.Names("WatchArea").RefersToRange.Cells
        If c <> "" Then
            DoSendSMS = True
            besked = besked & c.Text & " "
        End If
    Next
    If DoSendSMS Then
        For Each c In Application.Names("Specialtegn").RefersToRange.Cells
            besked = Replace(besked, c.Value, c.Offset(0, 1).Value)
        Next
        besked = Replace(besked, Chr(10), "%0A%0D") 'Håndtering af linjeskift
         
        If Len(besked) > 459 Then
          ' MsgBox "Besked for lang " & Len(besked) & vbCrLf & besked
            besked = "For mange data til, at de kunne sendes"
        End If
        'result = sendSMS(Application.Names("SendFra").RefersToRange.Value, Application.Names("SendTil").RefersToRange.Value, besked)
    End If          '<----------- flyttet
     
    If Range("$BQ$23").Value <> "" Then
      Makro4
    End If
End Sub
Avatar billede sus82 Nybegynder
15. august 2011 - 16:01 #16
Yes, den virker.

Nu har jeg lige opdaget et andet problem.
Det skal faktisk ikke kun være celle BQ23, der skal indeholde tal for at makroen går igang. Hvis tal forekommer i en eller flere af cellerne BQ23:BQ43 skal eksekution forekomme.
Jeg har derfor ændret til:

If Range("BQ23:BQ43").Value <> ""

Både med og uden $ tegn, begge gange får jeg "type mismatch".
Avatar billede supertekst Ekspert
15. august 2011 - 16:13 #17
Prøv med:

If Left(Target.Address, 3) = "$BQ" And Target.Row >= 23 And Target.Row <= 43 Then
Avatar billede sus82 Nybegynder
15. august 2011 - 16:20 #18
Jeg har ændret til, uden reaktion (men uden "Mismatch"):

If Left(Target.Address, 3) = "$BQ" And Target.Row >= 23 And Target.Row <= 43 Then
   
      Makro4
    End If
End Sub

Alle andre celler end BQ25 er tomme, og så virker den ikke.
Avatar billede sus82 Nybegynder
15. august 2011 - 17:35 #19
Hej supertekst

Jeg fandt en alternativ løsning til det sidste problem. Rigtig mange tak for hjælpen.

Hilsen Sus
Avatar billede supertekst Ekspert
15. august 2011 - 17:42 #20
Fint og selv tak..
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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