Board logo

標題: 不同工作表內的資料比對與填入. [打印本頁]

作者: MRSA    時間: 2011-1-9 17:23     標題: 不同工作表內的資料比對與填入.

本帖最後由 MRSA 於 2011-1-9 17:41 編輯

Worksheet 1:
   A   B   C
1  12  aaa  high
2  84  daw  light
3  28  add  done

Worksheet 2:
   A   B
1  28  sale
2  45  lock
3  84  lock

我想依照兩個工作表中的A欄位內的數值比對出Worksheet 2裡B欄位的值,並填至Worksheet 1 的D欄位內,若Worksheet 2內沒有Worksheet 1裡A欄位內的數資,則D欄位顯示空白。
執行結果如下:
Worksheet 1:
   A   B   C   D
1  12  aaa  high  
2  84  daw  light  lock
3  28  add  done  sale

請問我該怎麼寫語法?
我用函數vlookup寫的時候,只要在worksheet 2裡找不到資料時,vba就卡住了。
作者: asus103    時間: 2011-1-9 17:44

本帖最後由 asus103 於 2011-1-9 17:45 編輯

於SHEET 1 的D1中寫入
=IF(ISERROR(VLOOKUP(A1,Sheet2!A:B,2,FALSE)),"",VLOOKUP(A1,Sheet2!A:B,2,FALSE))
再向下拉
作者: MRSA    時間: 2011-1-9 17:49

回復 2# asus103


使用excel函數這個我知道怎麼寫.
我的問題是,我要使用VBA進行這項工作.我該怎麼寫語法?
作者: GBKEE    時間: 2011-1-9 18:51

回復 3# MRSA
  1. Sub Ex()
  2.     Dim E As Range, I
  3.     For Each E In Sheet1.Range("A:A").SpecialCells(xlCellTypeConstants)
  4.         I = Application.Match(E, Sheet2.Range("A:A"), 0)
  5.         If IsNumeric(I) Then E.End(xlToRight).Offset(, 1) = Sheet2.Cells(I, "B")
  6.     Next
  7. End Sub
複製代碼

作者: MRSA    時間: 2011-1-9 19:33

回復 4# GBKEE


謝謝.
這是我沒用過的語法.
問題得到解決了.
再來我會研究一下這些語法的內容.
作者: linshin1999    時間: 2011-1-9 22:59

回復 4# GBKEE

請問  宣告式
        1).Dim E As Range , I   和    Dim  E, I  As Range   是一樣的意思嗎?

        2).For Each E In Sheet1.Range("A:A").SpecialCells(xlCellTypeConstants)
            中如果只這樣寫  Sheet1.range("A:A")  和  Sheet1.Range("A:A").SpecialCells(xlCellTypeConstants) 的差別在那裡? 不是都會掃描一遍嗎?

        3).I = Application.Match(E, Sheet2.Range("A:A"), 0)
            這樣一行這會在Sheet2.Range("A:A")掃描出相等的資嗎?

        4.)If IsNumeric(I) Then E.End(xlToRight).Offset(, 1) = Sheet2.Cells(I, "B")
            為什麼要作做  IsNumeric(I) 這個動作 呢?

作者: HUNGCHILIN    時間: 2011-1-9 23:10

這則好像有考試的感覺
一看到第1項就知道不一樣
舉個例子
Sub DimAs1()
Dim Mynum1, Mynum2 As Integer '這條 Mynum1 不會變Integer
Dim Total As Integer, MyString As String * 4 '字串長度為4

    MyString = _
    "撰寫小技巧": MsgBox MyString: MsgBox TypeName(MyString)

End Sub
作者: linshin1999    時間: 2011-1-9 23:47

回復 7# HUNGCHILIN

   阿吉版主:不是考試,是真的不懂,經過你的解釋意思是這樣的嗎?

   Dim a, b As Intger

   1)a 和 b 的型別是不一樣的. (a 是 Variant <Excel 的預設型別> ), b 是Integer .
   2)意思是 Dim 後面的",", 是一個一個變數的分隔, 每個變數都是獨立的.

   希望這次真的搞懂了,寫 VBA 時常在這裡出錯.

