Just nu i M3-nätverket
Jump to content

Loopa igenom ett formulär - felkod 13


Shape_sthlm

Recommended Posts

Shape_sthlm

(detta är i Access) Jag vill kontrollera ifall det finns några tomma fält i ett formulär. För att testa mig fram så börjar jag med att försöka loopa igenom det öppna formuläret.

 

Dim tb As TextBox

For Each tb In Me.Controls
MsgBox tb.Name & "-" & Nz(tb.Value, "tom")
Next tb

 

Första checken fungerar, sedan får jag felkod 13 - Inkompatibla typer. Även testat med For Each tb In Me.Form men samma sak.

 

Behöver lite hjälp för att komma vidare känner jag, tack på förhand.

 

 

 

/M

Link to comment
Share on other sites

Shape_sthlm

Antar att det fält som det smäller på inte är någon text-typ utan ett numeriskt fält?

 

Märkte rätt snart att det blev fel för de kontroller som inte var textbox. Så nu har jag fått till det med en select-sats och det verkar fungera bra så här långt.

 

Dim ct As Control

For Each ct In Me.Controls
   Select Case TypeName(ct)
       Case Is = "TextBox"
       MsgBox ct.Name & "-" & Nz(ct.Value, "tom")
       Case Else
   End Select
Next ct

 

Nu skulle jag vilja att enbart en Msgboxen visar namnen på alla de textboxar som är null eller "". Alltså på nått sätt lagra de värden som uppfyller villkoren, och sedan presentera dessa i en msgbox istället för att få upp en för varje.

 

 

/M

Link to comment
Share on other sites

Kan du inte bygga en sträng i loopen, typ:

strMessage = strMessage & ct.Name & vbCrLf (istället för att skicka upp en MsgBox).

När du loopat färdigt kollar du om strMessage inte är tom och i så fall så skickar du upp en MsgBox med strMessage

Link to comment
Share on other sites

Shape_sthlm

Kan du inte bygga en sträng i loopen, typ:

strMessage = strMessage & ct.Name & vbCrLf (istället för att skicka upp en MsgBox).

När du loopat färdigt kollar du om strMessage inte är tom och i så fall så skickar du upp en MsgBox med strMessage

 

Jo detta fungerar bra. tack för förslaget Cluster!

 

Dock stöter jag på problem igen. Behöver utvidga till att även loopa efter tomma comboboxar, men eftersom ct nu deklareras som Controls, så fungerar inte ct.Value.

 

Kortfattat, hur gör jag för att se ifall ct är tom, om ct är en combobox?

 

 

/M

Link to comment
Share on other sites

vad får du ut av ct.ControlSource respektive ct.Text ?

 

Edit:

Hittade detta, men sitter inte så att jag kan testa det:

If Me.cboName.ListIndex = -1 Then
' Do stuff
End If

Link to comment
Share on other sites

Shape_sthlm

vad får du ut av ct.ControlSource respektive ct.Text ?

 

 

saken är ju att även Etiketter trillar in i loopen, och dessa har varken kontrolkälla eller värden. verkar svårt att hantera.

 

koden nedan borde ju sortera bort dessa, men IF-satsen fullföljs som om villkoren vore uppfyllda.

 

If ct.ControlType = acTextBox Or acComboBox Then

Link to comment
Share on other sites

Shape_sthlm

Äntligen klar! Blev till att använda en funktion. Och denna kan jag nu använda på alla formulär, vilket med facit i hand gör den väldigt användbar. Tack för alla ideer!! :thumbsup:

 

Funktionen anropar jag med

 

strValid = CheckFormValues(Me)

If strValid <> vbNullString Then Exit Sub

 

Public Function CheckFormValues(frmCheck As Form) As String
'använder namnet på det formulär som är ÖPPET
'om inga fel hittas blir resultatet vbNullString
'Visar namnet på den kontroll som ej fyllts i (är tom). Obs att koden inte avbryts här utan fortsätter. 
'Koden loopar igenom alla kontroller och visar ett meddelande med samtliga tomma fält.
Dim ct As Control
Dim lngCtCount As Long
Dim lngX As Long
Dim strMessage As String

CheckFormValues = vbNullString
For Each ct In frmCheck.Controls
   With ct
               lngX = .ControlType
               If Nz(Switch(lngX = acTextBox, True, _
               lngX = acComboBox, True, _
               lngX = acListBox, True, _
               lngX = acOptionGroup, True, _
               lngX = acCheckBox, True) _
               , False) Then
                   If Nz(.Value, vbNullString) = vbNullString Then
                   CheckFormValues = .Name
                   ' Select-satsen ignorerar några fält.
                       Select Case ct.Name
                                  Case Is = "tbxRetur" 'ok ifall tom

                                  Case Is = "tbxInt" 'ok ifall tom

                                  Case Else
                                  strMessage = strMessage & CheckFormValues & vbCrLf
                       End Select
                   'Exit For. aktivera denna om endast ett fält behöver visas åt gången.
                   End If
               End If

   End With
Next ct
' visa vilka uppgifter som måste anges (samtliga tomma fält)
If strMessage <> "" Then MsgBox "Följande fält måste fyllas i för att kunna slutföra processen. " & vbCrLf & vbCrLf & strMessage, vbOKOnly, "Uppgifter saknas"
End Function

 

 

/M

Link to comment
Share on other sites

Archived

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



×
×
  • Create New...