tutorials.de Buch-Aktion 05/2012
Like Tree5Danke
  • 1 Beitrag von DrSoong
  • 1 Beitrag von DrSoong
  • 1 Beitrag von DrSoong
  • 1 Beitrag von DrSoong
  • 1 Beitrag von DrSoong
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
3449
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von waswiewo
    waswiewo waswiewo ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Ort
    Detmold, Germany, Germany
    Beiträge
    114
    Hallo Kommunity,

    ich sitze seit Jahren mal wieder an nem kleinen VBA-Projekt (Excel 2007).

    Ich habe ein Bezeichnungsfeld mit einem Wert. Ich möchte, wenn ich eine Zahl in mein Textfeld geschrieben habe, diese erst bei Bestätigung von Enter von dem Wert des Bezeichnungsfelds abgezogen wird.

    Momentan fängt er an zu rechnen, sobald ich die erste Zahl eintippe.

    Hier mein Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    Option Explicit
     
    Private Sub TextBox1_change()
     
       Dim w As String
       
       w = TextBox1.Value
       
       If w = "" Or w Like "####" Then Exit Sub
       
       If w >= "0" Or w <= "180" Then
          Label1.Caption = Label1.Caption - CLng(w)
          TextBox1.Value = ""
       Else
          MsgBox "Bitte einen korrekten Wert eingeben!"
       End If
       
    End Sub

    Finde einfach nicht den Fehler. Ja gegoogelt und geSuFut hab ich schon wie nen Verrückter.

    Kann mir wer nen kleinen Tipp geben?

    MFG
     
    • MfG waswiewo

  2. #2
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    Das KeyChange-Event ist dafür denkbar ungeeignet, da du hier die gedrückte Taste nicht abfragen kannst. Besser geht es mit dem KeyDown-Event, dein Code würde so aussehen:
    Code vb:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    Option Explicit
     
    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
     
     If KeyCode = 13 Then '13 steht für die gedrückte Enter-Taste
     
       Dim w As String
       
       w = TextBox1.Value
       
       If w = "" Or w Like "####" Then Exit Sub
       
       If w >= "0" Or w <= "180" Then
          Label1.Caption = Label1.Caption - CLng(w)
          TextBox1.Value = ""
       Else
          MsgBox "Bitte einen korrekten Wert eingeben!"
       End If
     
     End If
       
    End Sub


    Der Doc!
    waswiewo bedankt sich. 
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

  3. #3
    Avatar von waswiewo
    waswiewo waswiewo ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Ort
    Detmold, Germany, Germany
    Beiträge
    114
    Hey!

    Ich danke dir, funktioniert einwandfrei!

    ###EDIT: Habe noch eine Frage:

    Ich habe 4 Do - Schleifen. Jede fragt einen Namen ab .. das klappt auch alles. Aber leider nur bis der 4te Name eingetragen wurde und ich mit OK bestätige. Danach kommt die Fehlermeldung: Laufzeitfehler 424 - Objekt erforderlich. Nur weiß ich nicht welches. Google sagt mir auch nichts gescheites.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
    Option Explicit
     
    Private Sub startdart501_Click()
     
    Dim sp As Variant
     
    Dim eins As Variant
    Dim zwei As Variant
    Dim drei As Variant
    Dim vier As Variant
     
    eins = dart501.Label5.Caption
     
    SpAnz:
    sp = Application.InputBox("Bitte Spieleranzahl eingeben.", "Spieleranzahl", , Type:=1)
     
        Do
            If sp < 1 Or sp > 4 Then GoTo SpAnz
            
        Loop Until sp = 1 Or sp = 2 Or sp = 3 Or sp = 4
        
        If sp = 4 Then
        
    Name1:
        eins = Application.InputBox("Bitte ersten Namen eingeben.", "Erster Spielername", , Type:=2)
    Name2:
        zwei = Application.InputBox("Bitte zweiten Namen eingeben.", "Zweiter Spielername", , Type:=2)
    Name3:
        drei = Application.InputBox("Bitte dritten Namen eingeben.", "Dritter Spielername", , Type:=2)
    Name4:
        vier = Application.InputBox("Bitte vierten Namen eingeben.", "Vierter Spielername", , Type:=2)
        
        Do
        
            If eins = "" Then GoTo Name1
            
        Loop Until eins.IsText
        
        Do
        
            If zwei = "" Then GoTo Name2
            
        Loop Until zwei.IsText
        
        Do
        
            If drei = "" Then GoTo Name3
            
        Loop Until drei.IsText
        
        Do
        
            If vier = "" Then GoTo Name4
            
        Loop Until vier.IsText
        
        NextUserForm.Show
        
        End If
     
    End Sub

    MFG
    Geändert von waswiewo (30.12.10 um 01:07 Uhr)
     
    • MfG waswiewo

  4. #4
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    Der Fehler ist klar, der Fehler kommt in der Zeile
    Code vb:
    1
    
    Loop Until eins.IsText
    und eigentlich auch in den weiteren Zeilen gleichen Typs. Du versuchst da einer Variant-Variable eine Eigenschaft zuzuweisen.

    Wenn ich mir aber deinen gesamten Code hier so ansehe, kommt mir eigentlich das kalte Grauen, Do/Loops und Sprungmarken für eine einfache Namenseingabe, klarerweise dass du da die Übersicht verlierst.

    Ein kleiner Tipp: Wenn du ja schon die Anzahl der Spieler abfragst, geh die Eingabe dann in einer For/Next-Schleife durch, und speichere die Namen in einem Array. Der Code für dich würde dann etwa so aussehen:
    Code vb:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    Option Explicit
     
    Private Sub startdart501_Click()
     
        Dim sp As Integer, cnt As Integer, Result As String, bError As Boolean, sSpieler() As String 'sSpieler beinhaltet die Spielernamen
        bError = False
     
        sp = Application.InputBox("Bitte Spieleranzahl eingeben.", "Spieleranzahl", , Type:=1)
        If sp > 4 Then sp = 4: MsgBox "Maximal 4 Spieler! 4 Spieler werden angenommen!"
        ReDim sSpieler(sp)
        sSpieler(1) = dart501.Label5.Caption
        
        For cnt = 1 To sp
        
            If bError Then bError = False: MsgBox "Bitte einen Namen eingeben!"
            Result = Application.InputBox("Bitte " & cnt & " Namen eingeben.", cnt & " Spielername", , Type:=2)
            If Result = "" Then bError = True: cnt = cnt - 1 Else sSpieler(cnt) = Result
                
        Next cnt
        
        NextUserForm.Show
     
    End Sub


    Der Doc!
    waswiewo bedankt sich. 
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

  5. #5
    Avatar von waswiewo
    waswiewo waswiewo ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Ort
    Detmold, Germany, Germany
    Beiträge
    114
    Absolute Spitzenklasse! Vielen Dank für deine großartige Hilfe!

    Ein Problem(chen) hab ich nun. Versuche schon seit einigen Stunden einen Sverweis zu machen. Das Problem hierbei ist, dass die Daten nicht in einer Tabelle stehen sollen (Habe die Datei als *.xaml gespeichert, ohne Arbeitsblatt). Kann man diese in ein Mudul schreiben und diese mit einem Sverweis abfragen? Oder ist es besser, die Dateien aus einer externen Excel-Tabelle zu laden?

    Ein anderes Problem gibt sich, wenn ich versuche die Eingaben der TextBox zu zählen um anschließend den Mittelwert in einem weiteren Label auszugeben. Dies ist aber nur ein Sekundär Problem =)

    Nachtrag:

    Und warum kann ich nach einer Fehlermeldung den Focus nicht in TextBox1 lassen? Er springt automatisch in die 2te Textbox.

    Auch

    Code :
    1
    2
    
          TextBox2.SetFocus
          TextBox1.SetFocus

    funktioniert nicht.

    Zweiter Nachtrag:

    Habe nun rumprobiert und die TabStop-Funktion benutzt. Damit gehts!

    Dritter Nachtrag:

    Wenn ich auf Enter drücke, ohne dass etwas eingegeben wurde, dann kommt auch eine Fehlermeldung "Typen unverträglich"! "w = TextBox1.Value" wird dann gelb markiert. Kann man das umgehen?

    MFG
    Geändert von waswiewo (01.01.11 um 16:55 Uhr)
     
    • MfG waswiewo

  6. #6
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    Ich hab jetzt kein Excel da zum testen, eine Textbox wird aber normalerweise über .Text angesprochen und nicht über .Value.
    Code vb:
    1
    
    w = TextBox1.Text


    Der Doc!
    waswiewo bedankt sich. 
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

  7. #7
    Avatar von waswiewo
    waswiewo waswiewo ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Ort
    Detmold, Germany, Germany
    Beiträge
    114
    Hi

    Das hab ich auch schon versucht. Das Problem ist, dass ich kein Text in dm Feld haben will. Es werden nur Zahlen eingetragen. Wenn das Feld leer ist, also "", dann soll eine Fehlermeldung kommen. Dies klappt, wenn ich die TextBox als Variant deklariere, dann kann ich aber die Zahlen 20, 30, 40, etc nicht eingeben... Das selbe mit String - kein Plan warum. Wenn ich als Integer deklariere, dann klappt's mit allen Zahlen bestens, aber nicht, wenn das Feld leer ist und ich Enter drücke. Dann kommt nämlich die Meldung "Typen unverträglich".

    Ich mein, es geht auch so, nur wenn man aus versehen mal die Entertaste drückt, ohne was einzugeben vorher, dann stürzt es immer ab.

    Komisch, komisch ..
     
    • MfG waswiewo

  8. #8
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    Eine Textbox als Variant oder Integer? Eine Textbox ist eine Textbox, in welche Variable du den Inhalt ausliest, hat nichts mit der Textbox allgemein zu tun.

    Um zu prüfen, ob eine Textbox leer ist, verwendet man
    Code vb:
    1
    
    If Text1.Text = "" Then 'Textbox hat keinen Inhalt

    Wenn du verhindern willst, dass in deiner Textbox etwas anderes als Zahlen eingegeben werden, kannst du das KeyPress-Event verwenden:
    Code vb:
    1
    2
    3
    
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
    End Sub

    Alternativ kannst du den Wert der Textbox auch mit Val() in eine Zahl umwandeln, Val() wandelt alles bis zum ersten alphanumerischen Zeichen in eine Zahl um und ignoriert alles dahinter (z.B. "12g65" wird zu 12).


    Der Doc!
    waswiewo bedankt sich. 
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

  9. #9
    Avatar von waswiewo
    waswiewo waswiewo ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Ort
    Detmold, Germany, Germany
    Beiträge
    114
    Dies funktioniert alles prima, danke!

    Mein letztes Problem bereitet mir ein Verweis in eine fremde Excel Datei.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    Private Sub sverweis()
     
     If Label1.Caption > 2 Or Label1.Caption < 171 Then
     
            Dim objExcel As New Excel.Application
            Dim objSheet As Object
       
            objExcel.Workbooks.Open ("E:\VBA Projekte\Dart Rechner\" & "finishes.xlsm")
       
            Set objSheet = objExcel.Sheets("Tabelle1")
            
            fsp1.Caption = WorksheetFunction.VLookup(Label1.Caption, objSheet.Range("A1:B169"), 2, False)
          
     End If
     
    End Sub

    Also, wenn im Label1 eine bestimmte Zahl steht soll er in der oben genannten Datei den Wert zu der Zahl suchen und in fsp1 wiedergeben. Macht er aber nicht

    Das Label fsp1 bleibt einfach leer.

    Hab ich irgend etwas vergessen? Also die Pfadangaben sind alle richtig.

    ##### -- EDIT -- #####


    Habe jetzt ein wenig weiter geforscht und folgendes probiert

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    Private Sub UserForm_Activate()
     
        Dim objExcel As New Excel.Application
        Dim objSheet As Object
        Dim varSuchbegriff As Variant
     
     If Label1.Caption > 2 Or Label1.Caption < 171 Then varSuchbegriff = Val(Label1.Caption) Else varSuchbegriff = Label1.Caption
     
            On Error Resume Next
       
            objExcel.Workbooks.Open ("E:\VBA Projekte\Dart Rechner\" & "finishes.xls")
       
            Set objSheet = objExcel.Sheets("Tabelle1")
            
            fsp1.Caption = WorksheetFunction.VLookup(varSuchbegriff, objSheet.Range("A1:B169"), 2, False)
            
            If Err.Number <> 0 Then fsp1.Caption = ""
            
            On Error GoTo 0
     
    End Sub

    Dies funktioniert! Die Daten aus der externen Excel-Datei werden auch angezeigt.

    Nur leider funktioniert dies nur ein einziges Mal. Und zwar wenn die Userform gestartet wird. Wie lautet denn der Sub-Befehl den ich anwenden muss? Habe schon alles mögliche versucht.

    Ich möchte es ca. so haben: Sub TextBox1.Focus() also jedes Mal wenn der Cursor in der Textbox ist.

    MfG
    Geändert von waswiewo (09.01.11 um 14:52 Uhr)
     
    • MfG waswiewo

  10. #10
    Avatar von DrSoong
    DrSoong DrSoong ist offline Iss was, Doc!
    tutorials.de Premium-User
    Registriert seit
    Jul 2003
    Ort
    Dem Zentrum meiner Welt
    Beiträge
    1.836
    Blog-Einträge
    85
    Bei Excel-VBA heißt das Ereignis nicht Focus() oder GotFocus() sondern Enter():
    Code vb:
    1
    2
    3
    
    Private Sub TextBox1_Enter()
       'Dein Code
    End Sub


    Der Doc!
    waswiewo bedankt sich. 
    A: Hilfe, ich hab zwei Dateien hinzugefügt und nun sind die anderen weg
    B: Die Scrollbar da rechts ist dir schon mal aufgefallen?

Ähnliche Themen

  1. C.O.F.F.E.E (Zahlen verarbeiten)
    Von street4 im Forum Cinema 4D
    Antworten: 2
    Letzter Beitrag: 11.05.10, 17:03
  2. [C#] Wert einer Textbox nach Enter an Listbox
    Von Mettbrot im Forum .NET Windows Forms
    Antworten: 5
    Letzter Beitrag: 15.09.09, 20:39
  3. Antworten: 4
    Letzter Beitrag: 17.03.09, 00:35
  4. Antworten: 4
    Letzter Beitrag: 15.04.05, 04:24
  5. Enter in textbox drücken->Funktion ausführen VC++ .net
    Von Test im Forum VisualStudio & MFC
    Antworten: 9
    Letzter Beitrag: 11.12.03, 10:04