Board logo

標題: [發問] 輸入至不同欄位儲存格來個別找出兩個工作表對應值 [打印本頁]

作者: luke    時間: 2012-9-20 20:19     標題: 輸入至不同欄位儲存格來個別找出兩個工作表對應值

各位大大

1.Sheet2表和Sheet3表為資料列各有數千筆資料.
2.Sheet1表A:C欄為Sheet2輸出區,而D:G欄為Sheet3輸出區.
3.自A7和D7儲存格往下開始做個別資料輸入,例如:
A7儲存格
作者: luhpro    時間: 2012-9-22 09:36

各位大大

1.Sheet2表和Sheet3表為資料列各有數千筆資料.
2.Sheet1表A:C欄為Sheet2輸出區,而D:G欄為Shee ...
luke 發表於 2012-9-20 20:19

Module1
  1. Public v2, v3
複製代碼
ThisWorkBook
  1. Private Sub Workbook_Open()
  2.   Dim rTar As Range
  3.   
  4.   Set v2 = CreateObject("Scripting.Dictionary")
  5.   Set v3 = CreateObject("Scripting.Dictionary")
  6.   
  7.   With Sheets("sheet2")
  8.     For Each rTar In .Range(.[A2], .[A2].End(xlDown))
  9.       v2(rTar & "") = rTar.Row
  10.     Next rTar
  11.   End With
  12.   
  13.   With Sheets("sheet3")
  14.     For Each rTar In .Range(.[A2], .[A2].End(xlDown))
  15.       v3(rTar & "") = rTar.Row
  16.     Next rTar
  17.   End With
  18. End Sub
複製代碼
Sheet1
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.   Dim iI%
  3.   Dim rTar As Range
  4.   
  5.   Set rTar = Target
  6.   With rTar
  7.     Select Case .Column
  8.    
  9.       Case 1 ' 區分
  10.         With .Parent
  11.           For iI = 2 To 3
  12.             .Cells(rTar.Row, iI) = Sheets("sheet2").Cells(v2(rTar.Text), iI)
  13.           Next iI
  14.         End With
  15.    
  16.       Case 4 ' 票號
  17.         With .Parent
  18.           For iI = 2 To 4
  19.             .Cells(rTar.Row, iI + 3) = Sheets("sheet3").Cells(v3(rTar.Text), iI)
  20.           Next iI
  21.         End With
  22.    
  23.     End Select
  24.   End With
  25. End Sub
複製代碼
[attach]12589[/attach]
檔案中 Sheet1 右下資料是保留來驗證用的.
作者: luke    時間: 2012-9-22 13:19

回復 2# luhpro


    謝謝luhpro 回覆

    測試 sheet1表A和D欄任 一儲存格做資料刪除時會出現1004錯誤如下圖示
    [attach]12590[/attach]
   
    以上
作者: GBKEE    時間: 2012-9-22 15:22

回復 3# luke
Sheet1 的程式碼
  1. Option Explicit
  2. Private Sub Worksheet_Change(ByVal Target As Range)
  3.     Dim M As Variant
  4.     Application.EnableEvents = False
  5.     Select Case Target.Column
  6.         Case 1 To 3                             'A-C欄儲存格有資料變動
  7.             M = Application.Match(Cells(Target.Row, 1), Sheets("sheet2").Columns(1), 0)
  8.             '在"sheet2"!A欄 中尋找sheet1!A欄資料
  9.             If IsError(M) Then                  '找不到時 Match函數傳回#N/A 錯誤值
  10.                 Cells(Target.Row, 2).Resize(, 2) = ""
  11.             Else                                '找到時 Match函數傳回儲存格的列號
  12.                 Cells(Target.Row, 2).Resize(, 2) = Sheets("sheet2").Cells(M, 2).Resize(, 2).Value
  13.             End If
  14.         Case 4 To 7                              'D-G欄儲存格有資料變動
  15.             M = Application.Match(Cells(Target.Row, 4), Sheets("sheet3").Columns(1), 0)
  16.             '在"sheet3"!A欄 中尋找sheet1!D欄資料
  17.             If IsError(M) Then
  18.                 Cells(Target.Row, 5).Resize(, 3) = ""
  19.             Else
  20.                 Cells(Target.Row, 5).Resize(, 3) = Sheets("sheet3").Cells(M, 2).Resize(, 3).Value
  21.             End If
  22.     End Select
  23.     Application.EnableEvents = True
  24. End Sub
複製代碼

作者: Hsieh    時間: 2012-9-22 20:33

回復 3# luke

一般模組
  1. Public Dic As Object
  2. Sub Auto_Open()
  3. Dim Sht(), A As Range
  4. Set Dic = CreateObject("Scripting.Dictionary")
  5. Sht = Array("Sheet2", "Sheet3")
  6. For Each sh In Sht
  7.    With Worksheets(sh)
  8.       For Each A In .Range(.[A1], .[A1].End(xlDown))
  9.          Select Case sh
  10.          Case "Sheet2"
  11.          Dic(A.Value) = Array(A.Offset(, 1).Value, A.Offset(, 2).Value)
  12.          Case "Sheet3"
  13.          Dic(A.Value) = Array(A.Offset(, 1).Value, A.Offset(, 2).Value, A.Offset(, 3).Value)
  14.          End Select
  15.         Next
  16.     End With
  17. Next
  18. End Sub
複製代碼
Sheet1模組
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2. If Target.Count > 1 Then Exit Sub
  3. If IsEmpty(Dic(Target.Value)) Or Target.Count > 1 Then Exit Sub
  4. s = IIf(Target.Column = 1, 2, IIf(Target.Column = 4, 3, 0))
  5. k = UBound(Dic(Target.Value)) + 1
  6. If s <> k Then Exit Sub
  7. Application.EnableEvents = False
  8. Target.Offset(, 1).Resize(, k).Value = Dic(Target.Value)
  9. Application.EnableEvents = True
  10. End Sub
複製代碼
存檔後關閉再重新開啟檔案




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