Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1564to1568
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Subtrahieren von zwei Werten in meinem Code

Subtrahieren von zwei Werten in meinem Code
23.06.2017 01:29:20
zwei
Hi Leute,
ich stehe grad ein wenig auf Schlauch bei meinem Code. Habe eine Tankerfassungsystem per VBA entworfen und hänge nun bei folgendem Problem.
Ich nehme täglich den Tankstand auf und hol mir per Drop Down den jeweiligen Tank in meine Maske. Es werden die Werte der vorherigen Buchung eingelesen und in entsprechende Felder eingetragen. Um jetzt ohne Formeln den Verbrauch (Differenz zwischen aktuellen Tankstand und den des Vortags) wollte ich in meinem Code eine Rechenoperation durchführen, um beide Tankstände zu subtrahieren. Jetzt bin ich noch ein rechter Newbie in VBA und bei Youtube fand ich nur Video wo man dies mit Range macht, aber da ich ja bei meinen Eintragungen immer über die Suche der letzten freien Zeile arbeite halte ich das für ungeeignet. Ich stell mich sicher total blöd an und wäre gut wenn mir da jemand helfen bzw. mir auch ne Alternative aufzeigen könnte, die mir da weiterhilft. Anbei der Code. Gute Nacht an alle :-)
Private Sub Eintragen()
'Pfad für die Dateneintragung
Dim AktuellerEintrag As Long
Dim LetzterEintrag As Long
Dim lngLastRow As Long
Dim a As Long
Dim b As Long
Dim wsRohdaten As Worksheet
Set wsRohdaten = ThisWorkbook.Sheets(Me.cmbTank_Entnahme.Value)
With wsRohdaten
LetzterEintrag = (.Cells(Rows.Count, 1).End(xlUp).Row) - 1
AktuellerEintrag = (.Cells(Rows.Count, 1).End(xlUp).Row)
lngLastRow = (.Cells(Rows.Count, 1).End(xlUp).Row) + 1
'Eintragen der Werte in die Textfelder des Vortages
.Cells(lngLastRow, 1).Value = Me.cmbTank_Entnahme.Text
.Cells(lngLastRow, 2).Value = CDate(Me.txtUhrzeit_Entnahme)
.Cells(lngLastRow, 3).Value = CDate(Me.txtDatum_Entnahme)
.Cells(lngLastRow, 4).Value = CDbl(Me.txtTankbestand_Entnahme)
.Cells(lngLastRow, 5).Value = UCase(Me.txtErfasser_Entnahme)
'Erstellung der Variablen für die Rechenoperation
a = (.Cells(AktuellerEintrag, 4).End(xlUp).Row)
b = (.Cells(LetzterEintrag, 4).End(xlUp).Row) - 1
a -b = .Cells(lngLastRow, 6).Value
Cells(lngLastRow, 6).Value = CDbl(Me.txtVerbrauch_Entnahme)
End With
End Sub

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Folgende Zeile ist falsch konstruiert, ...
23.06.2017 02:33:48
Luc:-?
…Manni:
a -b = .Cells(lngLastRow, 6).Value
Da anschließend Cells(lngLastRow, 6).Value = CDbl(Me.txtVerbrauch_Entnahme) folgt, ist unklar, was du mit diesen beiden Zeilen bezweckst! Ansonsten muss eine Berechnung einer Variablen oder einer Zelle zugewiesen wdn (das 1. = ist in solchen Fällen ein Zuweisungs­Operator, der in anderen Sprachen := bzw ⇐ bedeutet und mitunter - bei benannten Parametern auch in VBA - sogar geschrieben wird), nie­mals umgekehrt!
Morrn, Luc :-?
Besser informiert mit …
Anzeige
AW: Folgende Zeile ist falsch konstruiert, ...
25.06.2017 10:04:36
Manni
Danke, ich hab das jetzt beherzigt und hinbekommen.
Schönen Sonntag noch :-)
AW: Folgende Zeile ist falsch konstruiert, ...
25.06.2017 19:49:45
Manni
Vielleicht könntest du mir bei einem weiteren Problem noch helfen, die Zeile mit der Berrechnung pasts jetzt, sieht so aus:
Private Sub Eintragen()
'Pfad für die Dateneintragung
Dim VorherigerEintrag As Long
Dim lngLastRow As Long
Dim Verbrauch As Integer
Dim wsRohdaten As Worksheet
Set wsRohdaten = ThisWorkbook.Sheets(Me.cmbTank_Zufuhr.Value)
With wsRohdaten
VorherigerEintrag = (.Cells(Rows.Count, 1).End(xlUp).Row)
lngLastRow = (.Cells(Rows.Count, 1).End(xlUp).Row) + 1
.Cells(lngLastRow, 1).Value = Me.cmbTank_Zufuhr.Text
.Cells(lngLastRow, 2).Value = CDate(Me.txtDatum_Zufuhr)
.Cells(lngLastRow, 3).Value = CDate(Me.txtUhrzeit_Zufuhr)
.Cells(lngLastRow, 4).Value = CDbl(Me.txtTankbestand_Zufuhr)
.Cells(lngLastRow, 5).Value = UCase(Me.txtErfasser_Zufuhr)
.Cells(lngLastRow, 6).Value = CDbl("0")
.Cells(lngLastRow, 8).Value = UCase(Me.txtFahrer_Zufuhr)
.Cells(lngLastRow, 9).Value = UCase(Me.txtKennzeichen_Zufuhr)
.Cells(lngLastRow, 10).Value = UCase(Me.txtAufsicht_Zufuhr)
.Cells(lngLastRow, 11).Value = UCase(Me.txtKommentar_Zufuhr)
a = CDbl(.Cells(lngLastRow, 4).Value)
b = CDbl(.Cells(VorherigerEintrag, 4).Value)
.Cells(lngLastRow, 7).Value = a - b
End With
End Sub
Ich möchte aber diese Zeile nun noch zusätzlich in eine Rohdatentabelle (letzte freie Zeile) reinschreiben, damit wäre sie dann sowohl in dem Sheet das ich über die Combo Box auswähle als auch in dieser Rohdaten tabelle, da ich aber nun den einen Wert mit den Variablen berrechne und ich das in der Rohdatentabelle nicht anwenden kann, da ja der Eintrag davor aus einem anderen Tabellenblatt sein könnte, bräuchte ich ne alternative. Hättest du da ne Lösung für mich?
VG
Manni
Anzeige
Du könntest a-b in eine globale Variable* ...
26.06.2017 03:39:34
Luc:-?
…schreiben, Manni,
und deren Wert dann in einem weiteren Pgm, das die letzte freie Zelle der RohdatenTabelle ermittelt, verwenden. Alternativ könn­test du dieses Pgm auch aus dem obigen heraus aufrufen und dabei diesen Differenz­Wert als Parameter übergeben:
Call RohDatTabEinf(a - b)
Du könntest von diesem Pgm aber auch auf den bereits eingetragenen Wert zugreifen. Sinnvoll wäre sicher auf jeden Fall a, b und zB abDiff als Double zu deklarieren (a u. b fehlen oben in der Deklaration, oder sind sie global‽) und dann abDiff = a - b zu schreiben und diese Variable dann zuzuweisen: .Cells(lngLastRow, 7).Value = abDiff und Call RohDatTabEinf(abDiff), wenn abDiff nicht global deklariert wdn soll.
Der Kopf der separaten Prozedur RohDatTabEinf sähe dann bspw so aus:
RohDatTabEinf(ByVal Diffz As Double)
Dabei kann uU ebenfalls Private vorangestellt wdn, wenn sich diese Prozedur im gleichen Modul wie die aufrufende befindet, und der VariablenName kann in dieser Prozedur auch anders lauten, aber auch gleich bleiben (er gilt ohnehin nur in dieser Prozedur).
* Eine globale Variable wird am ModulAnfang vor allen Prozeduren und außerhalb von diesen deklariert, ggf mit Public statt Dim und möglichst in einem NormalModul. Wird ein KlassenModul dafür benutzt, muss ihr bei Aufruf ggf der ModulName punktgetrennt vorangestellt wdn. Wird eine gleichnamige Variable in einer Prozedur separat deklariert (auch im ProzedurKopf!), hat sie mit der globalen nichts zu tun!
Morrn, Luc :-?
Anzeige

308 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige