Jump to content

Brauche Hilfe bei VBA


Recommended Posts

Hallo

ich benötige Hilfe bei folgendem Problem

 

Mit dem VBA Befehl 

For i = 1 TO 300

jetzt folgt mein kleines Programm

Next i

 

D.h jetzt läuft mein Programm 300 * durch.

 

mein Wunsch

wenn in Zelle g30 ein negativer Wert erscheint( wird durch eine Formel errechnet) soll das Programm stoppen.

Wer kann mir da helfen ?

 

Vielen Dank

 

Ecart

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zelle abfragen geht so: cells(zeile,spalte)

Für dein Beispiel zeile=30, spalte=7

 

'raus aus der for ... next  schleife

 

for i=1 to 300

     'deine zeilen   

     if cells(30,7)<0 then exit for   

next

 

oder raus aus der private sub prozedur

 

for i=1 to 300

     'deine zeilen   

   

     if cells(30,7)<0 then exit sub  'ende der prozedur

next

 

oder raus aus der function

 

for i=1 to 300

     'deine zeilen   

   

     if cells(30,7)<0 then exit function  'ende der function

next

 

EinsDaneben

bearbeitet von EinsDaneben
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 year later...

Hallo ,

 

ich bräuchte noch einmal Hilfe bei VBa.

 

Eine Formel errechnet ein Ergebnis (z.B in "g10" erfolgt die Ausgabe). Meistens aber kommt es zu keinem Ergebnis.

Dann steht in G10 nichts.Ich möchte jetzt, enn es zu einem Ergebnis kommt,dass das Ergebnis automatisch in einer Spalte abgespeichert wird.

Die Leerzeilen sollen übergangen werden.

Kann jemand helfen ?

Vielen Dank

Ecart

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin ecart,

 

Du brauchst vermutlich eine globale Variable, die die nächste zu beschreibende Zeilennummer enthält.

Nur wenn Deine Funktion ein festzuhaltendes Ergebnis erzeugt hat, zählst Du die globale Variable um 1 hoch.

 

Wenn Du was anderes wolltest, schneide mal Dein Codeschnipselhier herein.

 

 

Gruss vom Ego

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo ecart,

 

ich verstehe Deine Anfrage so, daß, falls es ein Ergebnis gibt, dieses in eine Extraergebnisspalte eingetragen werden soll.
Falls dies so sein sollte, geht mein Beispiel von Spalte "Z11:Z10010" für diese Ergebnisse aus.
In Zelle "Z10" wird die Anzahl der schon vorhandenen Ergebnisse gezählt mit (in Zelle "Z10" eintragen):

 

=Anzahl(Z11:Z10010)

 

Das Makro geht dann so:

======

Sub Neues_Ergebnis_eintragen()
    
    'Tabellenblattname von "ecart" zu Deinem Blattnamen ändern!
    
    Sheets("ecart").Select
    
    Dim VarErg As Object
    Set VarErg = Range("G10")
    Dim VarAnzahlErg As Object
    Set VarAnzahlErg = Range("Z10")
        
    If VarErg = "" then
    goto z
    else
    Range("Z11").Select
    ActiveCell.Range("A1").Offset(VarAnzahlErg, 0).Select
    ActiveCell = VarErg.Value
    end if

       
    ActiveWorkbook.Save   
z:

End Sub

======


Gruß
elementaar

 

bearbeitet von elementaar
Leerzeile hinzugefügt
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo ,

hab ich mir schon gedacht, dass ich das nicht hin bekomme.

so sieht mein Makro aus :

For i = 1 To 11500                                   ...... Die Permanenz wird jeweils um eine Zahl verschoben
    Range("A3:A11500").Select
    Selection.Copy
    Range("A2").Select
    ActiveSheet.Paste
    ActiveWindow.SmallScroll Down:=378
    Range("A2").Select
    If Cells(21, 3) = 10 Then Exit Sub           ... hier bleibt das Programm stehen und das Ergebnis muss ich dann händisch aufschreiben
    If Cells(21, 10) = 10 Then Exit Sub         .... siehe oben
    If Cells(1, 3) = 0 Then Exit Sub                 .... hier ist die Monatspermanenz auf Null
    Next
End Sub

Mein Wunsch wäre, dass das Programm nicht stoppt,sondern nur die beiden Ergebnisse  in 2  Spalten wegschreibt.

