Board logo

標題: 間斷輸入時 如何讓程式也可以帶出資料 [打印本頁]

作者: hugh0620    時間: 2011-1-7 12:46     標題: 間斷輸入時 如何讓程式也可以帶出資料

Dear 大大

     小弟現有一個問題 就是報表在輸入時,使用者會跳著輸入資料,但我的寫法卻無法克服這個問題
     請大大教導一下小弟,也順便有新的思維,以後遇到這樣的問題,就可以自行解決

    附件為問題之範本[attach]4342[/attach]
作者: oobird    時間: 2011-1-7 17:00

這種目的應該用Worksheet_Change事件而不是Worksheet_SelectionChange事件。
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Or Target.Column <> 2 Then Exit Sub
  3. On Error Resume Next
  4. Target(1, 2) = Sheet2.[b:b].Find(Target, , , 1)(1, 2).Value
  5. End Sub
複製代碼

作者: hugh0620    時間: 2011-1-10 09:56

回復 2# oobird
  

     Dear 大大~  我將你撰寫的程式碼放入到範本中,但執行卻完全無任何動作
                :dizzy:
              大大 之前我也有試過Private Sub Worksheet_Change(ByVal Target As Range)
                     但可能我的寫法上有錯~ 它會一直計算
              所以~ 我才改成Private Sub Worksheet_SelectionChange(ByVal Target As Range)
                       當選擇的有改變時就計算~
作者: hugh0620    時間: 2011-1-10 11:31

回復 2# oobird

Dear 大大

     後來我有測試把其中的一行拿掉就可以達到需求,但這行拿掉會不會有什麼樣的問題呢??

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Or Target.Column <> 2 Then Exit Sub  <----把該行拿掉就可以執行
On Error Resume Next
Target(1, 2) = Sheet2.[b:b].Find(Target, , , 1)(1, 2).Value
End Sub
作者: oobird    時間: 2011-1-10 13:38

If Target.Count > 1 Or Target.Column <> 2 Then Exit Sub  
這行是限定對單一儲存格輸入同時輸入的欄位必須是b欄才會執行動作。
你若拿掉會在任何地方輸入或改變時都執行。
作者: hugh0620    時間: 2011-1-10 14:05

回復 5# oobird

    Dear 大大
     Target <---這個意思是什麼 我用F1查詢被未找到這個字的用法跟說明
作者: hugh0620    時間: 2011-1-10 15:04

Dear 大大

     若假設我需要從Data1與Data2中 各自的Sheet中比對資料後,將資料帶出來,這樣該如何修改
     說明:
       1. 在sheet[輸入]中,{A}填入資料帶出DATA1中的B欄位資料
     2. 利用B欄位資料帶出DATA2中C欄位資料
        (先前條件Data1與Data2的表格資料是在未加工且不能整合在一起的情況下)
     問題如附件之範本[attach]4363[/attach]
作者: GBKEE    時間: 2011-1-10 15:32

回復 6# hugh0620
回復 7# hugh0620
  1. Private Sub Worksheet_Change(ByVal 變數 As Range)
  2.     Dim I
  3.     If 變數.Count > 1 Or (變數.Column <> 2 And 變數.Column <> 3) Then Exit Sub
  4.         If 變數.Column = 2 Then
  5.             Sh = "Data1"
  6.             I = Application.Match(變數, Sheets("Data1").[B:B], 0)
  7.             If IsNumeric(I) Then
  8.             變數(1, 2) = Sheets("Data1").Cells(I, "C")
  9.             Else
  10.                 變數(1, 2) = ""
  11.             End If
  12.         ElseIf 變數.Column = 3 Then
  13.             I = Application.Match(變數, Sheets("Data2").[B:B], 0)
  14.             If IsNumeric(I) Then
  15.                 變數(1, 2) = Sheets("Data2").Cells(I, "C")
  16.             Else
  17.                 變數(1, 2) = ""
  18.             End If
  19.     End If
  20. End Sub
複製代碼

作者: solely    時間: 2011-1-10 16:00

回復 7# hugh0620
以oobird版主的程式碼來修改的話
第2行改>3, 再新增第5行即可~
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Or Target.Column > 3 Then Exit Sub
  3. On Error Resume Next
  4. Target(1, 2) = Sheet2.[b:b].Find(Target, , , 1)(1, 2).Value
  5. Target(1, 2) = Sheet3.[b:b].Find(Target, , , 1)(1, 2).Value
  6. End Sub
複製代碼

作者: hugh0620    時間: 2011-1-10 16:00

