Board logo

標題: [發問] む附圖めむ附程式碼めVBA新手求解 [打印本頁]

作者: chengchi1223    時間: 2016-6-28 10:31     標題: む附圖めむ附程式碼めVBA新手求解

各位大大你們好,小弟這兩天剛接觸VBA,想解決工作上的困擾,
我是一邊錄製巨集,一邊看語法學的,不過很快就陷入瓶頸了,麻煩各位指導一下

以下弄了個較簡單的兩個EXCEL檔,想學習根本的應用,之後再自己套用到工作的文件
目標:從 活頁簿2 中,選取 錯誤編號 的值,再到 活頁簿1 中,
   找到相同的值並將該列以 黃色 填滿

活頁簿1:
[attach]24576[/attach]
活頁簿2:
[attach]24577[/attach]
希望的結果:
[attach]24578[/attach]
悲慘的程式碼:
[attach]24579[/attach]

附上程式碼文字檔:
Sub 巨集12()
Dim i, n As Integer '宣告 整數i
Dim x As String '宣告 字串x
Dim y As Range '宣告儲存格範圍...?

    Windows("活頁簿1.xlsx").Activate '開啟 全部編號 的 EXCEL視窗
    Range("D1").Select '選定D1(總筆數)
    n = Selection.Value '儲存總筆數 到 n,供下列的迴圈使用

    For i = 3 To (n + 1) Step 1 '有幾筆錯誤編號就執行幾次
        Windows("活頁簿2.xlsx").Activate '開啟 錯誤編號 的 EXCEL視窗
        Range("A" & i).Select '選取儲存格
        x = Selection.Copy '複製已選取的儲存格
        Windows("活頁簿1.xlsx").Activate '開啟 全部編號 的 EXCEL視窗
        
        Set y = Range("A2", "A50000").Find(x, LookIn:=xlValues)
        '其實能搜尋整個A欄就可以了,但我還不太會寫,所以才寫這樣,50000是因為值不會超過這數字
        '這段主要是想要達到"搜尋的功能,別問我為什麼要多一個y來儲存... 因為程式這樣才跑得動 QQ"
            
            If Not y Is Nothing Then
                y.Select '選取搜尋結果的儲存格...?
                '我承認這邊亂寫...
               
                Application.CutCopyMode = False '我不太知道這行的功用
                With Selection.Interior '改變搜尋結果的儲存格的顏色(這裡不知道怎麼選取整列)
                    .Pattern = xlSolid
                    .PatternColorIndex = xlAutomatic
                    .Color = 65535
                    .TintAndShade = 0
                    .PatternTintAndShade = 0
                End With
               
            End If
    Next i
End Sub


稍微整理一下我的問題:
1. "搜尋"的語法、能否一次搜尋多筆資料(不然資料100筆以上就會跑很久)
2. 如果搜尋結果不存在可否將其資料在另外一個地方顯示或儲存
(雖然工作上應該不會出現這狀況,但如果發生還是希望能找出來,畢竟這表示整個文件可能有問題了...)
3. 改變儲存格填滿顏色的部分,有更簡短的語法嗎?(with裡面的內容不太瞭解)
4. 如何將某個儲存格的位置存到變數值內,再使用select或其他方式選取該儲存格(也就是看起來很詭異的那句 "y.Select" 想達成的作用)

問題有點雜,還請各位能提點一下小弟,感激不盡
作者: c_c_lai    時間: 2016-6-28 12:30

回復 1# chengchi1223
以單一活頁簿的模式,而做的範例:
  1. Sub Ex()
  2.     Dim sh As Worksheet, dat As Variant, rw As Range
  3.    
  4.     Set sh = Sheets("工作表2")
  5.     With Sheets("工作表3")
  6.         For Each dat In Range(.Range("A2"), .Range("A2").End(xlDown))
  7.             Set rw = sh.Range("A2:A" & sh.Range("A2").End(xlDown).Row).Find(dat, , LookIn:=xlValues, LookAt:=xlWhole)
  8.             If Not rw Is Nothing Then
  9.                 sh.Rows(rw.Row).Interior.ColorIndex = 6
  10.             End If
  11.         Next
  12.     End With
  13. End Sub
複製代碼
[attach]24580[/attach]
作者: chengchi1223    時間: 2016-6-28 14:09

回復 2# c_c_lai


感謝c_c_lai大大的範例程式,短短幾行就幾乎完成我所有要求,實在太厲害了
各句語法讀起來也十分清楚,唯獨
  1. Find(dat, , LookIn:=xlValues, LookAt:=xlWhole)
複製代碼
這部分有些疑問:
1. LookAt常數可以為 xlWhole 或 xlPart,這兩個差異在哪呢?
 兩個都試過,至少在這程式內執行都沒有出錯,所以不明白其中差異
2. dat 及 LookIn:=xlValues 之間有兩個逗點是多打了嗎?還是空下After的值?有什麼特別的目的嗎?
 跟 1. 一樣刪除與否在這程式內都不影響結果

以上兩點一樣算是很基礎的問題... 還請大大指導 
作者: chengchi1223    時間: 2016-6-28 14:15

另外附上些微修改的程式碼,增加註解上去,有理解錯誤的地方還請不吝指正
  1. Sub 從工作表1中_標出工作表2的值()
  2.     Dim sh As Worksheet, dat As Variant, rw As Range
  3.     'sh 為工作表;dat 為變數(無特定型態);rw 為儲存格
  4.    
  5.     Set sh = Sheets("工作表1") '指派 工作表1 給 sh
  6.    
  7.     With Sheets("工作表2") '對 工作表2 執行下列內容
  8.    
  9.         For Each dat In Range(.Range("A2"), .Range("A2").End(xlDown)) '對 工作表2 內, A2以下的每個儲存格執行下列內容
  10.             
  11.             Set rw = sh.Range("A2:A" & sh.Range("A2").End(xlDown).Row).Find(dat, , LookIn:=xlValues, LookAt:=xlWhole)
  12.             '將在 工作表1 中找到的那個儲存格(與 工作表2 中的值相同)指派給 rw
  13.             
  14.             If Not rw Is Nothing Then '若rw有值存在,執行下列內容
  15.                 sh.Rows(rw.Row).Interior.ColorIndex = 6 '將 工作表1 中 rw 那一列顏色屬性改為黃色
  16.             End If
  17.             
  18.         Next
  19.         
  20.     End With
  21.    
  22. End Sub
複製代碼

作者: c_c_lai    時間: 2016-6-28 16:56

本帖最後由 c_c_lai 於 2016-6-28 17:35 編輯

回復 3# chengchi1223
Range.Find 方法 (Excel)
    Find(dat, , LookIn:=xlValues, LookAt:=xlWhole) 等於
    Find(dat, LookIn:=xlValues, LookAt:=xlWhole)
    ---------------------------------------------------
運算式.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
P.S.   運算式.Find(Required, 選用, 選用, 選用, 選用, 選用, 選用, 選用, 選用)
運算式 代表 Range 物件的變數。
如果只標示 (A2 = 2) : Find(dat, LookIn:=xlValues) 它會抓到  2 或者是 12
(部分吻合 LookAt:=xlPart), 所以才指名要 LookAt:=xlWhole ( 2 = 2)。
作者: c_c_lai    時間: 2016-6-28 17:03

回復 4# chengchi1223
沒錯,解析得很好, rw 為 Range 引入值,
是故 sh.Rows(rw.Row) 的 rw.Row 即為
其目前所在位址 (rw.Address) 的列號 (行數)。
如此你便可以自行去延伸為兩個活頁簿應用了。




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