返回列表 上一主題 發帖

[發問] 垂直欄位項目轉至水平列顯示

Private Sub Worksheet_Change(ByVal Target As Range)
Dim xR As Range, M
With Target
   If .Column <> 2 Or .Columns.Count > 1 Then Exit Sub '非第2欄,或選取兩欄以上,跳出
   On Error GoTo 999 '發生錯誤時,執行標記999那行程式
   Application.EnableEvents = False '關閉事件觸發
   For Each xR In .Cells '歷遍選取區全部儲存格(可使用貼上多個)
     If xR.Row > 2 Then
      xR(1, 2).Resize(1, 99).ClearContents '清除右方原有資料
      M = Application.Match(xR, [2:2], 0) '找出Item在第2列的位置
      If IsNumeric(M) Then xR(1, M - 1) = 1 '若有符合,填入1
    End If
   Next
End With
999: Application.EnableEvents = True '恢復事件觸發
End Sub

TOP

本帖最後由 准提部林 於 2015-12-25 18:50 編輯

回復 10# kasa


1)在未特別寫出定義M變數屬性,是預設定義為integer嗎? 
_因MATCH會產生〔整數〕及找不到時〔#N/A],所以,M不可事先定義(預設為Variant),否則程式會錯誤而中斷! 
 其後才有 If IsNumeric(M) Then 作判斷! 

(2)請您指導以下寫這3行的真實對應含義 
   On Error GoTo 999  '發生錯誤時,執行標記999那行程式
_因下一行為〔關閉事件觸發〕,若在〔主處理段〕發生錯誤中斷,程式即跑不到〔恢復事件觸發〕那一行,
 當〔取消〕程式的〔中斷〕提示後,所有的〔事件觸發〕即失效無法運作! 
 (註:因主處理段有對工作表做 Change 的動作,為免〔連鎖反應〕,應先關閉。) 
 Application.EnableEvents = False '關閉事件觸發
 ∼∼主處理段∼∼
   999: Application.EnableEvents = True  '恢復事件觸發 

(3)xR(1, 2)==>這個指的是?
_For Each xR In .Cells
 若將資料貼在[B3:B6],則 xR 依次為 B3.B4.B5.B6,
 以 B3 為例,xR(1, 2) 等同 xR.Cells(1, 2),亦即為其〔右一格〕 C3,
 xR(1, 2).Resize(1, 99).ClearContents 即以C3為始,向右取99格清除 

TOP

回復 16# kasa


[B3].cells(1,1)
[B3].offset(0,0)
都是[B3]本尊

TOP

        靜思自在 : 我們最大的敵人不是別人.可能是自己。
返回列表 上一主題