# Userform zur Abfrage eines Auswertungsbogens in Excel



## Jako (29. September 2010)

Hallo,
VBA ist nicht wirklich mein Ding. Habe nur ab und zu Kleinigkeiten damit gemacht. Meine Vorstellung wäre, eine Umfrage mittels Excel zur Nutzung von EDV zu erstellen. Die Nutzer sollen dabei nicht die Zellen direkt anklicken, sonder über ein Userform geleitet werden. Eine ComboBox in der Userform enthält die Werte aus der Tabelle Spalte B (hab ich hinbekommen - aber Leerzeilen sind noch drin!). Bei Auswahl des entsprechenden Eintrages springt die Maus in die Zelle mit dem entsprechenden Wert in Spalte B. Dann kann der Nutzer über Optionsfelder in der Userform angeben, ob vorhanden, nicht vorhanden und falls nicht vorhanden, ob gewünscht. Diese Werte werden entsprechend hinter den Eintrag in Spalte C, D und E hinterlegt. Am liebsten wäre mir sogar, wenn ich statt Text Kontrollkästchen für ein "Ja" hinterlegen aktivieren könnte. Ebenso soll der Nutzer nach Häufigkeit der Nutzung abgefragt werden, wenn die EDV vorhanden oder gewünscht.
Die Datei hänge ich mal eben an.


----------



## tombe (29. September 2010)

Keine Ahnung wie deine Lösung bis jetzt aussieht. Ich habe mal was in Excel 2000 versucht:


```
Private Sub Button_Click()
If Liste.ListIndex = -1 Then
    MsgBox "Kein Eintrag ausgewählt", vbOKOnly, "Fehler"
    Exit Sub
End If

zeile% = Liste.ListIndex + 2

Cells(zeile%, 2) = IIf(opVorhanden.Value = True, "Ja", "Nein")
Cells(zeile%, 3) = IIf(opNichtVorhanden.Value = True, "Ja", "Nein")
Cells(zeile%, 4) = IIf(opErwünscht.Value = True, "Ja", "Nein")
End Sub

Private Sub UserForm_Activate()
zeile% = 2
Do While Cells(zeile%, 1) <> ""
    Liste.AddItem Cells(zeile%, 1)
    zeile% = zeile% + 1
Loop
End Sub
```

Die UserForm hat ein Listenfeld mit Name "Liste", Optionsbuttons mit Namen "opVorhanden"; "opNichtVorhanden" und "opErwünscht" und einen Button mit dem Namen "Button"

Wird auf den Button geklickt, wird zuerst geprüft ob überhaupt etwas ausgewählt wurde und wenn ja werden die Werte der Optionsbutton mit Hilfe der IIF-Funktion in "Ja" oder "Nein" umgewandelt und in die entsprechende Zellen eingetragen.


----------



## Jako (1. Oktober 2010)

Vielen Dank für die Hilfe.
Habe allerdings zum Füllen der Listbox einen anderen Code verwendet. Mit deinem wurden nur die ersten Zeilen meiner Liste gefüllt. Oder ich habe was vergessen.

Habe jetzt aber das Problem, dadurch, dass die Leerzeilen nicht geladen werden, die Werte der Optionsfelder in die falschen Zeilen geschrieben werden. Wie bekomme ich das raus? 

Gibt es weiterhin eine Möglichkeit, dass der Nutzer des Formulars gleich mehrere Listbox-Einträge mit einem Mal erfassen kann? Dazu müßte allerdings der Wert, der in den Optionsfeldern angeklickt wird zu jedem Indexeintrag sofort hinterlegt werden, noch bevor der Nutzer auf "Auswahl speichern" klickt. Die Optionsfelder müßten demnach von Auswahl zu Auswahl der Listbox wieder geleert und mit jedem neu gewählten Eintrag neu befüllt werden. Gut wäre auch, wenn bereits bearbeitete Einträge markiert wären damit der Nutzer sieht, welche er schon befüllt hat. Kriegt man so was hin oder ist das zu umständlich?


```
Private Sub ButtonHardware_Click()
'Prüft ab, ob ein Feld in der ListeHardware gewählt wurde, sonst Fehlermeldung

If ListeHardware.ListIndex = -1 Then
    MsgBox "Kein Eintrag ausgewählt", vbOKOnly, "Fehler"
    Exit Sub
End If
 
'Schreibt die Werte der Optionsbutton in die entsprechenden Zellen hinter der Hardwareauswahl
 
Zeile% = ListeHardware.ListIndex + 11
 
Tabelle4.Cells(Zeile%, 2) = IIf(opVorhanden.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 3) = IIf(opErwünscht.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 6) = IIf(opTäglich.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 8) = IIf(opWöchentlich.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 10) = IIf(opMonatlich.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 12) = IIf(opHalbjährlich.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 14) = IIf(opNie.Value = True, "Ja", "Nein")


End Sub
```


