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?
Antwort
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?
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
@MehulPatel: hast du das versucht? – user3598756
@MehulPatel: Es wäre nett von Ihnen, Feedbakcs an Leute zu geben, die versuchen und Ihnen helfen – user3598756
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
und ich wollte etwas mit Tasten. Danke trotzdem. –