作者: Hsieh    時間: 2011-1-10 00:04

回復 6# linshin1999


            2).For Each E In Sheet1.Range("A:A").SpecialCells(xlCellTypeConstants)
            中如果只這樣寫  Sheet1.range("A:A")  和  Sheet1.Range("A:A").SpecialCells(xlCellTypeConstants) 的差別在那裡? 不是都會掃描一遍嗎?
這是不同的,SpecialCells(xlCellTypeConstants)是常數儲存格,也就是會略過空格。你用錄製巨集方式,選取A欄/常用/尋找與取代/特殊/常數看看程式碼就知道
        3).I = Application.Match(E, Sheet2.Range("A:A"), 0)
            這樣一行這會在Sheet2.Range("A:A")掃描出相等的資嗎?
這是利用工作表函數MATCH找到對應位置,若沒找到正確資料會傳回錯誤植
        4.)If IsNumeric(I) Then E.End(xlToRight).Offset(, 1) = Sheet2.Cells(I, "B")
            為什麼要作做  IsNumeric(I) 這個動作 呢?
如果 Application.Match(E, Sheet2.Range("A:A"), 0)能找到對應值,表示I彙是個長整數,所以是數值,沒找到就應是錯誤植,可用ISERROR函數測試。
您對EXCEL VBA的熱忱,小弟十分敬佩,不過在此提醒您,VBA還是要由EXCEL基本操作及功能著手,才能事半功倍。
作者: Hsieh    時間: 2011-1-10 00:10

回復 1# MRSA
  1. Sub Ex()
  2. Set d = CreateObject("Scripting.Dictionary")
  3. With Sheets(2)
  4. For Each a In .Range(.[A1], .[A65536].End(xlUp))
  5.    d(a.Value) = a.Offset(, 1)
  6. Next
  7. With Sheets(1)
  8. For Each a In .Range(.[A1], .[A65536].End(xlUp))
  9.    a.Offset(, 3) = d(a.Value)
  10. Next
  11. End With
  12. End With
  13. End Sub
複製代碼

作者: asus103    時間: 2011-1-10 08:15

回復 10# Hsieh
Hsieh大大
每一次看到您對dictionary使用的出神入化,總是忍不住讚嘆
有一是請教
With Sheets(2)中的End With為何放到最底下呢?
可以放在With Sheets(1)之前嗎?
作者: GBKEE    時間: 2011-1-10 16:24

With Sheets(2)中的End With為何放到最底下呢?
可以放在With Sheets(1)之前嗎?asus103 發表於 2011-1-10 08:15

可以的
With Sheets(2)中的End With寫在With Sheets(1)之前 並不影響整個程式結構
作者: HUNGCHILIN    時間: 2011-1-10 18:38

回復 8# linshin1999
:)   正確
這部份關係到程式速度與正確性要稍熟複習一下會較順
作者: asus103    時間: 2011-1-10 20:53

回復 12# GBKEE

感謝版主大大的回復
作者: Changbanana    時間: 2016-9-20 10:54

回復 10# Hsieh

想請問
如果資料型態是"表格"的時候
該怎麼改寫呢

範例:
在工作表一的A欄NO.對應到工作表二的A欄number
單號一樣的時候
從工作表二的B欄的資料傳回工作表一的I欄
工作表1
[attach]25276[/attach]
工作表2
[attach]25277[/attach]
若需要檔案測試:[attach]25278[/attach]
作者: zyzzyva    時間: 2016-9-21 11:44

回復 15# Changbanana
這不是跟原po一樣的問題嗎,我用Hsieh版大的code測試可以阿?
[attach]25286[/attach]
作者: Changbanana    時間: 2016-9-21 12:02

回復 16# zyzzyva


謝謝你~沒事了
因為昨天再測試時一直出問題

已ok  Thank you~




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