```
Private Sub UserForm_Initialize()
Dim Zeile As Long
opVorhanden.GroupName = "Vorhanden"
opErwünscht.GroupName = "Vorhanden"
opVorhandenSoft.GroupName = "VorhandenSoft"
opErwünschtSoft.GroupName = "VorhandenSoft"

'Füllt die Harwareliste

With ListeHardware
    .MultiSelect = fmMultiSelectExtended
    .ListStyle = fmListStyleOption
    End With
For Zeile = 11 To 48
    If Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1) <> "" Then _
    ListeHardware.AddItem Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1)
Next

'Füllt die Softwareliste

With ListeSoftware
    .MultiSelect = fmMultiSelectExtended
    .ListStyle = fmListStyleOption
    End With
For Zeile = 52 To 78
    If Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1) <> "" Then _
    ListeSoftware.AddItem Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1)
Next

End Sub
```


----------



## tombe (1. Oktober 2010)

> Habe jetzt aber das Problem, dadurch, dass die Leerzeilen nicht geladen werden, die Werte der Optionsfelder in die falschen Zeilen geschrieben werden. Wie bekomme ich das raus?



Erstelle eine zweite Spalte in der Liste und trage hier beim Einlesen der Werte die jeweilige Zeilennummer der Tabelle ein.


```
If Cells(a%, 1) <> "" Then
    With ListBox1
        .AddItem Cells(a%, 1)
        .Column(1, b%) = a%
    End With
    b% = b% + 1
End If
```

Im Beispiel wird einfach wieder mit einer Schleife die Tabelle durchlaufen und die Werte in die Liste eingetragen. a% ist der "Zeilenzähler", b% zählt die Einträge in der Liste.

Bestimmte Einträge farbig oder sonst wie zu markieren ist meines Wissens nach nicht möglich.
Eine Lösung um gleich mehrere Werte mit einem Klick zu übernehmen fällt mir gerade auch nicht ein. Halte es aber auch nicht unbedingt für gut. Da könnte so einiges durcheinander geklickt werden.


----------



## Jako (5. Oktober 2010)

Vielen Dank für deine ausdauerende Hilfe  Also irgendwie stell ich mich ein wenig dämlich an... Soll ich eine zweite Spalte in meiner Excel-Liste erstellen oder nur für meine ListBox? Hatte das so verstanden, dass ich die Excel-Liste erweitern soll. Und wie bastel ich deinen Code nun bei mir rein? Funktioniert bei mir irgendwie nicht. 
Entweder hier? 
	
	
	



```
Private Sub UserForm_Initialize()
Dim Zeile As Long
opVorhanden.GroupName = "Vorhanden"
opErwünscht.GroupName = "Vorhanden"
opVorhandenSoft.GroupName = "VorhandenSoft"
opErwünschtSoft.GroupName = "VorhandenSoft"

'Füllt die Harwareliste
With ListeHardware
    .MultiSelect = fmMultiSelectExtended
    .ListStyle = fmListStyleOption
    End With
For Zeile = 11 To 48
    If Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1) <> "" Then _
    ListeHardware.AddItem Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1)
Next


'Füllt die Softwareliste

With ListeSoftware
    .MultiSelect = fmMultiSelectExtended
    .ListStyle = fmListStyleOption
    End With
For Zeile = 52 To 78
    If Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1) <> "" Then _
    ListeSoftware.AddItem Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1)
Next

End Sub
```

oder hier?

```
Private Sub ButtonHardware_Click()
'Prüft ab, ob ein Feld in der ListeHardware gewählt wurde, sonst Fehlermeldung

If ListeHardware.ListIndex = -1 Then
    MsgBox "Kein Eintrag ausgewählt", vbOKOnly, "Fehler"
    Exit Sub
End If

'Schreibt die Werte der Optionsbutton in die entsprechenden Zellen hinter der Hardwareauswahl
 
Zeile% = ListeHardware.ListIndex + 11
 
Tabelle4.Cells(Zeile%, 3) = IIf(opVorhanden.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 4) = IIf(opErwünscht.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 6) = IIf(opTäglich.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 8) = IIf(opWöchentlich.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 10) = IIf(opMonatlich.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 12) = IIf(opHalbjährlich.Value = True, "Ja", "Nein")
Tabelle4.Cells(Zeile%, 14) = IIf(opNie.Value = True, "Ja", "Nein")


End Sub
```


----------



## tombe (5. Oktober 2010)

Das müsste bei dir der Teil sein wo die Liste gefüllt wird:


```
For Zeile = 11 To 48
    If Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1) <> "" Then _
    ListeHardware.AddItem Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1)
Next
```

Das änderst du dann so mal ab:


```
For Zeile = 11 To 48
    If Sheets("EDV-Mittel-Erfassung").Cells(Zeile, 1) <> "" Then
        With ListeHardware
            .AddItem Sheets("EDV-Mittel-Erfassung").Cells(Zeile,  1)
            .Column(1, b%) = Zeile
        End With
        b% = b% + 1
    End If
Next
```

Beim Listenelement gibt es eine Eigenschaft "ColumnCount", diese steht bei dir auf 1. Hier musst du eine 2 daraus machen. Das meinte ich mit der zweiten Spalte.
Hier wird dann immer die Zeilennummer aus der Tabelle eingetragen.


----------

