Fråga en expert
Hur tvinga man användaren att mata in ett värde.

Frågan: Hur hindrar man att användaren flyttar markören från en cell utan att ha matat in något värde?

Svar: När markören flyttas till en ny cell aktiveras händelse 'Worksheet_SelectionChange'. Problemet då är att man inte vet vilken cell markören befann sig i innan. Genom att i händelsen alltid spara den aktuella cellens namn i en global variabel kan man vid varje aktivering kontrollera den föregående cellens innehåll.

Ovanstående metod fungerar för alla sätt att förflytta markören förutom den första därför att den globala variabeln inte har ett värde innan den första förflyttningen ha skett. Enklast är att kontrollera den första obligatoriska cellens innehåll när den globala variabeln inte har något värde.

När man väl upptäckt att den förgående cellen saknar ett värde bör man upplysa användaren om detta innan markören flyttas tillbaka till cellen.

När markören flyttas tillbaka kommer händelsen att aktiveras på nytt och då skulle en evighetsslinga skapas. Detta löser man genom att kontrollera om cellen man ska flytta markören till är lika med cellen som aktiverade händelsen.

Kod exempel:

Option Explicit
' Skapa en global variabel för cellen med fokus.
Public FranCell As String

Private Sub Worksheet_SelectionChange(ByVal TillCell As Range) Dim CellNamn As String ' Vid den första förflyttningen har FranCell inget innehåll. If FranCell = "" Then ' Initialisera FranCell med namnet på den första cellen som måste fyllas i ' Det är snyggast att då spara arbetsboken med denna cell i fokus FranCell = "$A$1" End If ' Om cellen som tappar fokus saknar ett värde. ' *** OBS fungerar inte för flera celler som sammanfogats If IsEmpty(Worksheets("Blad1").Range(FranCell).Value) Then ' När fokus flyttas tillbaka till cellen man försöker lämna ' aktiveras denna subrutin för en andra gång ' men då är FranCell och subrutinens parameter lika. ' Är det är första gången. If FranCell <> TillCell.Address Then ' Ge CellNamn ett värde beroende på värdet i FranCell Select Case FranCell Case "$A$1" CellNamn = "Obligatorisk Cell 1" Case "$B$1" CellNamn = "Obligatorisk Cell 2" Case Else ' Celler som inte räknats upp får inget namn CellNamn = "" End Select ' Inmatning tvingas endast för celler som namngivits ovan If CellNamn <> "" Then
MsgBox CellNamn & " måste ifyllas", _
             vbExclamation, _
                "Cellvärde saknas" ' Flytta fokus tillbaka till den aktuella cellen.             Range(FranCell).Activate ' Eftersom förflyttning inte sker avbryts subrutinen direkt ' så att FranCell behåller sitt värde.             Exit Sub End If End If End If ' Kom ihåg cellen som nu har fokus. FranCell = TillCell.Address End Sub

koden ovan förutses finnas på kodsidan till bladet med namn 'Blad1'.