VBA OpitonsButton

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: VBA OpitonsButton
von: Nicolai
Geschrieben am: 29.07.2015 12:40:16

Hallo zusammen,
ich stehe vor einem Problem. Ich habe eine Userform mit mehreren OptionButtons.
Angehängtes Makro funktioniert auch, allerdings möchte ich den unteren Code auslagern.


 Dim TextKommentar As String
 Dim AktZeile As Integer
 Dim AktSpalte As Integer
 AktZeile = ActiveCell.Row
 AktSpalte = ActiveCell.Column
 
 Dim wert1 As Double 'Typendeklaration wichtig für dezimale Stundenangaben, z.B. 1,5!
 Dim wert2 As Double
 
 wert1 = ActiveCell.Value
 wert2 = UserForm2.TextBox2.Value
 Kommentartext = UserForm2.TextBox3.Value
akennz = -1
For i = 1 To 32
    If i = 19 Then
        'ignorieren
    ElseIf Controls("OptionButton" & CStr(i)).Value Then
        akennz = i
        TextKommentar = Controls("OptionButton" & CStr(i)).Caption
        
        Exit For
    End If
Next

Diesen Teil möchte ich auslagern:

If akennz = 1 Then
        If ActiveSheet.Cells(AktZeile + 1, AktSpalte).Value = "" Then
                     Cells(AktZeile + 1, AktSpalte).Value = " | " & Format(Date, "DD.MM.") & " - _
 _
 _
 " & Application.UserName & ": " & wert2 & " Stunde(n) " & TextKommentar & Chr(34) &  _
Kommentartext & Chr(34) & "  " & "|" & "  "
          Else
            vorhandener_Kommentar = Cells(AktZeile + 1, AktSpalte).Value
            Cells(AktZeile + 1, AktSpalte).Value = ""
                Cells(AktZeile + 1, AktSpalte).Value = vorhandener_Kommentar & " | " & Format(   _
_
_
Date, "DD.MM.") & " - " & Application.UserName & ": " & wert2 & " Stunde(n) " & TextKommentar &  _
 _
Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
        End If
        
        'Fallunterscheidung für negative Stundenanzahl / Schichtunterscheidung, z.B. -7,5
        If wert1 < 0 Then
            ActiveCell.Value = wert1 + wert2
        Else
            ActiveCell.Value = wert1 - wert2
        End If
        End Sub
   Cells(331, ActiveCell.Column) = Cells(331, ActiveCell.Column) + wert2
     
  End If

Neuer Code:

 If akennz = 1 Then
        
        Call Auswahl
        
    Cells(331, ActiveCell.Column) = Cells(331, ActiveCell.Column) + wert2
     
  End If

In dieser Zeile TextKommentar = Controls("OptionButton" & CStr(i)).Caption bringt er nun bei Controls immer eine Fehlermeldung. "Sub oder Function nicht definiert" Lasse ich die Zeile ganz weg funktioniert es nur im unteren Teil wo ich "TextKommentar" aufrufe schreibt er mir den die Caption des Optionsbutton.

        Sub Auswahl()
        Dim TextKommentar As String
        Dim AktZeile As Integer
        Dim AktSpalte As Integer
        AktZeile = ActiveCell.Row
        AktSpalte = ActiveCell.Column
        Dim wert1 As Double 
        Dim wert2 As Double
        Dim com As Comment
        Dim akennz As Integer
        TextKommentar = Controls("OptionButton" & CStr(i)).Caption
        wert1 = ActiveCell.Value
        wert2 = UserForm2.TextBox2.Value
        Kommentartext = UserForm2.TextBox3.Value
        
        'Kommentar hinzufügen
        If ActiveSheet.Cells(AktZeile + 1, AktSpalte).Value = "" Then
                     Cells(AktZeile + 1, AktSpalte).Value = " | " & Format(Date, "DD.MM.") & " - _
 _
 _
 " & Application.UserName & ": " & wert2 & " Stunde(n) " & TextKommentar & Chr(34) &  _
