Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: variable Konstante in VBA?

variable Konstante in VBA?
14.08.2017 16:10:17
Thilo
Hallo,
ich habe folgendes Problem.
Eine Datei erhält fortlaufend aktuelle Daten von einer externen Quelle.
Per VBA wird ca. alle 2 Minuten ein Protokollsatz erzeugt. Ein vereinfachtes Beispiel hier:
https://www.herber.de/bbs/user/115451.xls
Die Werte in A1, A2 etc. ändern sich dauernd.
Ist es möglich, das Intervall aus Zelle E1 des Unterblatts "Level 1" variabel einzulesen? (E1 wäre dann eine Formel, die den Text "00:01:58" erzeugt.)
Ich habe probiert, wksData3.Range("E1") statt "00:01:58" einzugeben, aber da ist mir das Programm abgestürzt.
Vielen Dank im voraus,
Thilo
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: variable Konstante in VBA?
14.08.2017 16:12:12
Hajo_Zi
Hallo Thilo,
warum neuen Beitrag?

Ich gebe keinen Dank für eine Rückmeldung, da ich durch solche Beiträge nicht meine Beitragszahl erhöhen muss.
Rückmeldung ist ja in der Heutigen Zeit nicht üblich und die wenigen die eine Rückmeldung geben, mögen mir das verzeihen, das kein Danke für eine Rückmeldung kommt.
Anzeige
AW: variable Konstante in VBA?
14.08.2017 16:20:37
Thilo
Hallo Hajo,
auf Bitte von Chris. Siehe unter dem anderen Beitrag.
Beste Grüße,
Thilo
auf meinem Mist gewachsen owT.
14.08.2017 16:25:03
ChrisL
.
AW: variable Konstante in VBA?
14.08.2017 16:23:37
Sepp
Hallo Thilo,
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Public datTime As Date
Public Const strOntimeProcedure = "subAktion" 'Name der per Timer gestarteten Procedur

Sub StartTimer()
Call subAktion
End Sub

Sub StopTimer()
On Error Resume Next 'falls Timer nicht gestartet wurde
Application.OnTime Earliesttime:=datTime, Procedure:=strOntimeProcedure, schedule:=False
End Sub

Sub subAktion()
Dim wb As Workbook
Dim wksData1 As Worksheet, wksData2 As Worksheet, wksData3 As Worksheet, wksProto As Worksheet
Dim ZeileP As Long, dblWhen As Double
Set wb = ThisWorkbook
Set wksData1 = wb.Worksheets("Daten")
Set wksData3 = wb.Worksheets("Level 1")
Set wksProto = wb.Worksheets("Protokoll")

If IsNumeric(wksData3.Cells(1, 5)) Then
  dblWhen = CDate(wksData3.Cells(1, 5))
Else
  dblWhen = TimeSerial(0, 1, 0)
End If

With wksProto
  ZeileP = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
  .Cells(ZeileP, 1).Value = wksData1.Range("A1").Value
  .Cells(ZeileP, 2).Value = wksData3.Range("A1").Value
  .Cells(ZeileP, 3).Value = wksData3.Range("A2").Value
  .Cells(ZeileP, 4).Value = wksData3.Range("A3").Value
  .Cells(ZeileP, 5).Value = wksData3.Range("A4").Value
  .Cells(ZeileP, 6).Value = wksData1.Range("A2").Value
End With

datTime = Now + CDate(dblWhen)
Application.OnTime Earliesttime:=datTime, Procedure:=strOntimeProcedure
End Sub

Gruß Sepp

Anzeige
AW: variable Konstante in VBA?
14.08.2017 16:24:26
ChrisL
Hi Thilo
Public strTimeDiff As String
Sub StartTimer()
strTimeDiff = Worksheets("Level 1").Range("E1")
Call subAktion
End Sub

cu
Chris
AW: variable Konstante in VBA?
14.08.2017 17:14:26
Thilo
Vielen Dank schon mal an alle!
Ich habe jetzt die Lösung von Chris ausprobiert.
Im Prinzip tut sie schon, was sie soll, aber: wenn ich das Sekundenintervall, während das Protokoll läuft, manuell verändere (und genau das soll im Echtbetrieb ja automatisch passieren), läuft das Protokoll mit dem alten Intervall weiter. Erst wenn ich das Protokoll stoppe und dann neu starte, übernimmt VBA das neue Intervall. Siehe Anhang, ich hatte von 3 auf 20 Sekunden geändert:
https://www.herber.de/bbs/user/115453.xls
Gibt es eine Lösung, dass sich Änderungen in Zelle Level 1!E1 unmittelbar auswirken?
Thilo
Anzeige
meine Lösung probiert? o.T.
14.08.2017 17:17:32
Sepp
Gruß Sepp

AW: meine Lösung probiert? o.T.
14.08.2017 17:47:54
Thilo
Hallo Sepp,
in der Datei

Die Datei https://www.herber.de/bbs/user/115454.xls wurde aus Datenschutzgründen gelöscht


