返回列表 上一主題 發帖

[發問] 此巨集為何錯??

本帖最後由 t8899 於 2013-8-16 06:51 編輯
回復  t8899
因為漲跌兩邊都要執行,
所以會加兩行 :另外,建議你可以參考類似上面這樣有做縮排處理的程式 ...
luhpro 發表於 2013-8-15 21:47


應該是執行到 ZZ.Offset(, 26) = ZZ時,就跳出 for next 直接執行下面 ?迴圈沒跑完就跳出?

TOP

附檔 Book1.rar (15.22 KB)

TOP

回復  t8899
因為漲跌兩邊都要執行,
所以會加兩行 :另外,建議你可以參考類似上面這樣有做縮排處理的程式 ...
luhpro 發表於 2013-8-15 21:47

抱歉 上一樓檔案有誤,請用這個檔案測試
TEST.rar (22.42 KB)

TOP

ZZ.Offset(, 26) ====>可否直接改成AC欄的語法??

TOP

本帖最後由 t8899 於 2013-8-18 09:21 編輯
若堅持要改成AC欄語法勉強可以改為
Range("AC" & CStr(ZZ.Row))
因為列號是須要參考ZZ而做變動的,
而若日後你的 ZZ 改成不在 "C" 欄時,
上式傳回的位址就又不正確了.
luhpro 發表於 2013-8-17 09:11

巨集裡的公式,好像不會跟著工作表變動參照??
例如 If Range("Q2").Value = 1
我在P欄插入一欄,巨集不會自動改為 If Range("R2").Value = 1 ?
如果要跟著變動改為
IF Range("Q2").Offset(, 0) = 1  ?是這樣嗎?

TOP

本帖最後由 t8899 於 2013-8-22 04:47 編輯
巨集�堛熊{式片斷與儲存格本來就不是綁在一起而是各自獨立的,
Range("Q2") 永遠就是指 Q2 這個儲存格,
...
luhpro 發表於 2013-8-19 22:20


1.之前的問題,經再測試無法自動關掉訊息窗
是因為跑下面的程式,不知有無辦法改善?
好像只要有在跑time 的程式,就會這樣
Sub a123()
If [U1] <> 1 Then
On Error Resume Next
Application.OnTime EarliestTime:=TimeValue(Runtime), _
    Procedure:="a123", Schedule:=False
  Exit Sub
On Error GoTo 0
End If
zzzzz
If Range("V14") = 1 Then mytime = "00:01:00"
If Range("V14") = 2 Then mytime = "00:02:00"
If Range("V14") = 3 Then mytime = "00:00:30"
Runtime = Now + TimeValue(mytime)
Application.OnTime Runtime, "Sheet6.a123"
End Sub

2.後來找了一個API(MsgBoxTest)套用,代替CreateObject("Wscript.shell").Popup,
有問題??型態不符合???錯在紅色字?


Private Declare Function MsgBoxTest Lib "user32" Alias "MessageBoxTimeoutA" ( _
    ByVal hwnd As Long, _
    ByVal lpText As String, _
    ByVal lpCaption As String, _
    ByVal wType As VbMsgBoxStyle, _
    ByVal wlange As Long, _
    ByVal dwTimeout As Long) As Long
Private Sub Worksheet_Calculate()
Application.DisplayStatusBar = False
  Dim sStr$
  Dim ZZ As Range
  
  sStr = ""
  sStr2 = ""
  For Each ZZ In Range("c2:c111")
    If Not IsError(ZZ) Then
      If Range("Q26").Value = 1 And flag = True Then
        M = Round(ZZ - ZZ.Offset(, 26), 2)
        If M >= ZZ.Offset(, 2) Then
          If sStr <> "" Then sStr = sStr & Chr(10)
          sStr = sStr & "" & Cells(ZZ.Row, 2).Value & "=====> " _
                 & Round(ZZ - ZZ.Offset(, 26), 2)
        
        End If
        If M <= -ZZ.Offset(, 2) Then
          If sStr2 <> "" Then sStr2 = sStr2 & Chr(10)
          sStr2 = sStr2 & "" & Cells(ZZ.Row, 2).Value & "=====> " _
                   & Round(ZZ - ZZ.Offset(, 26), 2)
         
        End If
      End If
    End If
  Next
  If sStr <> "" Then
    MsgBoxTest 0, "", "", sStr, 0, 2500
  End If
  If sStr2 <> "" Then
   MsgBoxTest 0, "", "", sStr2, 0, 2500
  End If

3.另外一個方法用" FindWindow " 來關閉這訊息窗,不過找不到這訊息窗? test.rar (9.63 KB)
http://hi.baidu.com/zzllrr/item/9a561a634853bc90c4d2493d

TOP

1綜上你可以試試 :
MsgBoxTest 0, sStr, "提示訊息", 0, 0, 2500.
luhpro 發表於 2013-8-22 23:56


謝謝已經解決
MsgBoxTest 會自動關閉視窗,應該是MsgBoxTest獨立在跑
有兩個小缺點
1有時提示時無法在最前景??
2提示時,會出現漏斗狀,沒辦法做其他事情,但沒差,只有幾秒而已

TOP

本帖最後由 t8899 於 2013-8-27 06:11 編輯
1. 本來若你用的是 MsgBox 函數, 則在 MsgBox 函數 的說明中有寫到 :
語法
MsgBox(prompt[, buttons] [ ...
luhpro 發表於 2013-8-26 22:54


找到了  ====> vbSystemModal 應用程式強制回應:使用者必須先回應此訊息方塊,才能在目前的應用程式中繼續工作
沒加vbSystemModal,訊息視窗出現時,點其他軟體為active,excel的訊息視窗就無法在最前面
意即不知道有此訊息..
MsgBoxTest 0, sStr, "提示訊息",vbSystemModal, 0, 2500  ====>這是OK
MsgBoxTest 這個API (應該已包含MSGBOX的所有功能,不然vbSystemModal無法作用才對?)

VbMsgBoxSetForeground 65536 指定訊息方塊視窗作為前景視窗 ,應該也可以掛在vbSystemModal 同等位置
MsgBoxTest 0, sStr, "提示訊息",VbMsgBoxSetForeground , 0, 2500
測試了一下沒作用

TOP

p.s. (65536 無法放在VbMsgBoxSetForeground 後面,語法錯誤)

TOP

65536 放在 VbMsgBoxSetForeground 後面?
當然會發生錯誤啦.
說明中的內文是 :
         常數 ...
luhpro 發表於 2013-8-27 22:56

Sub eighty()
   Sheets("Sheet1").Select
    Range("a65536").End(xlUp).Offset(1).Select
        Application.SendKeys "{Home}", True
        Application.SendKeys "^{;}", True
        Application.SendKeys "{enter}", True
Sheets("Sheet1").Select
Range("B2:N2").Select   '=====>為何多加此行,造成上面的執行不正確,拿掉則正確???? 0test.rar (7.14 KB)

   End Sub

TOP

        靜思自在 : 盡多少本份,就得多少本事。
返回列表 上一主題