Kommentartext & Chr(34) & "  " & "|" & "  "
          Else
            vorhandener_Kommentar = Cells(AktZeile + 1, AktSpalte).Value
            Cells(AktZeile + 1, AktSpalte).Value = ""
                Cells(AktZeile + 1, AktSpalte).Value = vorhandener_Kommentar & " | " & Format(   _
_
_
Date, "DD.MM.") & " - " & Application.UserName & ": " & wert2 & " Stunde(n) " & TextKommentar &  _
 _
Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
        End If
        
        'Fallunterscheidung für negative Stundenanzahl / Schichtunterscheidung, z.B. -7,5
        If wert1 < 0 Then
            ActiveCell.Value = wert1 + wert2
        Else
            ActiveCell.Value = wert1 - wert2
        End If
        End Sub

Ich hoffe, ich habe es einigermaßen verständlich geschrieben und mir kann jemand weiterhelfen.
Vielen Dank & Grüße,
Nicolai

Bild

Betrifft: AW: VBA OpitonsButton
von: Daniel
Geschrieben am: 29.07.2015 12:54:40
Hi
wenn du die Steuerelemente einer Userform ansprechen willst und der Code befindet sich nicht im Modul dieser Userform sondern beispielsweise in einem allgemeinen Modul (ausgelager), dann musst du auch immer den Userformnamen vor das Steuerelement setzen
TextKommentar = Userform1.Controls("OptionButton" & CStr(i)).Caption
den allgemeines Modul kennt die Userform ja nicht, ausserdm könnte es sein, dass noch weitere Userforms genöffnet sind, und dann muss ja eindeutig sein, welche du ansprechen willst.
Gruß Daniel

Bild

Betrifft: AW: VBA OpitonsButton
von: Nicolai
Geschrieben am: 29.07.2015 13:19:32
Hallo Daniel,
vielen Dank für deine schnelle Antwort.
ich habe es nun in:

TextKommentar = UserForm2.Controls("OptionButton" & CStr(i)).Caption

angepasst. Leider bringt er nun die Laufzeitfehlermeldung "Das angegebene Objekt konnte nicht gefunden werden"

Bild

Betrifft: AW: VBA OpitonsButton
von: Daniel
Geschrieben am: 29.07.2015 13:28:04
Hi
das könnte daran liegen, dass es in der Userform ein Steuerelement mit diesen Namen: "OptionButton" & CStr(i) gibt.
da ich deine Datei nicht kenne, musst du die korrekte Schreibweise selbst prüfen.
Gruß Daniel

Bild

Betrifft: AW: VBA OpitonsButton
von: Nicolai
Geschrieben am: 29.07.2015 13:36:10
Hi,
ich habe gerade mal alles um das was es jetzt gerade geht in eine separate Datei geworfen um mit dieser besser zu testen.
Ich habe sie mal angehängt. Wäre echt super wenn du sie dir mal anschauen könntest.
http://www.file-upload.net/download-10803232/Test_neu.xlsm.html
Vielen Dank & Grüße,
Nicolai

Bild

Betrifft: AW: VBA OpitonsButton
von: Daniel
Geschrieben am: 29.07.2015 13:39:55
Hi
warum nutzt du nicht den UploadService des Forums?
da gibts keine Wartezeiten, Werbung oder lästige Hinweise auf kostenpflichte Premiumservices.
Gruß Daniel

Bild

Betrifft: AW: VBA OpitonsButton
von: Nicolai
Geschrieben am: 29.07.2015 13:42:10
Hey,
hier kam die Fehlermeldung das die Dateiendung .xlsm nicht gültig ist, sondern nur .xl
Viele Grüße,
Nicolai

Bild

Betrifft: AW: VBA OpitonsButton
von: Daniel
Geschrieben am: 29.07.2015 13:55:18
xlsm kannst du hochladen, nur xlsb geht nicht.
Gruß Daniel

Bild

Betrifft: AW: VBA OpitonsButton
von: Nicolai
Geschrieben am: 29.07.2015 14:03:18
Hallo Daniel,
beim hochladen einer Datei mit der .xlsm Endung, kommt diese Fehlermeldung:
Userbild

Bild

Betrifft: AW: VBA OpitonsButton
von: Daniel
Geschrieben am: 29.07.2015 14:08:05
Hi
im Hinweistext steht auch, dass der Name und Pfad kein Leerzeichen enthalten darf.
hast du das beachtet?
aber ich habs mir inzwischen mal angeschaut.
check einfach mal deine Variablen, ob die überhaupt deklariert sind und welchen Wert sie haben.
da du nur die die drei Optionbuttons Optionbutton1, Optionbutton2 und Optionbutton3 hast, darf i nur 1, 2 oder 3 sein.
Ich dir die Verwendung von Option Explict (nur deklarierte Variablen dürfen verwendet werden)
Gruß Daniel

