標題:
[發問]
如何將Worksheet_Change的變數宣告,改成在一般模組使用?
[打印本頁]
作者:
jackson7015
時間:
2014-4-29 09:07
標題:
如何將Worksheet_Change的變數宣告,改成在一般模組使用?
本帖最後由 jackson7015 於 2014-4-29 09:12 編輯
請問各位前輩
如何將下面Worksheet中的變數宣告,改成在模組的一般巨集就好了?
因為做了其他巨集要使用
但是只要有更動到Worksheet的單格儲存格,就會啟動此宣告
想請教前輩們,如何將以下變數宣告,改成一般模組的巨集使用且只作用在[a5]儲存格就好了
感謝不吝指教~
Private Sub Worksheet_Change(ByVal Target As Range)
Dim A As Range, Rng As Range
If Target.Column = 1 Then
With Sheets("綜合資料庫")
For i = 1 To .UsedRange.Rows.Count
Set A = .UsedRange.Rows(i).Find(Target)
If Not A Is Nothing Then
If Rng Is Nothing Then
Set Rng = .UsedRange.Rows(i)
Else
Set Rng = Union(Rng, .UsedRange.Rows(i))
End If
End If
Next
End With
End If
Application.EnableEvents = False
If Not Rng Is Nothing Then
Rng.Copy: Target.Offset(, 1).PasteSpecial 3
Else
Target.Offset(, 1).Resize(, 50) = ""
End If
Application.EnableEvents = True
MsgBox "查詢結束"
End Sub
複製代碼
作者:
GBKEE
時間:
2014-4-29 09:22
回復
1#
jackson7015
SHEET1的Worksheet_Change 事件
Run "SHEET1.Worksheet_Change", Sheet1.[A5]
複製代碼
作者:
jackson7015
時間:
2014-4-29 16:07
回復
2#
GBKEE
GBKEE版大您好;
請問是否只新增一組此巨集將原本的變數宣告導入,然後再將您的宣告放到SHEET1(查詢用表單)的Worksheet_Change內?
但是我如此做會宣告錯誤
不曉得是哪個步驟錯誤了?
感謝GBKEE版大的回覆
作者:
GBKEE
時間:
2014-4-29 16:42
回復
3#
jackson7015
你不是要在其他的巨集中,執行這程式碼,來執行Sheet1(查詢用表單)的Worksheet_Change事件程式嗎?
作者:
jackson7015
時間:
2014-5-2 16:00
回復
4#
GBKEE
GBKEE版大,對不起,沒有陳述清楚需要的部分
宣告在Worksheet_Change的部分,會下列的巨集啟動,儲存格只要一變動,就會自動啟動宣告部分
Sub 清除查詢表格()
' 清除查詢表格 巨集
With Sheets("查詢用表單")
Range("$B5:$BR301").Select
Selection.ClearContents
Range("A5").Select
End With
End Sub
複製代碼
我想改成只用巨集手動去搜索,這樣才不會有儲存格有變動的時候,就啟動Worksheet_Change的部分
是否能將Worksheet_Change程式碼,改成在Module1模組的編程
自己研究了幾天,還是不會把在Worksheet_Change的編寫,改成在Module1模組中...
自己資質愚鈍,想麻煩GBKEE版大能否幫忙修正編寫
感謝不盡..
作者:
GBKEE
時間:
2014-5-3 15:59
回復
5#
jackson7015
是這樣嗎?
Sub 清除查詢表格()
' 清除查詢表格 巨集
With Sheets("查詢用表單")
.Range("$B5:$BR301").ClearContents
.Range("A5").Select
Run "Module1.Worksheet_Change", .[A5]
'你已將 Worksheet_Change的編寫,改成在Module1模組
End With
End Sub
複製代碼
作者:
jackson7015
時間:
2014-5-5 09:05
回復
6#
GBKEE
GBKEE版大,想再次麻煩一下
因為我的表達好像有問題..
我想直接將1樓的程式碼
不在Worksheet內編寫,而是編寫在Module
現在的問題是只要一改變儲存格[A5]的內容,就會自動執行1樓的程式碼
我想改成手動方式執行,手動執行
Sub 查詢表格()
巨集才會執行
不曉得這樣解,GBKEE版大是否比較好理解
感謝您再次的回覆
作者:
jackson7015
時間:
2014-5-5 16:09
回復
GBKEE
附上檔案,再請GBKEE版大看看
[attach]18210[/attach]
作者:
jackson7015
時間:
2014-5-6 17:00
回復
6#
GBKEE
檔案已附上,再請GBKEE大大看看是否可行
今天研究了半天還是不會改...
作者:
GBKEE
時間:
2014-5-7 17:00
回復
9#
jackson7015
試試看
'都是Module3上的程式碼
Sub 查詢資料()
' Worksheet_Change [A5] '可以這樣做
Ex
End Sub
'Sheets("查詢用表單")的Worksheet_Change事件,你是想搬移到Module3模組上
Private Sub Worksheet_Change(ByVal Target As Range)
Dim A As Range, Rng As Range
If Target.Column = 1 Then
With Sheets("綜合資料庫")
For i = 1 To .UsedRange.Rows.Count
Set A = .UsedRange.Rows(i).Find(Target)
If Not A Is Nothing Then
If Rng Is Nothing Then
Set Rng = .UsedRange.Rows(i)
Else
Set Rng = Union(Rng, .UsedRange.Rows(i))
End If
End If
Next
End With
End If
Application.EnableEvents = False
If Not Rng Is Nothing Then
Rng.Copy: Target.Offset(, 1).PasteSpecial 3
Else
Target.Offset(, 1).Resize(, 50) = ""
End If
Application.EnableEvents = True
MsgBox "查詢結束"
End Sub
Private Sub Ex()
Dim F As Range, AD As String, Rng As Range, xRng As Range
Set xRng = Sheets("查詢用表單").[A5]
With Sheets("綜合資料庫").UsedRange
Set F = .Find(xRng, LOOKAT:=xlPart)
If Not F Is Nothing Then AD = F.Address
Do While Not F Is Nothing
If Rng Is Nothing Then
Set Rng = .Rows(F.Row)
Else
Set Rng = Union(Rng, .Rows(F.Row))
End If
Set F = .FindNext(F)
If F.Address = AD Then Exit Do
Loop
End With
If Not Rng Is Nothing Then
Rng.Copy xRng.Offset(, 1)
MsgBox "查詢結束"
Else
xRng.Offset(, 1).Resize(, 50) = ""
End If
End Sub
複製代碼
作者:
jackson7015
時間:
2014-5-8 08:58
本帖最後由 jackson7015 於 2014-5-8 09:09 編輯
回復
10#
GBKEE
感謝GBKEE版大的幫忙
可以正常運作了
自己所需要的部分是下面的那些程式碼,刪除了些不需要的部分
vb的程式碼都不會編寫,都只會一些簡單的一般區編寫
感謝版大的無心付出
想再請問版大MsgBox的問題
如果我想在下列的程式碼中插入一則"查詢中"的MsgBox,但是會在搜尋結束後,MsgBox視窗會自動消除
那種MsgBox語法該怎麼編寫 ?
查詢了站上資料,找不太到MsgBox自動結束的相關資料
Sub 查詢資料()
Dim F As Range, AD As String, Rng As Range, xRng As Range
Set xRng = Sheets("查詢用表單").[A5]
With Sheets("綜合資料庫").UsedRange
Set F = .Find(xRng, LOOKAT:=xlPart)
If Not F Is Nothing Then AD = F.Address
Do While Not F Is Nothing
If Rng Is Nothing Then
Set Rng = .Rows(F.Row)
Else
Set Rng = Union(Rng, .Rows(F.Row))
End If
Set F = .FindNext(F)
If F.Address = AD Then Exit Do
Loop
End With
If Not Rng Is Nothing Then
Rng.Copy xRng.Offset(, 1)
MsgBox "查詢結束"
Else
xRng.Offset(, 1).Resize(, 50) = ""
End If
End Sub
複製代碼
作者:
GBKEE
時間:
2014-5-8 14:53
回復
11#
jackson7015
Sub MsgBox_Wait()
Dim WshShell, BtnCode
Set WshShell = CreateObject("WScript.Shell")
BtnCode = WshShell.popup("等待2秒不按我就自動關閉?", 2, "測試:", 4 + 16)
Select Case BtnCode
Case 6
BtnCode = "你按了""是""." 'MsgBox "你按了""是""."
Case 7
BtnCode = "你按了""否""." 'MsgBox "你按了""否""."
Case -1
BtnCode = "沒有按任何鍵"
End Select
BtnCode = WshShell.popup(BtnCode, 2, "測試完畢", 1)
End Sub
複製代碼
作者:
jackson7015
時間:
2014-5-9 08:35
回復
12#
GBKEE
感謝GBKEE版大
此程式碼是給它設定秒數,就會再指定時間內 Aoto Close
不過我想詢問的是
開始執行程式碼的時候會出現MsgBox ,然後程式碼執行結束後MsgBox 也跟著消失
以這篇的10樓程式碼為例:
執行程式碼>出現MsgBox "查詢中">查詢結束後>MsgBox 消失
這問題和主題沒有一致,我想還是另開個主題比較合適?
在此由衷的感謝GBKEE版大無私的教導
作者:
GBKEE
時間:
2014-5-9 15:02
這問題和主題沒有一致,我想還是另開個主題比較合適?
回復
13#
jackson7015
無須另開個主題,可繼續下去
試試看 [attach]18247[/attach]
作者:
jackson7015
時間:
2014-5-9 17:00
回復
14#
GBKEE
感謝GBKEE版大的回應
程式執行起來更有系統,也更美觀了
想請問版大
因為有時候搜尋件數會有達到數十件,甚至百件
而大略看了您的編寫,每次會延遲1秒做迴圈
這樣會有很長時間在等待迴圈的運算
是否有直接以MsgBox顯示"搜尋中"
然後搜尋結束後MsgBox框架就會自動消失的編寫方式 ?(不是延遲秒數)
非常感謝GBKEE版大還特別寫了TextBox的程式
作者:
GBKEE
時間:
2014-5-10 14:08
回復
15#
jackson7015
參考這裡
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub 查詢資料()
UserForm1.Show
End Sub
複製代碼
Private Sub UserForm_Activate()
Dim F As Range, AD As String, Rng As Range, i
xRng.CurrentRegion.Offset(1, 1) = ""
Application.Wait Time + #12:00:01 AM#
With Sheets("綜合資料庫").UsedRange
Set F = .Find(xRng, LOOKAT:=xlPart)
If Not F Is Nothing Then AD = F.Address
Do While Not F Is Nothing
i = i + 1
Label1.Caption = xRng & vbTab & "查到 " & i & " 筆"
DoEvents
Sleep 100 '改用暫停0.1秒
' Application.Wait Time + #12:00:01 AM#
If Rng Is Nothing Then
Set Rng = .Rows(F.Row)
Else
Set Rng = Union(Rng, .Rows(F.Row))
End If
Set F = .FindNext(F)
If F.Address = AD Then Exit Do
Loop
End With
If Not Rng Is Nothing Then
Rng.Copy xRng.Offset(, 1)
Else
Label1.Caption = xRng & vbTab & "查無資料"
DoEvents
Sleep 100
'Application.Wait Time + #12:00:01 AM#
End If
Unload Me
End Sub
複製代碼
作者:
jackson7015
時間:
2014-5-12 09:17
回復
16#
GBKEE
感謝GBKEE版大的回覆
原來停留的秒數是程式原本的設定啊,還以為是Application.Wait Time 的關係,想說這編碼好像不能寫小於1秒
這篇討論獲益良多
使用到的相關編碼還有很多不明白的,再慢慢地消化
由衷感謝GBKEE大大的付出,謝謝~
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)