Board logo

標題: [發問] 在worksheet__SelectionChange無法取得另一工作表的物件 [打印本頁]

作者: dechiuan999    時間: 2010-9-24 06:34     標題: 在worksheet__SelectionChange無法取得另一工作表的物件

各位大大好:

  小弟想利用Worksheet_SelectionChange(ByVal Target As Range)
方式處理,但為何無法取得另一工作表的儲存格物件呢?

說明如下:

工作表一、sheets1("test")  '學生成績

定義名稱:student
範圍:c8-h20

工作表二、sheets1("tel")   '學生基本資料

定義名稱:telNo
範圍:c8-f20

現想在工作表一的定義名稱的第一欄
的選定單一儲存格時,可以核對工作表二
的學生資料是否相同。如工作表一的資料
不符時可自動修正。

以下是小弟的語法,不知如何修正才正確呢?

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   
    Dim mSht1 As Worksheet
    Dim mSht2 As Worksheet
    Dim mRng1 As Range
    Dim mRng2 As Range, mRng3 As Range
    Dim mStr1$, mStr2$, mStr3$, nStr1$, nStr2$, nStr3$
    Dim s1%, s2%, m1%, m2%, m3%
   
    On Error Resume Next
    If Intersect(Target, [student].Columns(1)) Then
        'MsgBox Target.Address
        s1 = Target.Row - [student].Row + 1
               
    End If
   
    Set mRng1 = Range("student")
    'MsgBox mRng1.Address
   
    mStr1 = mRng1.Cells(s1, 1)
    mStr2 = mRng1.Cells(s1, 2)
    mStr3 = mRng1.Cells(s1, 3)
        
    Application.Goto Range("telNo")
    Set mRng2 = Range("telNo").Columns(1)    '設定物件無效
    MsgBox mRng2.Address
    Set mRng3 = mRng2.Find(what:=mStr1, lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlNext)  '執行失敗
   
    If Not mRng3 Is Nothing Then
        nStr1 = mRng3.Value
        nStr2 = mRng3.Offset(, 1).Value
        nStr3 = mRng3.Offset(, 2).Value
            
        If mStr1 = nStr1 Then
            
            If mStr2 <> nStr2 Then
                m1 = m1 + 1
            ElseIf mStr3 <> nStr3 Then
                m2 = m2 + 1
            End If
            
            If m1 > 0 Then
                Range("student").Cells(s1, 2) = nStr2
            ElseIf m2 > 0 Then
                Range("student").Cells(s1, 3) = nStr3
            End If
        End If
            
    End If     
   
   
End Sub

謝謝各位大大
作者: oobird    時間: 2010-9-24 08:47

Application.Goto [telNo]
    Set mRng2 = Application.Index([telNo], , 1)
作者: dechiuan999    時間: 2010-9-24 21:00

謝謝超級版主大大。

小弟引用版主大大的index函數已
能完成運作。但小弟不了解
為何小弟的語法卻無法參照到
另一工作表的儲存格位置呢?

感謝版主大大。
作者: oobird    時間: 2010-9-24 21:15

就是本工作表也參照不到啊!
作者: Hsieh    時間: 2010-9-24 21:16

因為你的儲存格切換動作是在Sheet1
以Set mRng2 = Range("telNo").Columns(1)這樣的方式指定範圍必須加上指明工作表
Set mRng2 = Sheet2.Range("telNo").Columns(1)
作者: dechiuan999    時間: 2010-9-25 04:41

謝謝二位版主大大的明示。

那小弟所引用的
Application.Goto Range("telNo")
的語法也就毫無作用。因此無法指定到此
定義範圍內了嗎?
作者: Hsieh    時間: 2010-9-25 10:06

定義名稱的引用若使用中括號就是直接引用名稱
用Range就被視為儲存格,若在不同工作表引用就必須指名工作表
因為在作用中工作表內並無以該名稱命名的區域
你試著做做看
1.選取Sheet1的A1:A20,名稱方塊輸入Rng,按enter
2.在Sheet2模組輸入
  1. Sub nn()
  2. MsgBox [Rng].Address
  3. MsgBox Sheet1.Range("Rng").Address
  4. MsgBox Range("Rng").Address
  5. End Sub
複製代碼
執行程序nn,會發現MsgBox Range("Rng").Address產生錯誤
3.在Sheet1模組輸入
  1. Sub yy()
  2. MsgBox Range("Rng").Address
  3. End Sub
複製代碼
執行yy程序就能找到該範圍
作者: dechiuan999    時間: 2010-9-25 10:45

謝謝版主大大。

版主的金玉良言
"學海無涯_不恥下問"
讓小弟的收穫更加豐富。

感恩大大!




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