Bild

Betrifft: AW: VBA OpitonsButton
von: Nicolai
Geschrieben am: 29.07.2015 14:48:36
Hallo Daniel,
sorry, die Hinweise hatte ich überlesen.
Ich habe jetzt nochmal die Variablen gelöscht die ich nicht benötige. Leider finde ich den Fehler trotzdem nicht.
https://www.herber.de/bbs/user/99154.xlsm
Mit Option Explicit habe ich leider noch nicht viel gemacht.
Viele Grüße,

Bild

Betrifft: AW: VBA OpitonsButton
von: Daniel
Geschrieben am: 29.07.2015 14:58:35
Hi
viel wichtiger wäre, dass du dich um die Variablen kümmerst, die du benötigst, und schaust, ddass die einen Wert bekommen.
in der Sub Auswahl verwendest du i in

TextKommentar = UserForm2.Controls("OptionButton" & CStr(i)).Caption

zum ersten mal in diesem Makro und daher hat die Variable i noch keinen Wert.
Dh. du versuchst den Optionbutton "Optionbutton" anzusprechen, weil i keinen Wert hat und diesen Optionbutton gibt es nicht in der Userform.
Welchen Optionbutton möchtest du denn an dieser Stelle auslesen?
zum Thema Option Explicit: http://www.online-excel.de/excel/singsel_vba.php?f=4
Gruß Daniel

Bild

Betrifft: AW: VBA OpitonsButton
von: Nicolai
Geschrieben am: 29.07.2015 15:11:48
Hallo Daniel,
das mit den Option Explicit habe ich mit mittlerweile mal durchgelesen.
Ich möchte im Sub den ausgewählten OptionButton auslesen. Sprich wenn der OptionButton 1 ausgewählt dann soll er mir die Caption des Buttons ausgeben.
Ja genau des versuch ich die ganze Zeit zu lösen, aber ich weiß eben leider nicht wie ich von der Userform an das Sub Auswahl das i mitgeben kann.
Vielen Vielen Dank,
Nicolai

Bild

Betrifft: AW: VBA OpitonsButton
von: Daniel
Geschrieben am: 29.07.2015 15:46:15
Hi
gibt zwei möglichkeiten:
a) gemeinsam genutze Variablen.
diese sog. "globalen" oder "prozedurweit gültigen" Variablen können von allen Makros in der Datei genutzt werden. Sie behalten daher auch ihren Wert, wenn das Makro durchgelaufen ist.
hierzu muss man diese Variablen in einem allgemeinen Modul oberhalb der Makros (unter Option Explicit) mit dem Vorsatz: Public deklarieren:

Option Explicit
Public x as Long

damit kannst du die Variable x in allen Subs verwenden, wenn sie in Sub1 den Wert 99 bekommt, hat sie diesen auch in der danach laufenden Sub2.
b)Parameterübergabe
du kannst auch eine Parameterübergabe bei Subs programmiern (wie bei Functions) das sieht dann in etwa so aus:
Sub1
dim txt as string
txt = Inputbox("Eingabe")
Call Sub2(txt)
End Sub
Sub2(AusgabeText as String)
Msgbox AusgabeText
end Sub
hierbei wird dann der Wert, den du in der Sub1 in die Inputbox eingegben hast, an die Sub2 übergeben und dort weiterverarbeitet.
Gruß Daniel
ps: warum arbeitest du nicht mit einer Listbox anstelle der drei Optionbuttons?
dann kannst den ausgewählten Text einfach mit userform2.Listbox1.Value ermitteln.

Bild

Betrifft: AW: VBA OpitonsButton
von: Nicolai
Geschrieben am: 29.07.2015 16:30:41
Also Variante a finde ich gut.
Ich habe es versucht, allerdings funktioniert es nicht:


Option Explicit
 Public i As Long
