2016-08-06 36 views
-2

Ich habe Daten in einem Blatt B2: ZY191, und ich möchte jede Zeile (B2: ZY2, B3: ZY3, usw. bis B191: ZY191) in ein anderes Arbeitsblatt Arbeitsblatt für die Analyse kopieren. Währenddessen muss ich manchmal anhalten und meine Ergebnisse dazwischen markieren und dann von dort fortfahren, wo ich gegangen bin. Zum Beispiel habe ich das Makro gestartet und es von B2: ZY2 nach B52 kopiert: ZY52 dann pausiere ich das Makro & meine Ergebnisse markieren. Nun möchte ich von B52: ZY52 weiterfahren, wenn ich nach dem Kopieren von Daten bis B95 aufhören möchte: ZY95 Ich sollte das Makro pausieren können, mein Ergebnis markieren und von B95: ZY95 weitermachen. Ich sollte das so oft machen können wie ich möchte. Wenn mit Tasten wie Start, Pause und Lebenslauf zur Verfügung gestellt würde sehr hilfreich sein.Wie pausiere ich Makro, mache dann meine Sachen und fahre fort von wo ich gegangen bin?

+2

Sie sollten Breakpoints verwenden und das Makro im F8-Modus ausführen. Dies ist beim Debuggen nützlich. Oder möchten Sie dem Endbenutzer die Möglichkeit geben, zu pausieren und fortzufahren? Wenn dies der Fall ist, sollten Sie den Code in mehrere Prozeduren aufteilen, die nacheinander ausgeführt werden können. – izzymo

+0

und ich wollte etwas mit Tasten. Danke trotzdem. –

Antwort

0

Sie können Stop und Debug.Print verwenden, um die gewünschten Ergebnisse zu erzielen, wenn sie innerhalb Ihres Codes platziert werden. Zum Beispiel, wenn Sie über einen Bereich, fügen Sie die Anweisung der Wahl mit einer if-Anweisung sind Looping:

for a = 1 to 150 
    if a = 20 or a = 40 then 
     debug.Print "The value of a is: " & a.value 'or whatever you want to see 
    end if 
next 

Dieser Druck wird das immediates Fenster oder Stopp verwenden Sie den Code in einem strategischen Ort in den gleichen pausieren Weise.

Ich verstehe nicht, was Sie mit Tasten meinen? Sie sind sicherlich keine gute Idee, da der Code zu schnell laufen wird?

1

könnten Sie die folgende Abhilfe annehmen:

  • wählen die "Sets" Sie wollen so gut wie Ihre Daten teilen reichen in

    sagen wir mal:

    • set # 1 = Reihen 1 bis 20

    • Satz # 2 = Reihen 21 bis 30

    • ... und so weiter

  • Zeichen mit einem beliebigen Zeichen in der Spalte "A" die letzten Reihen aller gewählten Sätze

    so würde man eine "1" gesetzt (oder jedes andere Zeichen als "| I |" oder "| E |" - siehe unten) in den folgenden Zellen der Spalte "A" (d. h derjenige Ihre Datenbereich vorangehenden):

    • A21

    • A31

    • ...Und so weiter

    (da die Daten in Zeile 2 beginnt dann seine i-ten Zeile ist in Arbeitsblatt Zeile I + 1)

dann setzen Sie den folgenden Code in einem beliebigen Modul Ihrer Daten Bereich Arbeitsmappe:

Option Explicit 

Sub DoThings() 
    Dim dataRng As Range, rngToCopy As Range 

    'assuming Analysis.xlsx is already open 

    Set dataRng = Worksheets("BZ").Range("B2:ZY191") '<--| this is the whole data range. you can change it (both worksheet name and range address) but be sure to have a free column preceeding it 
    Set rngToCopy = GetCurrentRange(dataRng) '<--| try and set the next "set" range to copy 
    If rngToCopy Is Nothing Then '<--| if no "set" range has been found...inform the user and exit sub! 
     MsgBox "There's an '|E|' at cell " _ 
       & vbCrLf & vbCrLf & vbTab & dataRng(dataRng.Rows.Count, 1).Offset(, -1).Address _ 
       & vbCrLf & vbCrLf & " marking data has already been entirely copied" _ 
       & vbCrLf & vbCrLf & vbCrLf & "Remove it if you want to start anew", vbInformation 
     Exit Sub 
    End If 

    With rngToCopy 
     Workbooks("Analysis").Worksheets("Sheet1").Range(.Address).value = .value 
    End With 

End Sub 

Function GetCurrentRange(dataRng As Range) As Range 
    Dim f As Range 
    Dim iniRow As Long, endRow As Long 

    With dataRng 
     With .Offset(, -1) 
      Set f = .Resize(, 1).Find(what:="|E|", lookat:=xlWhole, LookIn:=xlValues) '<--| look for the "all copied" mark ("|E|") 
      If Not f Is Nothing Then Exit Function '<--| if "all copied" mark was there then exit function 

      Set f = .Resize(, 1).Find(what:="|I|", lookat:=xlWhole, LookIn:=xlValues) '<--| look for any "initial" mark put by a preceeding sub run 
      If f Is Nothing Then '<--|if there was no "initial" mark ... 
       iniRow = 1 '<--| ...then assume first row as initial one 
      Else 
       iniRow = f.row - .Cells(1).row + 1 '<--| ... otherwise assume "marked" row as initial one 
       f.ClearContents '<--| and clear it not to found it the next time 
      End If 

      endRow = .Cells(iniRow, 1).End(xlDown).row - .Cells(1).row + 1 '<--| set the last row as the next one with any making in column "A" 
      If endRow >= .Rows.Count Then '<--| if no mark has been found... 
       endRow = .Rows.Count '<--| ...set the last row as data last row... 
       .Cells(endRow, 1).value = "|E|" '<--|... and put the "all copied" mark in it 
      Else 
       .Cells(endRow, 1).ClearContents '<--| ...otherwise clear it... 
       .Cells(endRow + 1, 1).value = "|I|" '<--| ... and mark the next one as initial for a subsequent run 
      End If 
     End With 
     Set GetCurrentRange = .Rows(iniRow).Resize(endRow - iniRow + 1) '<--| finally, set the range to be copied 
    End With 
End Function 

und es so oft machen laufen, wie Sie benötigen: nach jeder Zeit endet und Sie Ihr Ergebnismarkieren und es dann wieder laufen zu lassen und es wird Form, wo es neu starten links

+0

@MehulPatel: hast du das versucht? – user3598756

+0

@MehulPatel: Es wäre nett von Ihnen, Feedbakcs an Leute zu geben, die versuchen und Ihnen helfen – user3598756