Microsoft Excel

Herbers Excel/VBA-Archiv

Subtrahieren von zwei Werten in meinem Code


Betrifft: Subtrahieren von zwei Werten in meinem Code von: Manni
Geschrieben am: 23.06.2017 01:29:20

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

  

Betrifft: Folgende Zeile ist falsch konstruiert, ... von: Luc:-?
Geschrieben am: 23.06.2017 02:33:48

…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 …


  

Betrifft: AW: Folgende Zeile ist falsch konstruiert, ... von: Manni
Geschrieben am: 25.06.2017 10:04:36

Danke, ich hab das jetzt beherzigt und hinbekommen.

Schönen Sonntag noch :-)


  

Betrifft: AW: Folgende Zeile ist falsch konstruiert, ... von: Manni
Geschrieben am: 25.06.2017 19:49:45

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


  

Betrifft: Du könntest a-b in eine globale Variable* ... von: Luc:-?
Geschrieben am: 26.06.2017 03:39:34

…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 :-?


Beiträge aus den Excel-Beispielen zum Thema "Subtrahieren von zwei Werten in meinem Code"