返回列表 上一主題 發帖

[分享] VBA分享-效果蠻類似VLOOKUP查詢,只是可以兩欄互查

回復  infoverdad
不錯的分享,另用 Find 方法  分享.
GBKEE 發表於 2011-7-18 20:23


GBKEE版大好
小弟是剛開始自學vba的初心者,看到這模擬vlookup的程式很想學習。
由於註冊論壇也沒多久,所以沒辦法下載infoverdad大大的附件。
只好看您寫的程式來揣摩,只是礙於我是初心者,其實也根本看不懂你在寫什麼。
後來我只好一句一句的用F1慢慢查,然後再看infoverdad大大貼的圖,用瞎猜的方式做出那一個工作表。
我不確定我做的對不對,至少能發揮跟infoverdad大大說的類似vlookup查詢功能的效果。

以下,想請您幫我看看我做的對不對,我是直接貼上您的程式,然後畫出來的工作表。


大概就是圖中的工作表貼上您的程式可以正常運作。

但重點是我大概知道程式中每一列的作用,但我不懂每一句實際上的用法。
所以想請教您,不曉得您能不能用白話一點的方式為我解釋一下,謝謝~~

Private Sub Worksheet_Change(ByVal Target As Range)  '這一句是不是當target的儲存格有變動的時候就讓sub內的程式執行? 只是為什麼這個sub必須加上private?

    Dim wsLists As Worksheet, Rng As Range 'dim我翻書知道大概是宣告的意思吧,所以整句的意思是宣告wsLists是工作表,rng是範圍?

    If Target.Count > 1 Then Exit Sub '這句就是我遇到第一個不會的了,if的部分沒什麼問題,target跟Exit Sub我也曉得,只是Count是什麼意思啊?我搞不清楚Count,用F1的說明我實在也看不懂@@

    Set wsLists = Worksheets("Lists") '這個是把Lists這個sheet指定給wsLists

    Application.EnableEvents = False '這句我google了好久,半知半解,是不是指false的時候先停止這段程式的運作,等被Application.EnableEvents = False跟true包起來的這段程式確實跑完,Application.EnableEvents 變成true,程式才會確實執行?

    If Target.Column = 2 Then '這是指target的行數=2就then

        Set Rng = wsLists.Range("A:A").Find(Target, LookAt:=xlWhole, MatchCase:=True) '這個是用find開始查詢了,指定給rng,只是我不懂lookat:=xlWhole是什麼意思,F1的說明也沒有特別說明xlWhole是在幹嘛,MatchCase:=True是把大小寫也列入判斷條件裡吧?
      
          With Target.Offset(0, 1) '這邊是讓target的結果往右飄一格,只是我不懂為什麼要用with

            If Not Rng Is Nothing Then .Value = Rng.Offset(0, 1).Value Else .Value = ""  'Not Rng Is Nothing,我想了很久,所以應該是負負得正的意思?

下面的東西就是再重複一次只是方向不同對吧?

        End With
    ElseIf Target.Column = 3 Then
        Set Rng = wsLists.Range("B:B").Find(Target, LookAt:=xlWhole, MatchCase:=True)
        With Target.Offset(0, -1)
            If Not Rng Is Nothing Then .Value = Rng.Offset(0, -1).Value Else .Value = ""
        End With
    End If
    Application.EnableEvents = True
End Sub

以上,我問的方式很無腦,因為我對VBA實在是沒什麼基礎可言。
不過我是真的很想學,如果GBKEE版大不嫌麻煩的話,還請您幫我解惑一下。
請盡可能白話一點,F1的說明有的部份我看得很模糊.......
謝謝~~(跪)

TOP

我好想下載來看看,光是看代碼實在看不明白

TOP

感謝分享, 謝謝

TOP

感謝分享, 謝謝

TOP

回復 10# infoverdad


請問 infoverdad

您附檔的test,若要把資料顯現方式,從『左右』改為『上下』時要如何改,研究了好久,想從 offset去改,可是找不地方可以改?可以指導一下嗎?
peter460191

TOP

感謝版大的分享,目前還是無法下載參考.. 只能透過分享的程式碼來測驗

TOP

本帖最後由 infoverdad 於 2011-7-19 11:11 編輯

我自己修改了一下,不過不知可否再精簡?
另附上測試檔. VBA TEST2.rar (7.57 KB)
  1. Private Sub Worksheet_Change(ByVal Target As Excel.Range)
  2. Dim A As Range, c As Integer, s As Range

  3. On Error GoTo errHandler

  4. Application.EnableEvents = False
  5. With Target.Validation
  6. Set s = Evaluate(.Formula1)
  7. End With
  8. Set A = s.Find(Target, lookat:=xlWhole)


  9. If Not A Is Nothing Then '檢查是否有內容被清空

  10. c = IIf(A.Column = A.CurrentRegion.Column, 1, -1)
  11. Target.Offset(, c) = A.Offset(, c)
  12. Application.EnableEvents = True

  13. Else '當有內容被清空時之處理

  14.    GoTo exitHandler

  15. End If

  16. exitHandler:
  17. Application.EnableEvents = True
  18. Exit Sub

  19. errHandler:
  20. 'MsgBox Err.Number & ": " & Err.Description
  21. GoTo exitHandler
  22. End Sub
複製代碼

TOP

好感謝兩位超級版大的指導,等一下來用用看.

TOP

回復 7# GBKEE


還是你心思細膩,這個判斷我原先是有寫進去
只是後來認為清單內的選項所以省略
這個判斷,想想還是必要,因為就算是驗證,還是容許清空內容
學海無涯_不恥下問

TOP

本帖最後由 GBKEE 於 2011-7-19 08:48 編輯

回復 6# Hsieh超版
我的意思是有驗證清單的儲存格式是允許輸入空白值的,如輸入值是 空白值,
Set A = s.Find(Target, lookat:=xlWhole) 傳回 A Is Nothing
你4樓的程式, 在樓主的檔案會產生錯誤.

TOP

        靜思自在 : 忘功不忘過,忘怨不忘恩。
返回列表 上一主題