Board logo

標題: [發問] 關於 自動鎖定儲存格 [打印本頁]

作者: kkttin    時間: 2013-10-17 12:43     標題: 關於 自動鎖定儲存格

用了以下VBA
本想輸入資料後 自動鎖定儲存格
用在普通儲存格是可以正常使用

但如果已經合併的儲存格
沒有輸入資料已經自動鎖定

請指教
Thanks
------------------------------------------------

Private Sub Worksheet_SelectionChange
ActiveSheet.Unprotect
  Target.Locked = False
    On Error Resume Next
        If Target <> "" Then
      Target.Locked = True
    ActiveSheet.Protect Contents:=True
   End If
End Sub
作者: luhpro    時間: 2013-10-18 01:18

本帖最後由 luhpro 於 2013-10-18 01:30 編輯
用了以下VBA
本想輸入資料後 自動鎖定儲存格
用在普通儲存格是可以正常使用

但如果已經合併的儲存格
...
kkttin 發表於 2013-10-17 12:43

當標的儲存格是個合併的儲存格時 (.Count > 1),
抓取資料要改用 .Value2(1, 1)
否則不是發生錯誤(.Value)就是得到空值(.Text)
又因為你有一行 On Error Resume Next(發生錯誤時忽略該錯誤,改從下一行指令開始繼續執行),
故而就發生你不想要的結果囉.
改成如下即可 :
  1.   With Target
  2.     .Parent.Unprotect
  3.     .Locked = False
  4.     If .Count = 1 Then
  5.       If .Value <> "" Then
  6.         .Locked = True
  7.         .Parent.Protect Contents:=True
  8.       End If
  9.     Else
  10.       If .Value2(1, 1) <> "" Then
  11.         .Locked = True
  12.         .Parent.Protect Contents:=True
  13.       End If
  14.     End If
  15.   End With
複製代碼
沒記錯的話在 Office 2000 時不會有這個問題, (可以用 .Value 或 . Text 正常抓到合併後的值)
似乎是到 2003 時改的(我家裡用的版本),
我覺得這有點多此一舉,
既然儲存格合併後只能保留一個值,
那多出那些 .Value2(1, 2), .Value2(1, 3)... 沒啥意義.(根本無法使用)

更糟糕的是 我剛剛試著賦予個值給 Target.Value2(1, 2) , (屢試不爽)
它會發生嚴重錯誤且直接關閉 Excel.  O.O"
(若對 [C4].Value2(1, 2) 賦值沒問題, 但對 Target.Value2(1, 2) 賦值就會出大錯)
作者: stillfish00    時間: 2013-10-18 10:36

回復 2# luhpro
沒看過value2這種用法耶,參考 http://support.microsoft.com/kb/213719/zh-tw

我覺得1#的問題是
Target為多個儲存格(合併儲存格也算多個)時,
If Target <> "" Then 中的 Target 比較時會自動使用屬性 .value,
但是此時的 Target.value  為一 value 陣列,故無法比較,發生錯誤
而由於加上 On Error Resume Next 導致去執行下一行的鎖定,應改為:
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.   ActiveSheet.Unprotect
  3.   Target.Locked = False
  4.   
  5.   If Target.Cells(1).Value <> "" Then
  6.     Target.Locked = True
  7.     ActiveSheet.Protect Contents:=True
  8.   End If
  9. End Sub
複製代碼
補充給1#,發生error時不要隨便加On Error Resume Next去忽略它,除非你明確的知道它是甚麼錯誤,是不是可以忽略。
作者: luhpro    時間: 2013-10-20 19:28

回復  luhpro
沒看過value2這種用法耶,參考 http://support.microsoft.com/kb/213719/zh-tw

我覺得1# ...
stillfish00 發表於 2013-10-18 10:36

你說的也是對的.

但 value2 絕對可以用,(2# 與 3 # 說的是同一個東東)
因為那是在 "區域變數" 視窗中檢視 Target 儲存格資料時看到的內容(按 Target 變數左邊的 + 逐層檢視就可看到),
也是 Excel VBA 真正儲存相關資料的形式.

你說的應該是 Excel VBA 對應到 value2 的另一種用法 - 用 Value. (如同 Value 與 Text 一樣都是對應到儲存格的值)

當然, 若真動到 "區域變數" 視窗內容這個部份,
有時確實會發生無法預期的錯誤,
因為,Excel VBA 其實有很多地方做的都不夠完善, (有點過那個 + 的人就會知道, 一個儲存格裡包含的東東還真是多啊...)
有可能會發生 "設計者所無法預期的錯誤" .(就像我 2# 所提到的那個)




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