Board logo

標題: 儲存不會自動停止,該怎麼改? [打印本頁]

作者: ahsiek    時間: 2013-8-3 15:50     標題: 儲存不會自動停止,該怎麼改?

可以麻煩達人們幫我想想辦法嗎?
1.        AA(工作表)開始後無法自動停止,我設定在ROW33後就停止儲存
結果,在ROW33是停了,但它就跑到ROW2、3,就在那裡繼續作動作。
這是我哪裡寫錯了嗎?
2.        BB(工作表)也是如此,這兩個工作表的錄製是一樣的。所以也是不會自動停下來。
3.        AA(工作表),一旦按下開始動作,若我再去BB(工作表)按下任意鍵,則a.明細(工作表)和b.明細(工作表)都不會動了。
4.        AA(工作表),若按下終止鍵,結果連BB(工作表)也跟著不會動了。

請問我是哪裡寫錯了,我一直找不出原因來。
期望各位達人大大們,能幫我看一下問題,謝謝。
作者: luhpro    時間: 2013-8-4 22:54

回復 1# ahsiek
無法正常看到程式...
[attach]15693[/attach]

[attach]15694[/attach]
作者: ahsiek    時間: 2013-8-5 01:10     標題: RE: 儲存不會自動停止,該怎麼改?(檔案已更新)

本帖最後由 ahsiek 於 2013-8-5 01:11 編輯

回復 2# luhpro
原來是上傳的檔案不能開啟,因為我無法打開上傳後的檔案,所以不知道檔案沒有上傳好。
謝謝你的提醒。我重新再傳一次,希望這次能夠順利,且請各位達人們可以幫我想想辦法,謝謝。[attach]15697[/attach]

詢問的問題如下:
1.        AA(工作表)開始後無法自動停止,我設定在ROW33後就停止儲存
結果,在ROW33是停了,但它就跑到ROW2、3,就在那裡繼續作動作。
這是我哪裡寫錯了嗎?
2.        BB(工作表)也是如此,這兩個工作表的錄製是一樣的。所以也是不會自動停下來。
3.        AA(工作表),一旦按下開始動作,若我再去BB(工作表)按下任意鍵,則AA(工作表)和BB(工作表)都不會動了。
4.        AA(工作表),若按下終止鍵,結果連BB(工作表)也跟著不會動了。

請問我是哪裡寫錯了,我一直找不出原因來。
期望各位達人大大們,能幫我看一下問題,謝謝。
作者: GBKEE    時間: 2013-8-5 15:04

回復 3# ahsiek
檔案中沒有看到程式碼.
作者: ahsiek    時間: 2013-8-5 15:23

