Just nu i M3-nätverket
Jump to content

Dataverifiering


Mange78

Recommended Posts

Tjena,

 

Nu har jag lite för er att bita i =)

 

Har skapat en arbetsbok för en avdelning på jobbet.

Tanken är att de skall kunna följa upp hur väl vissa arbetsmoment har utförts.

 

Låt säga att jag i Kolumn A har Planerat startdatum Kolumn B innehåller Planerat Slutdatum och Kolumn C Planerad Snittkostnad.

 

Kolumnerna D,E och F innehåller Verkligt Startdatum, Verkligt Slutdatum samt Snittkostnad Utfall.

 

Om nu någon av dessa "utfallskolumner" visar att man startat senare än tänkt, blir klar senare än tänkt eller att snittkostnaden är högre än planerat, visas detta i dagsläget med att cellen rödmarkeras.

 

Problemet är att jag vill gå ett steg längre och tvinga användaren att i Kolumn G fylla i en kommentar om någon av cellerna jag angivit ovan är "rödmarkerad". Hur sjutton gör jag?

 

Link to comment
Share on other sites

ja du, det behövs nog lite VBA-kod i det här fallet. Frågan är när du ska fånga användarens uppmärksamhet. Är det när inmatningen av ett "felvärde" sker eller ex.v. när användaren försöker byta blad eller spara arbetsboken?

 

Det senare är nog det bättre, att med VBA följa ändringen av enskilda celler värde är inte alltid att rekommendera men är det vad du vill så kan jag ge exempel på det.

 

Har ett alternativ till, tar det sist.

 

Börjar med lite övervakning, öppna VBA-editorn och skapa en modul. I denna klistra in följande:

Function ErrorData() As Boolean
   ErrorData = False
    If Range("kollcell").Value = True And Range("skrivcell") = "" Then
       Range("skrivcell").Parent.Activate
       Range("skrivcell").Select
       MsgBox "Du måste ange ett felvärde!", vbCritical
       ErrorData = True
   End If

End Function

där "kollcell" är en namngiven cell som är SANN om det finns cell där data måste matas in.

Där "skrivcell" är enda cellen jag kontroller, även denna namngiven för enkelhetensskull.

Om cell finns poppas en dialog upp, bladet cellen finns på visas och cellen väljs. Du kan givetvis byta ut MsgBox mot en inputbox, kanske passar bättre.

 

Denna ska då köras vid lämpliga tillfällen, ex.v. då använder byter blad, försöker spara eller stänga arket.

På bladet som ska kontrolleras:

Private Sub Worksheet_Deactivate()
   ErrorData
End Sub

 

På bladet ThisWorkbook:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If ErrorData Then
       Cancel = True
   End If
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 If ErrorData Then
       Cancel = True
   End If
End Sub

 

 

Testa och se hur det fungerar, om det kan vara ett alternativ.

 

Ett annat sätt som dock är "lite" skakigt och kanske inte så lämpligt är att skapa en funktion med lite speciella egenskaper:

Function dummy(rn As Range)

   If rn.Value = True Then
       dummy = InputBox("Japp")
   Else
       dummy = ""
   End If
End Function

där rn är den cell du vill övervaka ( i detta fall en med sant/falskt värde), den cell du skriver funktionen i den där du vill ha felvärdet.

Kopiera in koden i en modul och använd den som en "vanlig" funktion.

Problemet är att inputboxen kan poppa upp flera gånger för samma cell...

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Tjena, Det funkar ju klockrent.

 

Men...

Hur gör jag för att den skall gå igenom alla kolumner? som det är nu kollar den ju bara enskilda celler.

 

Blir inte klok på VBA ibland ;o)

 

Link to comment
Share on other sites

Alla kolumner?

Tja, först skulle jag ha en formel på bladet, eller exekvera en arbetsbladformel i VBA kod som kontrollerar snabbt om någon cell är tom/ska fyllas i. Börja med en formel på bladet som kan vi senare migrera den till VBA.

 

Sedan skulle jag nog även skapa en kolumn jämsides med din tabell som undersöker utfallskolumnerna, en formel som ex.v. returnerar SANT och allt är som det ska och FALSKT annars.

Låt oss säga att i kolumn G har du den sista nämna formeln, att du i G1 har en formel som undersöker om någon annan cell i G är falsk samt din kommentarer i kolumn H. Allt detta på blad1 i din arbetsbok:

 

Function CheckValues() As Boolean
   Dim myCell As Range
   Dim myRn As Range
   Dim c As Range
   Dim firstAddress
   With Worksheets("Blad1")
       If .Range("g1").Value = True Then
           Set myRn = .Range("G2", .Cells(.Range("g:g").Rows.Count, 7).End(xlUp))
           With myRn
               Set c = .Find(What:=False, LookAt:=xlWhole)
               If Not c Is Nothing Then
                   firstAddress = c.Address
                   Do
                       If c.Offset(0, 1) = "" Then

                       Else
                           Set c = .FindNext(c)
                       End If

                   Loop While Not c Is Nothing And c.Address <> firstAddress And c.Offset(0, 1) <> ""
               End If
           End With
           If Not c Is Nothing Then
               If c.Offset(0, 1) = "" Then
                   c.Parent.Activate
                   c.Offset(0, 1).Select
                   MsgBox "ange felvärde", vbCritical
               End If
           End If
       End If
   End With
End Function

tja, förstår du vad den gör?

 

Kan göra lite generisk genom att du delar upp den i två delar och anropar denna med området du vill genomsöka.

 

 

/T

 

Even when we know we´ll never find the answers, we have to keep on asking questions.

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...