habe ich ein 10 Sekunden-Intervall hinterlegt, aber er scheint nur einen Satz pro Minute (Worksheet Protokoll) zu generieren. Oder stimmt was mit dem Format in Level 1!E1 nicht?
Thilo
Anzeige
AW: meine Lösung probiert? o.T.
14.08.2017 18:23:02
Sepp
Hallo Thilo,
klar, in E1 steht jetzt auch plötzlich ein Text und keine Uhrzeit!
Ich habe den Code umgestellt, die Zeit wird jetzt direkt aus den Eingabe-Zellen ermittelt.
Außerdem habe ich die Eingabezellen mit einer Gültigkeitsprüfung gegen Falscheingabe gesichert.
https://www.herber.de/bbs/user/115456.xls
Gruß Sepp

Anzeige
AW: meine Lösung probiert? o.T.
14.08.2017 18:29:11
Thilo
Klasse Sepp, jetzt passt's genau!
Vielen Dank,
Thilo
AW: variable Konstante in VBA?
14.08.2017 17:41:31
ChrisL
Hi Thilo
Nimm den Code von Sepp. Der schlaue Fuchs hat den Intervall innerhalb von SubAktion platziert.
cu
Chris
;
Anzeige
Anzeige

Infobox / Tutorial

Verwendung von variablen Konstanten in Excel VBA


Schritt-für-Schritt-Anleitung

Um eine variable Konstante in VBA zu verwenden, folge diesen Schritten:

  1. Öffne den VBA-Editor in Excel (Alt + F11).
  2. Füge ein Modul hinzu:
    • Klicke mit der rechten Maustaste auf „VBAProject (deineDatei.xlsx)“.
    • Wähle „Einfügen“ und dann „Modul“.
  3. Definiere die globale Konstante und die Variable:
    Public strTimeDiff As String
  4. Erstelle eine Sub-Prozedur, um den Timer zu starten:
    Sub StartTimer()
       strTimeDiff = Worksheets("Level 1").Range("E1")
       Call subAktion
    End Sub
  5. Passen die subAktion-Sub an, um den Timer mit der neuen Zeit zu starten:
    Sub subAktion()
       ' Hier wird der Timer gesetzt
       Application.OnTime Now + TimeValue(strTimeDiff), "subAktion"
    End Sub

Häufige Fehler und Lösungen

  • Problem: Das Protokoll läuft mit dem alten Intervall weiter, wenn du den Wert in E1 änderst.

    • Lösung: Stelle sicher, dass die Sub-Prozedur StartTimer jedes Mal aufgerufen wird, wenn sich der Wert in E1 ändert. Dies kann durch ein Ereignis in der Tabelle geschehen.
  • Problem: E1 ist als Text formatiert und nicht als Zeit.

    • Lösung: Stelle sicher, dass in E1 ein Zeitwert und nicht ein Textwert steht. Du kannst die Zelle formatieren, um sicherzustellen, dass sie als Zeit erkannt wird.

Alternative Methoden

Falls das direkte Einlesen der Zelle nicht funktioniert, gibt es alternative Methoden:

  1. Verwende Worksheet_Change-Ereignis:

    Private Sub Worksheet_Change(ByVal Target As Range)
       If Not Intersect(Target, Me.Range("E1")) Is Nothing Then
           StartTimer
       End If
    End Sub

    Diese Methode stellt sicher, dass jedes Mal, wenn sich der Wert in E1 ändert, die StartTimer-Prozedur aufgerufen wird.

  2. Nutzung von Application.OnTime: Stelle sicher, dass der Timer automatisch zurückgesetzt wird, wenn der Wert ändert.


Praktische Beispiele

Hier ist ein einfaches Beispiel, das zeigt, wie du eine vba globale konstante definieren und verwenden kannst:

Public Const strOntimeProcedure As String = "subAktion"

Sub StartTimer()
    Dim interval As String
    interval = Worksheets("Level 1").Range("E1").Value
    Application.OnTime Now + TimeValue(interval), strOntimeProcedure
End Sub

In diesem Beispiel wird die Konstante strOntimeProcedure verwendet, um die Prozedur zu benennen, die durch den Timer aufgerufen wird.


Tipps für Profis

  • Verwende Option Explicit: Dies zwingt dich, alle Variablen zu deklarieren, was hilft, Fehler zu vermeiden.
  • Nutze VBA Const Range: Überlege, ob du Konstanten für häufig verwendete Bereiche in deinem Code definieren möchtest, um die Lesbarkeit zu erhöhen.
  • Fehlerbehandlung einfügen: Verwende On Error Resume Next, um sicherzustellen, dass dein Code auch bei unerwarteten Fehlern robust bleibt.

FAQ: Häufige Fragen

1. Wie definiere ich eine vba konstante in einem Modul?
Du kannst eine Konstante in einem Modul mit dem Schlüsselwort Const definieren, gefolgt von ihrem Namen, Typ und Wert.

2. Kann ich eine Konstante in einer Funktion verwenden?
Ja, du kannst eine konstante vba in einer Funktion verwenden, solange sie im gleichen Modul oder als globale Konstante definiert ist.

3. Was passiert, wenn ich den Wert in einer Zelle ändere?
Wenn du den Wert in einer Zelle änderst und dein Timer nicht neu gestartet wird, bleibt das Programm mit dem alten Wert aktiv. Verwende Ereignisse, um dies zu steuern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige