290 Aufrufe
Gefragt in Tabellenkalkulation von revanchist Mitglied (210 Punkte)

Hallo in die Runde der Experten

mit den beiden nachstehenden Befehlen (ausgelöst über 2 Commandbuttons) werden in Spalte AE beginnend ab Zeile 44 Plus- resp. Minuszeichen eingetragen.

________________________________________________________________
Private Sub CommandButton2_Click()

  Cells(Application.Max(44, Cells(Rows.Count, 31).End(xlUp).Row + 1), 31) = "-"

End Sub

-----------------------------------------------------------------------------------------------------------
Private Sub CommandButton3_Click()

Cells(Application.Max(44, Cells(Rows.Count, 31).End(xlUp).Row + 1), 31) = "+"

End Sub
_________________________________________________________________

Manchmal sind 15 oder ggf. auch mal noch mehr Minuszeichen nacheinander einzutragen. Das ist oft recht nervig. Nachdem die Aktion mit Klicks auf den CB2 = "-" erledigt ist, soll abschließend noch einmal zum Abschluss 1 Click auf den Plusbutton CB3 erfolgen.

Wenn in Zelle AD8 (8, 30) eine händisch eingetragene Zahl z.B. 17 steht, dann soll über einen neuen CommandButton ab der nächsten freien Zelle in Spalte AE (x, 31) 16 mal der Minusbutton bedient werden und zum Abschluss noch 1 x der Plusbutton zum Einsatz kommen.

Wie könnte  der VBA-Befehl aussehen?

Vielen Dank für Eure Bemühungen

Ciao der Revanchist

6 Antworten

0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)

Hi,

weshalb soll der Button entsprechend oft betätigt werden? Es reicht doch, die Anzahl an Minus (oder Plus) direkt auf einen Ritt einzutragen - nach diesem Prinzip:

    Range("A1:A15") = "-"

Dabei sind bei dir halt Anfangs- und Endzeile dynamisch, wobei du die Anzahl der betreffenden Zelle entnimmst. Und anschließend in die Zelle darunter noch ein Plus einzutragen sollte da doch auch kein Problem sein.

Bis später, Karin

0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)

Hallo Karin

Danke für deine Antwort. Diese hilft mir aber nur bedingt weiter.

Wenn du 50 o. 70 oder auch mehr Ergebnisse mit jeweils 1 bis zu ggf. 30 Minuszeichen und dann immer noch jeweils ein Pluszeichen eintragen musst, dann wirst du nachvollziehen können, dass das eleganter gehen muss.

Das mit der häufigen Buttonbetätigung war mehr sinnbildlich zu verstehen. Händisch muss ich das aktuell ja noch so stemmen.

Bedenke dass das Scrollen “nach der Zelle darunter“ manchmal extrem aufwändig ist, wenn du in tiefere Zeilengrößen musst.

Ich hatte so etwas schon mal in ähnlicher Weise konstruiert, finde aber die Datei nicht mehr, um es weiter zu entwickeln.
Ich beschreibe es mal ohne VBA-Sprache.
Wenn Zelle AD8 größer 0, dann so viele Klicks auf CB2 wie Wert aus Zelle AD8 – 1. Nach Abarbeitung noch einmal Click auf CB3.     

Im Befehl | Cells(Application.Max(44, Cells(Rows.Count, 31).End(xlUp).Row + 1), 31) = "-" | werden die Minuszeichen ja schon in Spalte 31 (= AE) ab der ersten freien Zelle nach unten anvisiert (dito das eine Pluszeichen mit CB3).

Vierlleicht hast du oder ein anderer Experte/Expertin noch eine Idee

Ciao der Revanchist

0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)

Hi,

was willst du denn "noch eleganter" haben als wenn du in alle gewünschten Zellen auf einen Ritt das Minuszeichen einträgst? Mehr ist da überhaupt nicht möglich. Und was das mit dem "Scrollen" zu tun hat ist gleich gar nicht nachvollziehbar. 