Sub Auswahl()
Ich glaube ich steh heute irgendwie auf dem Schlauch, ich probiere morgen mal weiter.
Also ich habe eigentlich 25 Optionbuttons. Mit einer Listbox habe ich noch nicht gearbeitet. Das Makro besteht bereits, aber ich versuche es gerade umzubauen, damit es übersichtlicher und kürzer ist.
Ursprungsmakro (Nur ein Teil):

Private Sub CommandButton1_Click()
Dim index As Long
Dim Mitarbeiter
Dim Tage As Integer
Dim dat As Date
Dim datmon As String
Dim Zeile, spalte As Integer
Dim TextKommentar As String
Dim akennz As Integer
'Dim d2 As UserForm2
akennz = -1
For i = 1 To 32
    If i = 19 Then
        'ignorieren
    ElseIf Controls("OptionButton" & CStr(i)).Value Then
        akennz = i
        TextKommentar = Controls("OptionButton" & CStr(i)).Caption
        Exit For
    End If
Next
If akennz = -1 Then
    Call MsgBox("Bitte Grund für Eintragung auswählen")
    Exit Sub
    End If
 Dim AktZeile As Integer
 Dim AktSpalte As Integer
  AktZeile = ActiveCell.Row
 AktSpalte = ActiveCell.Column
 
 
' If IsNumeric(ActiveCell.Value) = False Then
'  MsgBox ("Falsche Zelle - abbrechen")
'  Exit Sub
' End If
 
If akennz = 29 And TextBox2.Value = "" And Not (ActiveCell.Value = "") Then
 
  
          Dim wert1_29 As Double 'Typendeklaration wichtig für dezimale Stundenangaben, z.B. 1, _
5!
          Dim wert2_29 As Double
          
          'wert1_29 = ActiveCell.Value
          'wert2_29 = UserForm2.TextBox2.Value
          Kommentartext = UserForm2.TextBox3.Value
          
        'Kommentar hinzufügen
        If ActiveSheet.Cells(AktZeile + 1, AktSpalte).Value = "" Then
                     Cells(AktZeile + 1, AktSpalte).Value = " | " & Format(Date, "DD.MM.") & " - _
 " & Application.UserName & ": " & Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
          Else
            vorhandener_Kommentar = Cells(AktZeile + 1, AktSpalte).Value
            Cells(AktZeile + 1, AktSpalte).Value = ""
                Cells(AktZeile + 1, AktSpalte).Value = vorhandener_Kommentar & " | " & Format( _
Date, "DD.MM.") & " - " & Application.UserName & ": " & Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
        
        End If
          
ElseIf akennz = 29 And Not (TextBox2.Value = "") Then
 MsgBox ("ungültiger Wert2")
    Exit Sub
ElseIf IsNumeric(TextBox2.Value) = False Or TextBox2.Value < -50 Or TextBox2.Value > 50 Then
        MsgBox ("ungültiger Wert")
    Exit Sub