Vielleicht kann mir jemand helfen ?

Vielen Dank

Ecart

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo ecart,

 

hab das nur für den Fall, daß in Spalte 3 in irgendeiner Zeile zwischen 1 und 11500 eine 10 steht, gemacht.

Mußt du für die anderen Bedingungen ergänzen.

 

In der For ... Next Schleife durchläuft das Programm die Permanenz.

Steht in Spalte 3 eine 10, dann wird diese in Spalte 10 immer in die nächste leere Zeile geschrieben.

Sollten alledings tausende von Werten in die Rapporteurspalte geschrieben werden,

wäre die Zwischenspeicherung der letzten Zeile besser, da die Do While Schleife verlangsamt.

 

Code:

 

Dim z, NaechsteZeile, IrgendeineSpalte As Integer

IrgendeineSpalte = 10                             '.......Spalte Rapporteur

 

Columns(IrgendeineSpalte).Select      ' .......Spalte Rapporteur leeren
Selection.ClearContents

 

For z = 1 To 11500                                   '...... Durchlaufen der Permanenz 
    If Cells(z, 3) = 10 Then
          NaechsteZeile = 1
          Do While CStr(Cells(NaechsteZeile, IrgendeineSpalte)) <> ""
               NaechsteZeile = NaechsteZeile + 1
          Loop
          Cells(NaechsteZeile, IrgendeineSpalte) = Cells(z, 3)                             'Eintragen des Wertes in Spalte 10
    End If
Next

 

oder so müßte es auch gehen:

 

Dim z, NaechsteZeile, IrgendeineSpalte As Integer

IrgendeineSpalte = 10                             '.......Spalte Rapporteur

 

Columns(IrgendeineSpalte).Select      ' .......Spalte Rapporteur leeren
Selection.ClearContents

 

For z = 1 To 11500                                   '...... Durchlaufen der Permanenz 
    If Cells(z, 3) = 10 Then
       NaechsteZeile = ActiveSheet.Cells(Rows.Count, IrgendeineSpalte).End(xlUp).Row + 1         'letzte Zeile um eins hochzaehlen

       Cells(NaechsteZeile, IrgendeineSpalte) = Cells(z, 3)                                                                      'Eintragen des Wertes in Spalte 10
    End If
Next

 

EinsDaneben

bearbeitet von EinsDaneben
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo EinsDaneben,

vielen Dank für die beiden Makros.Leider habe ich nur sehr geringe VBA Kenntnisse.

Deswegen meine "komischen " Fragen:

1.Du schreibst "irgendeine Spalte", wie definiere ich die?

2."Nächste Zeile" ist das schon ein Befehl? oder nur ein Hinweis?

3.Bei dem Befehl  "Row +1 verschwindet das + automatisch

sorry nochmal ,vielleicht hast du ja noch mal Zeit zum Antworten.

Gruß

Ecart

PS. wozu das ganze ?Ich werte das alte Pauffler System Labyrinth aus .Habe jetzt 9 Monate durch 

ca 63000 Coups + 275 ST. Ist aber kein Spiel zum Geld verdienen ,da nur ca alle 130 Coups ein Angriff stattfindet!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo ecart,

 

betrachten wir diesen Code.

 

vor 13 Stunden schrieb EinsDaneben:

Dim z, NaechsteZeile, IrgendeineSpalte As Integer

IrgendeineSpalte = 10                             '.......Spalte Rapporteur

 

Columns(IrgendeineSpalte).Select      ' .......Spalte Rapporteur leeren
Selection.ClearContents

 

For z = 1 To 11500                                   '...... Durchlaufen der Permanenz 
    If Cells(z, 3) = 10 Then
       NaechsteZeile = ActiveSheet.Cells(Rows.Count, IrgendeineSpalte).End(xlUp).Row + 1         'letzte Zeile um eins hochzaehlen

       Cells(NaechsteZeile, IrgendeineSpalte) = Cells(z, 3)                                                                      'Eintragen des Wertes in Spalte 10
    End If
Next 

 

gleich am Anfang in Zeile 2 fülle ich die Variable 'irgendeinespalte' mit einem Wert.

 

IrgendeineSpalte = 10

Dies bedeutet es wird in die Zellen unter der Spalte J geschrieben, da J der 10. Buchstabe im Alphabet ist.