b]回復 4# GBKEE
寫在模組裡。[attach]15700[/attach][
作者: GBKEE    時間: 2013-8-5 15:37

回復 5# ahsiek
有請有2010版本幫忙看看了.
作者: c_c_lai    時間: 2013-8-5 16:25

回復 6# GBKEE
我將它轉成 2003 .xls
[attach]15701[/attach]
順便麻煩您幫我問一下,最近網頁程式碼是否有異動到,
或者加了一些程式碼,使得使用 Firefox 的 User 無法執行
圖片、或附件上傳,以及 "炫炫"的功能鍵 ([Color] ~ [/Color])。
目前我是用 IE 回復的,謝謝您!
作者: stillfish00    時間: 2013-8-6 11:23

本帖最後由 stillfish00 於 2013-8-6 11:35 編輯

回復 3# ahsiek
詢問的問題如下:
1.        AA(工作表)開始後無法自動停止,我設定在ROW33後就停止儲存
結果,在ROW33是停了,但它就跑到ROW2、3,就在那裡繼續作動作。
這是我哪裡寫錯了嗎?
首先你用這取最後一行的行號
endCol = 工作表29.Cells(33, 1).End(xlUp).Row
End(xlUp)相當於按 END+向上鍵,當A1~A33都有值時,這行取到的是1

再來你用

   If ActiveCell.Row > 33 Then End       '限制總列數
    If ActiveCell.Column = 30 Then End       '中途中止   

但是程式中實際ActiveCell卻一直是固定同一格,當然不會終止
而且切換工作表ActiveCell也會變...........


2.        BB(工作表)也是如此,這兩個工作表的錄製是一樣的。所以也是不會自動停下來。
3.        AA(工作表),一旦按下開始動作,若我再去BB(工作表)按下任意鍵,則AA(工作表)和BB(工作表)都不會動了。
4.        AA(工作表),若按下終止鍵,結果連BB(工作表)也跟著不會動了。

基本上我會重寫如下,你可以參考看看:
  1. Private gbStop1 As Boolean
  2. Private gbStop2 As Boolean

  3. Sub ButtonStart1()  'AA工作表開始按鈕
  4.   gbStop1 = False
  5.   With ActiveSheet
  6.     .UsedRange.Offset(3).ClearContents
  7.     SetTimer1 .Name
  8.   End With
  9. End Sub
  10. Sub ButtonStop1()   'AA工作表停止按鈕
  11.   gbStop1 = True
  12. End Sub
  13. Sub ButtonStart2()  'BB工作表開始按鈕
  14.   gbStop2 = False
  15.   With ActiveSheet
  16.     .UsedRange.Offset(3).ClearContents
  17.     SetTimer2 .Name
  18.   End With
  19. End Sub
  20. Sub ButtonStop2()   'BB工作表停止按鈕
  21.   gbStop2 = True
  22. End Sub

  23. '將不同表的排程部分/限制行數/分離出來
  24. Sub SetTimer1(sSheetName As String)
  25.   Const MAX_ROW = 34
  26.   '未達限制行數且沒按停止鈕則排程1秒後再度執行
  27.   If mainFunc(sSheetName) < MAX_ROW And Not gbStop1 Then Application.OnTime Now + TimeValue("00:00:01"), "'SetTimer1 """ & sSheetName & """'"
  28. End Sub

  29. Sub SetTimer2(sSheetName As String)
  30.   Const MAX_ROW = 270
  31.   If mainFunc(sSheetName) < MAX_ROW And Not gbStop2 Then Application.OnTime Now + TimeValue("00:00:01"), "'SetTimer2 """ & sSheetName & """'"
  32. End Sub

  33. Function mainFunc(sSheetName As String) As Long
  34.   Dim i As Long
  35.   
  36.   With Sheets(sSheetName)
  37.     i = .Cells(.Rows.Count, 1).End(xlUp).Row + 1

  38.     '...記錄log
  39.     .Cells(i, "A") = Format(Time, "Hh:Mm:Ss")
  40.     .Cells(i, "J").Resize(, 8).Value = .Cells(3, "B").Resize(, 8).Value
  41.   End With
  42.   
  43.   mainFunc = i  '回傳當前列數
  44. End Function
複製代碼

作者: ahsiek    時間: 2013-8-6 12:28

回復 8# stillfish00

原來如此,因為我是看一個版本改寫的,沒想到錯誤一堆。
謝謝。能使用了,我會好好研究的。

不過我可以再問一個問題嗎?
SetTimer1和SetTimer2都是找Function mainFunc(sSheetName As String) As Long
可是因為BB工作表要複製和貼上的儲存格和AA工作表不一樣,找同一個Function會讓BB工作表的所儲存的內容會搞錯。
是不是能夠再寫一個  Function mainFunc(sSheetName As String) As Long 讓SetTimer2去找呢?
BB工作表要複製的是
.Cells(i, "A") = Format(Time, "Hh:Mm:Ss")
.Cells(i, "E").Resize(, 3).Value = .Cells(3, "B").Resize(, 3).Value

可以再麻煩你這個部份嗎?謝謝。
作者: stillfish00    時間: 2013-8-6 13:29

回復 9# ahsiek
那SetTimer2中改為  If mainFunc2(sSheetName)
另新增:
  1. Function mainFunc2(sSheetName As String) As Long
  2.   Dim i As Long
  3.   
  4.   With Sheets(sSheetName)
  5.     i = .Cells(.Rows.Count, 1).End(xlUp).Row + 1

  6.     '...記錄log
  7.     .Cells(i, "A") = Format(Time, "Hh:Mm:Ss")
  8.     .Cells(i, "E").Resize(, 3).Value = .Cells(3, "B").Resize(, 3).Value
  9.   End With
  10.   
  11.   mainFunc2 = i  '回傳當前列數
  12. End Function
複製代碼

作者: ahsiek    時間: 2013-8-6 13:40

回復 10# stillfish00
謝謝stillfish00大大的幫忙,應該是沒有問題了。
真的非常感謝你。我也會努力學習VBA的,再次謝謝。
作者: GBKEE    時間: 2013-8-6 17:01

回復 7# c_c_lai
感謝你轉成2003 但還是無程式碼的

網頁程式碼是否有異動到
網頁是小誌先生在處裡的,我沒有權限可看到網頁的異動.
作者: ahsiek    時間: 2013-8-7 14:04

回復 10# stillfish00
我可以再問一個問題嗎?若除了AA(2) & BB(2)工作表外,還有個CC的工作表,CC的工作表裡面有DDE連結和公式。
而我在CC工作表上會整理一些資料或做更改時,BB工作表竟然停止儲存了。
我可以確定是CC工作表和BB(2)工作表並沒有連結,想請問我該如何更改才不會讓BB(2)工作表停止儲存呢?[attach]數值記錄[/attach]
作者: stillfish00    時間: 2013-8-7 16:44

回復 13# ahsiek
抱歉了,我也不曉得DDE是否會/如何影響或取消Excel的部分功能,
也有可能是與Excel應用程式資源分配問題,這方面沒有研究過,
手邊也沒相關工具可測試,這問題可能要請教其他版友是否能解惑了。

但一般常見的是藉由工作表的Calculate事件來記錄DDE的值,版上也有類似討論可參考看看。
作者: ahsiek    時間: 2013-8-8 15:53

回復 14# stillfish00


   不要緊, 謝謝你,stillfish00大大。
   我盡量不要有變動,應該就沒有問題了。
   總之,還是謝謝你的幫忙和指導。  :)
作者: ahsiek    時間: 2013-8-15 10:31

回復 14# stillfish00

Stillfish00 大大,我又有個問題想請教你。
如附上的檔案CC工作表
[attach]15781[/attach]
CC工作表是BB工作表的延伸,複製的格數多了三個。B3-G3的數值複製到H4-M4的格子裡,以此類推。
我也照方法改好了CC工作表。
但是,開始動作後,L4 和M4的儲存格會出現#DIV/0!,而接下來的儲存格就沒有問題。
(CC工作表上的B3-G3的百分比是亂數處理,真正的表格是有公式連結,所以你看檔案時,是不會有問題的。)
我想問的是,我很確定F3 & G3的格子都是有數值的,而L4 & M4是複製F3& G3的數值,為什麼還會出現#DIV/0!呢?
若真的是因為F3&G3的公式,而導致L4&M4出現#DIV/0!的話,有什麼方法可以讓L4&M4單純儲存數值就好呢?

真的麻煩你了,希望我的敘述你能看得懂。謝謝。
作者: stillfish00    時間: 2013-8-15 14:34

回復 16# ahsiek
我很確定F3 & G3的格子都是有數值的,而L4 & M4是複製F3& G3的數值,為什麼還會出現#DIV/0!呢?

我也覺得不會有這情形,你是如何確定"當下"的F3 & G3的格子都是有數值的?
  1. 若真的是因為F3&G3的公式,而導致L4&M4出現#DIV/0!的話,有什麼方法可以讓L4&M4單純儲存數值就好呢?
複製代碼
反過來問,若F3&G3就是#DIV/0!,你要L4&M4儲存什麼數值?
作者: ahsiek    時間: 2013-8-15 15:03

回復 17# stillfish00

謝謝你的回覆,我重新用F8一個一個對,在按下開始那一瞬間,F3 & G3 出現的數值是#DIV/0!,但就那一瞬間,馬上就有數值出來了。
我想,應該是那一瞬間被記錄下來,所以L3 & M3 才會記錄#DIV/0!。
我再想看看該怎麼處理才好。
謝謝你的回覆。
作者: ahsiek    時間: 2013-9-11 13:05

回復 17# stillfish00

TO  stillfish00大大

如果我複製BB工作表,改名為CC 工作表,裡面的程式都和BB工作表一樣,只是改個名,換個時間(改為1小時記錄一次)
如果改時間是10分鐘或是20分鐘記錄一次時,一切都很順利。
但若改為一個小時記錄一次時
如:
Sub SetTimer3(sSheetName As String)

  Const MAX_ROW = 270 '最多270

  If mainFunc3(sSheetName) < MAX_ROW And Not gbStop3 Then Application.OnTime Now + TimeValue("01:00:00"), "'SetTimer3 """ & sSheetName & """'"

End Sub

它除了記錄一個小時的數值外,還會記錄別的時間的。
如: 12:00:21 按下開始,為第一筆的記錄
          12:09:02 為第二筆的記錄
          13:00 :21 為第三筆的記錄
          13:09:02 為第四筆的記錄

請問為什麼會這樣呢?我需要的是一個小時一筆資料就好。
我試過若是短時間的記錄,就不會有這樣的情形。
能知道是什麼原因造成的嗎?
謝謝
作者: GBKEE    時間: 2013-9-11 13:19

回復 19# ahsiek
這有點亂,附檔案看看
作者: ahsiek    時間: 2013-9-11 14:01

本帖最後由 ahsiek 於 2013-9-11 14:02 編輯

回復 20# GBKEE

To  GBKEE大大   檔案附上,謝謝。[attach]16026[/attach]

不過,CC工作表的內容是我剛剛測試10分鐘的結果,一小時的被我洗掉了。
作者: ahsiek    時間: 2013-9-11 16:58

回復 20# GBKEE

[attach]16031[/attach]  附檔有另存為97-2003版本,只是工作表上的格式都跑掉了。我試著把CC工作表修改成比較能看的樣子。
不過你看到的,應該都是一堆數字。

程式碼寫在模組 module3 裡面。

CC工作表的 A欄是 時間,複製B3-D3的值至E4-G4的儲存格裡,H5-M5有公式會自己算。
主要的問題是,我設定一個小時記錄一次,結果,在每一個小時裡,中間會又多一筆時間的資料。
可是我明明就沒有動其他的程式碼,只改時間而已。就是不了解為什麼會多存時間呢?
作者: stillfish00    時間: 2013-9-11 17:14

回復 22# ahsiek
因為原本code中stop的機制,不是立即停止的,而是下次排程的時間到了才去判斷到該變數,不讓它有再下一次的排程。
所以原本設1秒,只要按停止後的一秒內不再重新開始就不會有問題,而現在時間拉長的話就有問題了。。。

可以參考修改如下看看,mainFunc() 不變:
  1. Private gNextRunTime1 As Date
  2. Private gbIsRunning1 As Boolean

  3. Sub ButtonStart1()  '工作表開始按鈕
  4.   '防止多次啟動
  5.   If gbIsRunning1 = True Then
  6.     If MsgBox("已有存在的排程:" & gNextRunTime1 & ",是否取消該排程,重新紀錄?", vbOKCancel) = vbOK Then
  7.       ButtonStop1
  8.     Else
  9.       Exit Sub
  10.     End If
  11.   End If
  12.   
  13.   With ActiveSheet
  14.     .Range("A4:G270").ClearContents
  15.     gbIsRunning1 = True
  16.     SetTimer1 .Name
  17.   End With
  18. End Sub

  19. Sub ButtonStop1()   '工作表停止按鈕
  20.   gbIsRunning1 = False
  21.   
  22.   On Error Resume Next
  23.   '取消下次執行時間
  24.   Application.OnTime gNextRunTime1, "'SetTimer1 """ & ActiveSheet.Name & """'", , False
  25.   On Error GoTo 0
  26. End Sub

  27. Sub SetTimer1(sSheetName As String)
  28.   Const MAX_ROW = 270
  29.   
  30.   gNextRunTime1 = Now + TimeValue("00:00:10")
  31.   Application.OnTime gNextRunTime1, "'SetTimer1 """ & sSheetName & """'"
  32.   
  33.   If mainFunc(sSheetName) >= MAX_ROW Then ButtonStop1 '執行並回傳row
  34. End Sub
複製代碼

作者: GBKEE    時間: 2013-9-11 17:43

回復 22# ahsiek
還是一樣沒程式碼,23#  stillfish00 的修正可以就好 ,如不行可將所有模組匯出後再上傳模組檔.
作者: ahsiek    時間: 2013-9-12 10:11

回復 23# stillfish00


To stillfish00 大大,非常謝謝你,也讓我知道是什麼原因造成的。我剛剛測試了一個小時,到目前為止都沒有問題出現。

真的真的很謝謝你,這下我也學會另一個方式。
作者: ahsiek    時間: 2013-9-12 10:13

回復 24# GBKEE


    To GBKEE 大大,也謝謝你的幫忙。但是我開啟97-2003版本的,進去VBA裡也是看得到模組裡的程式耶
    我不大會將2010和2003做轉換,或許就是這樣讓你看不到,真的很抱歉。
    不過,程式碼已經有解決了,也很謝謝你。
作者: ahsiek    時間: 2013-10-23 14:15

回復  ahsiek
因為原本code中stop的機制,不是立即停止的,而是下次排程的時間到了才去判斷到該變數,不讓 ...
stillfish00 發表於 2013-9-11 17:14


我想請問一下,CC 工作表,我只會拿來儲存數據,我都在其他工作表上工作 。
若我在其他的工作表上,若有做加減乘除或是改換函數時,CC 工作表就會漏了幾秒或是整個暫停住。
有沒有方法可以讓 CC 工作表不會因為其他工作表在工作而受到影響呢?
謝謝。
[attach]16457[/attach]
作者: stillfish00    時間: 2013-10-23 15:54

回復 27# ahsiek
根據Application.OnTime ,其參數LatestTime 的說明:
  1. LatestTime 選用 Variant

  2. 可以開始執行程序的最晚時間。例如,假設 LatestTime 設為 EarliestTime + 30,當時間到了 EarliestTime 時,如果由於其他程序正在執行中而使 Microsoft Excel 不處於 [就緒]、[複製]、[剪下] 或 [尋找] 模式,則 Microsoft Excel 會等待 30 秒以完成第一個程序。如果 30 秒內 Microsoft Excel 無法回到 [就緒] 模式,則不會執行此程序。如果省略此引數,Microsoft Excel 會一直等到可以執行該程序為止。
複製代碼
由於省略此引數,Microsoft Excel 會一直等到可以執行該程序為止。
也許是這樣導致你紀錄時間的動作延後,而有你說的"漏了幾秒"的結果,這可能沒辦法解決。。。

但我會建議你試試看,紀錄的巨集用一個Excel應用程式常駐,如果有其他Excel 工作需要處理的話,
另外開一個Excel應用程式(從開始功能表或捷徑開啟excel,不要直接雙擊excel檔案,
使工作管理員可看見兩個Excel.exe處理程序),也許能避免資源衝突問題。
作者: ahsiek    時間: 2013-10-24 09:39

回復 28# stillfish00

謝謝 stillfish00大大的回應。

雖然CC工作表主要是作為儲存的工作表,但它儲存的數值的平均值,會連結到另一個工作表如DD工作表去使用
並且視情況在DD工作表裡做些變更,如加減乘除或是剪下貼上的動作。
如果是另開一個活頁簿的話,這樣儲存的數值就無法及時連結到我需要的工作表內(即,儲存格的及時連結是需要兩個活頁簿雙擊點開的)
那還有沒有其他方法可以做出同樣的碼表計時並儲存數據,卻又不會影響其他工作表運作的呢?
不好意思又麻煩你了,謝謝。
作者: stillfish00    時間: 2013-10-24 10:04

回復 29# ahsiek
這樣我就無能為力了。。。
作者: ahsiek    時間: 2013-10-24 11:28

回復 30# stillfish00

沒關係,謝謝你再三的幫助和回應。謝謝{:3_52:}
作者: ahsiek    時間: 2013-10-25 12:17

回復  ahsiek
這樣我就無能為力了。。。
stillfish00 發表於 2013-10-24 10:04


不好意思,我今天在測試時,發現CC工作表,儲存的作業停不下來。
我設定在CC工作表第40列時要停止,結果完全沒有停止且繼續儲存下去。
這個情況出現在如果我在其他工作表上時,就會這樣,直到我換到CC工作表後,才會停下來。
請問,是哪裡出了問題?我找了好久,一直沒有辦法找到錯誤點。
之前是設1小時,結果沒有問題,後來改為1秒,就停不下來了。[attach]16476[/attach]
作者: stillfish00    時間: 2013-10-25 15:03

回復 32# ahsiek
修改一下23樓  ButtonStop1 和 SetTimer1

Sub ButtonStop1(Optional sSheetName As String)   '工作表停止按鈕
  gbIsRunning1 = False
  
  On Error Resume Next
  '取消下次執行時間
  Application.OnTime gNextRunTime1, "'SetTimer1 """ & IIf(sSheetName <> "", sSheetName, ActiveSheet.Name) & """'", , False
  On Error GoTo 0
End Sub


Sub SetTimer1(sSheetName As String)
  Const MAX_ROW = 270
  
  gNextRunTime1 = Now + TimeValue("00:00:10")
  Application.OnTime gNextRunTime1, "'SetTimer1 """ & sSheetName & """'"
  
  If mainFunc(sSheetName) >= MAX_ROW Then ButtonStop1 sSheetName '執行並回傳row
End Sub
作者: ahsiek    時間: 2013-10-25 15:19

回復  ahsiek
修改一下23樓  ButtonStop1 和 SetTimer1

Sub ButtonStop1(Optional sSheetName As Stri ...
stillfish00 發表於 2013-10-25 15:03



非常謝謝你,已經可以使用了,也不會一直跑下去。會停到我要的列上,再次謝謝。
我可以問一下說,這是因為什麼呢?謝謝。
作者: stillfish00    時間: 2013-10-25 16:05

回復 34# ahsiek
就像紅字標的地方,修改之前使用ActiveSheet.Name
是當前工作表名稱,因為ButtonStop1被呼叫時可能在別的sheet
,改成指定的工作表而已
作者: ahsiek    時間: 2013-10-28 09:34

回復  ahsiek
就像紅字標的地方,修改之前使用ActiveSheet.Name
是當前工作表名稱,因為ButtonStop1被呼 ...
stillfish00 發表於 2013-10-25 16:05



    原來如此,我了解了。非常謝謝你的幫忙。
作者: ahsiek    時間: 2013-11-11 14:20

回復 28# stillfish00

stillfish00大大,我可以再請教你嗎?
因為知道Application.OnTime的限制,延遲1、2秒是沒有關係,但是最近發現到在我沒有注意時或是在使用其他工作表時,CC工作表會自己停止儲存動作。
出現過這樣的情況好幾次,等我發現時,已經少儲存很多數據。(不確定是按了什麼導致CC工作表停止動作)
是不是有方法可以說,讓CC工作表停止動作時,會跳出對話框提醒我CC工作表停止了。
是在 Function mainFunc3(sSheetNmae As string ) As Long 裡去加MsgBox嗎?
可以教我如何做嗎?謝謝。   [attach]16664[/attach]
作者: ahsiek    時間: 2013-12-24 15:09

想請問說 因為我的儲存的列數會很多,每一次都要自己拉到最下方。
找到一個程式碼是讓最新資料顯示在可見視窗中。
在附加檔案裡的CC工作表,VBA module3裡。

Function mainFunc3(sSheetName As String) As Long   'CC工作表記錄
Dim i As Long

  With Sheets(sSheetName)

    i = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
    '...記錄log

    .Cells(i, "A") = Format(Time, "Hh:Mm:Ss")   'ROW A,記錄時間

    .Cells(i, "E").Resize(, 3).Value = .Cells(3, "B").Resize(, 3).Value  'B3-D3複製到E4-G4

  End With

  mainFunc3 = i  '回傳當前列數
  
    If ActiveSheet.Name = sSheetName And iRow > 25 Then
      ActiveWindow.ScrollRow = iRow - 15     '讓最新資料保持在可見視窗中
   End If

End Function

請問我是哪裡寫錯了,沒有辦法讓列數保持在可見視窗中。
可以麻煩給我一點指教嗎?非常謝謝。
作者: ahsiek    時間: 2013-12-24 15:12

回復 38# ahsiek


    [attach]17102[/attach] 附上檔案




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)