回復 8# GBKEE


    Dear 大大
        你的方式可以完全解決我的問題,並且也很簡單的增加(或擴增)我的其他條件~
            但大大 我有幾個地方看不懂
        1. 變數.Count   ?????????
            2.IsNumeric(I) 是否解讀 IsNumeric判別[I]是TRUE或是FALSE

    另外我是用另外一個大大的寫法來修改,請大大幫忙看一下,這樣的寫法有什麼樣的缺失
   If (Target.Count > 1 Or Target.Column <> 2) And (Target.Count > 2 Or Target.Column <> 3) Then Exit Sub
         On Error Resume Next
         Target(1, 2) = Sheet2.[b:b].Find(Target, , , 1)(1, 2).Value
     If Target.Count > 2 Or Target.Column <> 3 Then Exit Sub
         On Error Resume Next
         Target(1, 2) = Sheet3.[b:b].Find(Target, , , 1)(1, 2).Value
作者: GBKEE    時間: 2011-1-10 16:44

回復 10# hugh0620
1. 變數.Count   ?????????
Private Sub Worksheet_Change(ByVal 變數 As Range)
Range是物件  .Count 傳回物件子集合的計數

2.IsNumeric(I) 是否解讀 IsNumeric判別[I]是TRUE或是FALSE
   對的

你所附上的程式可參可9樓所修改的程式碼較為簡潔
On Error Resume Next 使用上要小心 ,如程式碼有寫錯後,執行上是不易查出錯誤在哪裡的.
作者: hugh0620    時間: 2011-1-10 17:19

回復 11# GBKEE

   謝謝大大的提醒~ 在使用上會嚴謹些
    大大是否可以舉例 On Error Resume Next 會不明易發現錯務的情況~ 給後學的晚輩參考~
作者: hugh0620    時間: 2011-1-10 18:37

回復 11# GBKEE


    Dear 大大
        唉~ 又有問題了
        因為我的資料輸入共分成兩塊
        Part1:輸入[A]後帶出[B][C]
            Part2:輸入[B1][C1]帶出[A1]  PS:Part1與Part2在同一行上,可以分別滿足各自的條件後,自行重覆運算
            用Worksheet_SelectionChange或Worksheet_Change,可以自動外出[A][A1],但是需要[A]再按一次(CHANGE),才會再運算
        除了用CommandButton(該填的地方填完後再按),是否有其他方式可以克服,只要我滿足我所需要的條件後,就計算
        附件為問題之範本[attach]4364[/attach]
作者: oobird    時間: 2011-1-10 18:40

例如a1與b1儲存格都是文字不是數字,不能做運算。
程式碼:
On Error Resume Next
[c1] = [a1] * [b1]
這樣它不會告訴你任何錯誤訊息。
作者: Hsieh    時間: 2011-1-10 19:44

回復 13# hugh0620
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Then Exit Sub
  3. Select Case Target.Column
  4. Case 2
  5. Set a = Sheets("DATA1").Columns(2).Find(Target, lookat:=xlWhole)
  6. If Not a Is Nothing Then Target.Offset(, 1) = a.Offset(, 1)
  7. Case 3
  8. Set a = Sheets("DATA2").Columns(2).Find(Target, lookat:=xlWhole)
  9. If Not a Is Nothing Then Target.Offset(, 1) = a.Offset(, 1)
  10. Case 6
  11. If Target <> "" And Target.Offset(, 1) <> "" Then Target.Offset(, -1) = Target * Target.Offset(, 1)
  12. Case 7
  13. If Target <> "" And Target.Offset(, -1) <> "" Then Target.Offset(, -2) = Target * Target.Offset(, -1)
  14. End Select
  15. End Sub
複製代碼

作者: hugh0620    時間: 2011-1-11 18:12

回復 15# Hsieh


    Dear 大大 若現在改成用按鈕式的方式處理 (主要是我有一部份資料要自動計算~一部份是需要匯出後資料回填後再計算~)
             這樣 ByVal Target As Range 是否就無法使用了
             該如何處理讓間斷的資料可以在按下按鈕後進行運算~
                   問題範本不變 (最後一次的範本)
作者: Hsieh    時間: 2011-1-11 18:18

回復 16# hugh0620
你的問題應該是出在流程上
請說明檔案使用流程,按鈕作用是甚麼?
把問題敘述清楚,才能得到解答
作者: FAlonso    時間: 2011-1-11 21:41

回復 7# hugh0620
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Or Target.Column <> 2 Then
  3. Exit Sub
  4. End If
  5. On Error Resume Next
  6. Target(1, 2) = Sheet2.[B:b].Find(Target)(1, 2).Value
  7. Target(1, 3) = Sheet3.[B:b].Find(Target(1, 2))(1, 2).Value

  8. End Sub
複製代碼
另外按鍵問題,要回到傳統的sub(),這樣做會很麻煩




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