Du kannst aber auch einen anderen Wert für 'irgendeinespalte' nehmen. 8 stünde für Spalte H, 4 für D, 13 für M usw.

Jenachdem in welcher Spalte du deine Werte später sammeln willst.

 

 

NaechsteZeile = ActiveSheet.Cells(Rows.Count, IrgendeineSpalte).End(xlUp).Row + 1

Weil oben die Variable IrgendeineSpalte = 10 zugewiesen wurde, wird mit dieser Anweisung die unterste Zelle in Spalte J (=10. Spalte)

mit einem Inhalt drin gesucht. Das macht Excel indem es  von ganz unten nach oben die Spalte durchsucht, bis es auf eine Zelle trifft, 

wo etwas drin steht. Diese Zeile plus 1 wird dann der Inhalt der Variable 'NaechsteZeile', in die du ja was in der Spalte 'IrgendeineSpalte'

reinschreiben willst.

 

Warum das + verschwindet ist mir auch schleierhaft.

Könntest das + 1 auch löschen und in der Zeile drunter Folgendes einfügen:

NaechsteZeile = NaechsteZeile + 1

 

Vielleicht klappt das ja.

 

Welche Excel Version benutzt du?

 

Paufler sagt mir was, Methode Labyrinth nix.

 

EinsDaneben

 

 

 

 

 

 

 

bearbeitet von EinsDaneben
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Einsdaneben,

leider krieg ich das nicht hin , so sieht das jetzt bei mir aus :

Dim z, naechsteZeile, IrgendeinSpalte As Integer
IrgendeineSpalte = 14   ...... hier sagt er außerhalb einer Prozedur ungültig
Columns(IrgendeineSpalte).Select
Selection.ClearContens
For z = 1 To 11500
If Cells(z, 3) = 14 Then
naechsteZeile = 1
Do While CStr(Cells(naechsteZeile, IrgendeineSpalte)) <> ""
naechsteZeile = NaecchsteZeile + 1
Loop
Cells(naechsteZeile, IrgendeineSpalte) = Cells(z, 3)
End If
Next
Vielleicht kannst du ja noch einmal einen Blick darauf werfen.

Vielen Dank

 

Ecart

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Ecart,

 

habe jetzt ein Beispiel gemacht, dessen Datei ich anhänge.

In diesem Beispiel befindet sich ein Knopf mit der Aufschrift 'Auswertung starten'. Beim Drücken des Knopfes

werden die 10Tsd. Coups in Spalte C ab Zeile 10 auf das Erscheinen der Zahl 17 hin untersucht. Die 17 habe ich willkürlich

für dieses Beispiel ausgesucht. Immer wenn eine 17 in Spalte C in einer Zeile steht wird die Coup-Nr. in der

Rapporteurspalte H in der nächsten Zeile drunter in die Zelle geschrieben. 

 

Du könntest deine Permanenz mit den Spalten der Auswertungen anstatt der zufälligen Permanenz in Spalte C, ab Zeile 10 einkopieren.

 

Um an den Code zu kommen, der bein Drücken ausgeführt wird, mußt du die ALT-Taste gedrückt halten und

1x auf die Taste F11 drücken. Danach beide loslassen. Es sollte dann das hier zu sehen sein:

 

image.thumb.png.67f5460eab0caa5185990abb0c5c06c6.png

 

Die Erzeugung der Zufallszahlen habe ich bereits auskommentiert.

Die AnzahlCoups, die Rapporteurspalte und die Anfangszeile mußt du für deine Permanenz im Code anpassen.

 

Gruß EinsDaneben

 

 

 

 

 

 

 

Beispiel.xlsm

bearbeitet von EinsDaneben
Link zu diesem Kommentar
Auf anderen Seiten teilen

hallo EinsDaneben,:spocht_2:

Wow, vielen Dank für die Mühe und Geduld.

Ich glaube,dass ich das jetzt alles verstanden habe und in mein Programm einbauen kann.

Allein die Geschwindigkeit ist beeindruckend.

Ich werde noch einmal berichten wie es gelaufen ist.

Dir einen schönen Sonntag.

Beste Grüße

Ecart

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie ist deine Meinung dazu?

Du kannst jetzt schreiben und dich später registrieren. Bereits registrierter Teilnehmer? Dann melde dich jetzt an, um einen Kommentar zu schreiben.
Hinweis: Dein Beitrag wird nicht sofort sichtbar sein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Neu erstellen...