ElseIf IsNumeric(ActiveCell.Value) = False Then
  MsgBox ("Falsche Zelle - abbrechen")
  Exit Sub
 
 End If
 
 
 'Arbeitsvorbereitung
 If akennz = 1 Then
        
        Dim wert1_1 As Double 'Typendeklaration wichtig für dezimale Stundenangaben, z.B. 1,5!
        Dim wert2_1 As Double
        Dim com As Comment
        
        wert1_1 = ActiveCell.Value
        wert2_1 = UserForm2.TextBox2.Value
        Kommentartext = UserForm2.TextBox3.Value
        
        'Kommentar hinzufügen
        If ActiveSheet.Cells(AktZeile + 1, AktSpalte).Value = "" Then
                     Cells(AktZeile + 1, AktSpalte).Value = " | " & Format(Date, "DD.MM.") & " - _
 " & Application.UserName & ": " & wert2_1 & " Stunde(n) " & TextKommentar & Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
          Else
            vorhandener_Kommentar = Cells(AktZeile + 1, AktSpalte).Value
            Cells(AktZeile + 1, AktSpalte).Value = ""
                Cells(AktZeile + 1, AktSpalte).Value = vorhandener_Kommentar & " | " & Format( _
Date, "DD.MM.") & " - " & Application.UserName & ": " & wert2_1 & " Stunde(n) " & TextKommentar & Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
        End If
        
        'Fallunterscheidung für negative Stundenanzahl / Schichtunterscheidung, z.B. -7,5
        If wert1_1 < 0 Then
            ActiveCell.Value = wert1_1 + wert2_1
        Else
            ActiveCell.Value = wert1_1 - wert2_1
        End If
        
        'Eintrag der Stunden ins Konto Arbeitsvorbereitung
                Cells(610, ActiveCell.Column) = Cells(610, ActiveCell.Column) + wert2_1
     
  End If
      
      
   'Besprechung
   
  If akennz = 2 Then
          Dim wert1_2 As Double 'Typendeklaration wichtig für dezimale Stundenangaben, z.B. 1,5! _
          Dim wert2_2 As Double
          
          wert1_2 = ActiveCell.Value
          wert2_2 = UserForm2.TextBox2.Value
          Kommentartext = UserForm2.TextBox3.Value
          
        'Kommentar hinzufügen
        If ActiveSheet.Cells(AktZeile + 1, AktSpalte).Value = "" Then
                     Cells(AktZeile + 1, AktSpalte).Value = " | " & Format(Date, "DD.MM.") & " - _
 " & Application.UserName & ": " & wert2_2 & " Stunde(n) Besprechung " & Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
          Else
            vorhandener_Kommentar = Cells(AktZeile + 1, AktSpalte).Value
            Cells(AktZeile + 1, AktSpalte).Value = ""
                Cells(AktZeile + 1, AktSpalte).Value = vorhandener_Kommentar & " | " & Format( _
Date, "DD.MM.") & " - " & Application.UserName & ": " & wert2_2 & " Stunde(n) Besprechung " & Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
        End If
          
          'Fallunterscheidung für negative Stundenanzahl / Schichtunterscheidung, z.B. -7,5
          If wert1_2 < 0 Then
              ActiveCell.Value = wert1_2 + wert2_2
          Else
              ActiveCell.Value = wert1_2 - wert2_2
          End If
          
          'Eintrag der Stunden ins Konto Besprechung
                Cells(611, ActiveCell.Column) = Cells(611, ActiveCell.Column) + wert2_2
  End If
  
  'Einarbeitung
  If akennz = 3 Then
          Dim wert1_3 As Double 'Typendeklaration wichtig für dezimale Stundenangaben, z.B. 1,5! _
          Dim wert2_3 As Double
          
          wert1_3 = ActiveCell.Value
          wert2_3 = UserForm2.TextBox2.Value
          Kommentartext = UserForm2.TextBox3.Value
          
                  'Kommentar hinzufügen
        If ActiveSheet.Cells(AktZeile + 1, AktSpalte).Value = "" Then
                     Cells(AktZeile + 1, AktSpalte).Value = " | " & Format(Date, "DD.MM.") & " - _
 " & Application.UserName & ": " & wert2_3 & " Stunde(n) Einarbeitung " & Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
          Else
            vorhandener_Kommentar = Cells(AktZeile + 1, AktSpalte).Value
            Cells(AktZeile + 1, AktSpalte).Value = ""
                Cells(AktZeile + 1, AktSpalte).Value = vorhandener_Kommentar & " | " & Format( _
Date, "DD.MM.") & " - " & Application.UserName & ": " & wert2_3 & " Stunde(n) Einarbeitung " & Chr(34) & Kommentartext & Chr(34) & "  " & "|" & "  "
        End If
          
          'Fallunterscheidung für negative Stundenanzahl / Schichtunterscheidung, z.B. -7,5
          If wert1_3 < 0 Then
              ActiveCell.Value = wert1_3 + wert2_3
          Else
              ActiveCell.Value = wert1_3 - wert2_3
          End If
          
          'Eintrag der Stunden ins Konto Einarbeitung
                Cells(612, ActiveCell.Column) = Cells(612, ActiveCell.Column) + wert2_3
  End If
Ich bin offen für neues und Hilfreiche Tipps, bin noch im Lernprozess.
VG und Danke Nicolai


Bild

Betrifft: AW: VBA OpitonsButton
von: Daniel
Geschrieben am: 29.07.2015 16:37:49
Hi
jetzt musst du prüfen, welchen Wert du i gegeben hast, bevor du das Makro Auswahl aufrufst.
Gruß Daniel

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Erweiterte Dateiinfo von Docx auslesen unter Excel"