返回列表 上一主題 發帖

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

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

本帖最後由 t8899 於 2013-8-2 15:27 編輯

Private Sub Worksheet_Calculate()
        Dim xx As Range
For Each xx In Range("AG2:AG111")
If IsError(xx) Then
     If xx > xx.Offset(, -1) And Range("Q24").Value = 1 And flag = True Then
CreateObject("Wscript.shell").Popup "===> " & Cells(xx.Row, 2).Value & "=====> " & xx.Value, 1, "Auto Closed MsgBox", 64
Range("Q24").Value = 2
   Application.OnTime Now + TimeValue("00:00:15"), "DDD"
      Exit For
     End If
     End If
Next
end sub
錯誤訊息 型態不符合 ==>紅色行

這行是我加的嗎?
我沒有印象有加這行啊?

luhpro 發表於 2013-8-29 23:23

抱歉,這是我另外問的.....不是你加的
答案 可用 DoEvents 解決 (可能cpu 跑太快了)

TOP

Sub eighty()
         ...
Range("B2:N2").Select   '=====>為何多加此行,造成上面的執行不正確,拿掉則正確????
t8899 發表於 2013-8-28 06:49

這行是我加的嗎?
我沒有印象有加這行啊?

現在我已經很少用 Select 指令了,
除非確有其必要性,(例如需要用到 Selection 做指令主體, 或是需要變更Excel檔案焦點到另一個主體上)
否則這行除了浪費系統資源外,
並沒有什麼其他好處,
很多情形下其實是根本不需用到 Select 指令就可以達到我們的目的.

不過這個指令在 Debug 程式時倒是滿好用的,
例如想 Copy 時,
可以先不真的 Copy 而可以使用 F8  單步模式追蹤,
執行 Copy 前先在即時視窗用 Select 來確認欲運作的標的是否正確.

因為你的 Sample 檔不能判斷該行用處在哪及拿掉是否會出問題,
所以你只能自行測試或判斷,
你若是確定加了該指令對程式結果沒什麼用處的話,
那就乾脆直接刪掉該行吧. (你也可以先在該行前面加個  '   把它變成註解文字, 該行就不會執行了, 反之就又會執行了)

TOP

回復  t8899
stillfish00 發表於 2013-8-29 13:53


這個可以,可能執行速度太快的關係??

TOP

回復 65# t8899
  1. Sub eighty()
  2.     With Sheets("Sheet1")
  3.         .Select
  4.         .Range("a65536").End(xlUp).Offset(1).Select
  5.         Application.SendKeys "{Home}", True
  6.         Application.SendKeys "^{;}", True
  7.         Application.SendKeys "{enter}", True
  8.         DoEvents
  9.         .Range("B2:N2").Select
  10.     End With
  11. End Sub
複製代碼

TOP

回復  t8899 試試看!
c_c_lai 發表於 2013-8-28 07:28


無效..................

TOP

回復 63# t8899
  1. Sub eighty()
  2.     With Sheets("Sheet1")
  3.         .Select
  4.         .Range("a65536").End(xlUp).Offset(1).Select
  5.         Application.SendKeys "{Home}", True
  6.         Application.SendKeys "^{;}", True
  7.         Application.SendKeys "{enter}", True
  8.         .Range("B2:N2").Select
  9.     End With
  10. End Sub
複製代碼
試試看!

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

p.s. (65536 無法放在VbMsgBoxSetForeground 後面,語法錯誤)
t8899 發表於 2013-8-27 06:14

65536 放在 VbMsgBoxSetForeground 後面?
當然會發生錯誤啦.

說明中的內文是 :

             常數                       值                       說明
====================================================
VbMsgBoxSetForeground      65536     指定訊息方塊視窗作為前景視窗。

它的意思是說 :
在 Excel VBA 中, 已經有定義了 VbMsgBoxSetForeground 這個常數的值為 65536,
你在 MsgBox 函數的 buttons 引數的位置上,
可以使用 VbMsgBoxSetForeground 這個常數 或是用 65536 這個值(任取其中之一),
來設定這次使用 MsgBox 函數 指定其 訊息方塊視窗 作為前景視窗.

你也可以參考 MsgBox 的範例得知其使用方式:
Style = vbYesNo + vbCritical + vbDefaultButton2    ' 定義按鈕。
Response = MsgBox(Msg, Style, Title, Help, Ctxt)
參照範例可得出你可以使用 :
MsgBox sStr, vbYesNo + VbMsgBoxSetForeground , "提示訊息"
或是
MsgBox sStr, 4 + 65536 , "提示訊息" (左式也等同 MsgBox sStr, 65540 , "提示訊息")
上兩式的結果是相同的.

不過 MsgBox 函數可以使用的常數不一定就適用 MsgBoxTest (在 Windows API 中它其實應該是 MessageBoxTimeoutA),
這要看在 Windows API 與 Excel VBA 中,
MessageBoxTimeoutA 函數是否有實做出該引數為 VbMsgBoxSetForeground 值時所應該出現的效果,
最簡單的方法就是套用進程式中,
然後實際跑跑看就知道有沒有此功能了.

TOP

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

TOP

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