Mein Code macht genau das was du willst, nur musst du eben die fixen Zelladressen an deine variablen Werte anpassen - hier nochmal derselbe Code mit Variablen und entsprechenden Kommentaren:

    Dim lngStart As Long
    Dim lngEnde As Long
    ' Startzeile ermitteln
    lngStart = Cells(Rows.Count, 31).End(xlUp).Row + 1
    ' wenn Startzeile < 44 dann Starzeile auf 44 festlegen
    If lngStart < 44 Then lngStart = 44
    ' Endzeile ermitteln aus vorgegebener Anzahl in AD8 
    lngEnde = Range("AD8") + lngStart - 1
    ' Minus eintragen in Bereich Startzeile bis Endzeile
    Range(Cells(lngStart, 31), Cells(lngEnde, 31)) = "-"
    ' Plus eintragen in die Zeile unter letztes Minus
    Cells(lngEnde + 1, 31) = "+"

Bis später, Karin

0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)

Hallo Karin
ich will dich doch nicht verärgern.
Aber manchmal stehe ich mit meinem Halbwissen (oder vlt. auch noch weniger), einfach ein wenig auf dem Schlauch.
Dank deiner Vorlage habe ich das Kind jetzt auch auf die richtige Bahn bekommen.
Den IF-Block (ohne End If -|)) habe ich der Einfachhalber auskommentiert und in Zelle AE43 einen fingierten Eintrag vorgenommen. Es beginnt bei mir in dieser Tabelle ja eh immer erst ab Zeile 44.

Die Routine sieht jetzt so aus und funktioniert super !

Private Sub CommandButton4_Click()
Dim lngStart As Long
Dim lngEnde As Long
' Startzeile ermitteln
lngStart = Cells(Rows.Count, 31).End(xlUp).Row + 1
' wenn Startzeile < 44 dann Starzeile auf 44 festlegen
'If lngStart < 44 Then
'lngStart = 44
' Endzeile ermitteln aus vorgegebener Anzahl in AD8
lngEnde = Range("AD8") + lngStart - 2
' Minus eintragen in Bereich Startzeile bis Endzeile
Range(Cells(lngStart, 31), Cells(lngEnde, 31)) = "-"
' Plus eintragen in die Zeile unter letztes Minus
Cells(lngEnde + 1, 31) = "+"
'End If

Ende gut - Alles gut
Daher noch einmal vielen herzlichen Dank !

Ciao der Revanchist

0 Punkte
Beantwortet von beverly_ Experte (3.4k Punkte)

Hi,

du hast bei deinem Code das End If falsch gesetzt! Wenn du schon meine korrekte Codezeile

    'wenn Startzeile < 44 dann Starzeile auf 44 festlegen
    If lngStart < 44 Then lngStart = 44
    ' Endzeile ermitteln aus vorgegebener Anzahl in AD8 
    lngEnde = Range("AD8") + lngStart - 1
    ' hier der restliche Code

in eine If-Then-End-If-Anweisung umwandeln willst, dann musst du sie auch wie folgt schreiben:

    'wenn Startzeile < 44 dann Starzeile auf 44 festlegen
    If lngStart < 44 Then
        lngStart = 44
    End if
    ' Endzeile ermitteln aus vorgegebener Anzahl in AD8 
    lngEnde = Range("AD8") + lngStart - 1
    '.... hier der restliche Code

und nicht das zum If gehörige End If irgendwo ans Ende des Codes setzen.

Bis später, Karin

0 Punkte
Beantwortet von revanchist Mitglied (210 Punkte)
| 'wenn Startzeile < 44 dann Starzeile auf 44 festlegen
|    If lngStart < 44 Then lngStart = 44
|    ' Endzeile ermitteln aus vorgegebener Anzahl in AD8 
|    lngEnde = Range("AD8") + lngStart - 1

Hallo Karin
das ist der Unterschied zwischen Dir als Profis und mir Laien:
bislang dachte ich immer, dass eine If-Anweisung zwingend ein End if erfordert.

Da ich in deinem 2. Posting nach dem If kein End if gefunden habe (oder vlt. auch übersehen), dachte ich blauäugig, musst halt eines dranhängen.

Ich glaube diesen Thread können wir jetzt schließen.

Gute Zeit wünscht dir der Revanchist    


...