iT邦幫忙

0

VBA 不同資料表比對

ski 2020-06-18 17:22:584104 瀏覽
  • 分享至 

  • xImage

大家好

想請問如何用VBA寫出像以下這樣的程式呢

比對兩個不同工作表中的H欄位
並找出不同的資料 貼至新的工作表

爬了很多文都只有比對相同資料
希望有人能幫幫忙 萬分感謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
海綿寶寶
iT邦大神 1 級 ‧ 2020-06-18 17:49:59
最佳解答
Sub Main()
    For nI = 1 To 12 '判斷12個月份
        nR1 = FindMonth("Sheet1", nI & "月")
        nR2 = FindMonth("Sheet2", nI & "月")
        If (nR1 = 0 And nR2 = 0) Then '兩個工作表都沒有,不用處理
        Else
            If (nR1 * nR2 = 0) Then '只有一個工作表有,複製到 sheet3
                Call CopyRow("Sheet1", nR1)
                Call CopyRow("Sheet2", nR2)
            End If
        End If
    Next nI
End Sub
'在 sheet 找特定月份,找到回傳列號,找不到回傳 0
Function FindMonth(ByVal sheet, ByVal month) As Integer
    nRet = 0
    For nI = 2 To 10
        If Range(sheet & "!D" & nI).Value = month Then
            nRet = nI
            Exit For
        End If
    Next nI
    FindMonth = nRet
End Function
'將 sheet 第 sourcerow 列複製到 sheet3 的第一筆空白列
Sub CopyRow(ByVal sheet, ByVal sourcerow)
    If sourcerow = 0 Then Exit Sub
    Worksheets("Sheet3").Select
    Range("A100").End(xlUp).Offset(1, 0).Select
    targetrow = ActiveCell.Row
    Dim arrC
    arrC = Array("A", "B", "C", "D")
    For nC = 0 To UBound(arrC)
        Range("Sheet3!" & arrC(nC) & targetrow) = Range(sheet & "!" & arrC(nC) & sourcerow)
    Next nC
End Sub
看更多先前的回應...收起先前的回應...
ski iT邦新手 5 級 ‧ 2020-06-19 08:22:53 檢舉

非常感謝!試一下,有問題再來請教

ski iT邦新手 5 級 ‧ 2020-06-19 08:23:10 檢舉

/images/emoticon/emoticon41.gif

ski iT邦新手 5 級 ‧ 2020-06-19 09:24:11 檢舉

不好意思,昨天在文章中表達的不明確

Sheet1和Sheet2各有11個欄位(A欄 ~ K欄)
是想讓Sheet1和Sheet2兩個工作表的D欄位互相比對
找出不一樣的資料貼至Sheet3 包括其他欄位資料

像是以下這樣:

(Sheet1和Sheet2的D欄互相比對)

Sheet1
https://ithelp.ithome.com.tw/upload/images/20200619/201278460IfRw1ZG5a.jpg

Sheet2
https://ithelp.ithome.com.tw/upload/images/20200619/20127846hvP8XWgBnE.jpg

Sheet3 比對出來結果

https://ithelp.ithome.com.tw/upload/images/20200619/20127846hRXo7yUmk5.jpg

能在麻煩幫我看看嗎?

如果 Sheet2 沒有第6筆(12月)的話
Sheet3會有幾筆12月?

ski iT邦新手 5 級 ‧ 2020-06-19 11:00:44 檢舉

被這樣一問才發現示意圖不太對
同工作表的D欄資料是不重複的
剛剛只想到要用2個工作表要有不同月份 卻忽略這個問題

/images/emoticon/emoticon06.gif

修改程式如上

ski iT邦新手 5 級 ‧ 2020-06-19 12:57:38 檢舉

再來好好研究,非常感謝幫忙!
/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif

ski iT邦新手 5 級 ‧ 2020-06-19 16:36:14 檢舉

不好意思,可以在請教下面這句話是什麼意思呢?
Range("Sheet3!" & arrC(nC) & targetrow) = Range(sheet & "!" & arrC(nC) & sourcerow)

假設 Sheet2 的第3列要複製到 Sheet3 的第4列
用寫死的方式,就會是

Range("Sheet3!A4") = Range("Sheet2!A3")
Range("Sheet3!B4") = Range("Sheet2!B3")
Range("Sheet3!C4") = Range("Sheet2!C3")
Range("Sheet3!D4") = Range("Sheet2!D3")

但是寫程式要改成有變化
用 arrC ("A","B","C","D")
targetrow 就是 4
sheet 就是 "Sheet2"
sourcerow 就是 3

ski iT邦新手 5 級 ‧ 2020-06-20 08:55:33 檢舉

感謝說明,這樣我懂了

/images/emoticon/emoticon41.gif

ski iT邦新手 5 級 ‧ 2020-06-20 15:01:11 檢舉

不好意思,又來打擾了

是這樣子的,一樣是要比對2個不同資料表的D欄位
找出不一樣的資料貼至Sheet3 包括其他欄位資料
但是D欄位不是月份 而是一般的數字
按照您提供的程式修改了一下 如下

Sub Main()

nRow = 1
    For nI = 2 To 300
        A = Range("Sheet1!D" & nI)
        B = Range("Sheet2!D" & nI)
        If (A = 0 And B = 0) Then
        Else
            If A <> B Then
            nRow = nRow + 1
                Call CopyRow("Sheet1", A)
                Call CopyRow("Sheet2", B)
            End If
        End If
    Next nI
End Sub

Sub CopyRow(ByVal sheet, ByVal sourcerow)
    If sourcerow = 0 Then Exit Sub
    Worksheets("Sheet3").Select
    Range("A300").End(xlUp).Offset(1, 0).Select
    targetrow = ActiveCell.Row
    Dim arrC
    arrC = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K")
    For nC = 0 To UBound(arrC)
        Range("Sheet3!" & arrC(nC) & targetrow) = Range(sheet & "!" & arrC(nC) & sourcerow)
    Next nC
End Sub

會出現錯誤訊息 執行階段錯誤 1004 Range方法(Global物件)失敗
修改了很久還是同樣的問題 不知道是哪邊出了問題
能再麻煩您幫忙看一下嗎,真是不好意思

你的程式跟原本的題目已經相去甚遠
我不知道要從何改起

原本程式是

用`1月..12月`分別到Sheet1,Sheet2去找,只有其中一個工作表有找到時,複製該整列到Sheet3

現在你的程式寫的內容是

Sheet1!D2跟Sheet2!D2比
Sheet1!D3跟Sheet2!D3比
...
Sheet1!D300跟Sheet2!D300比
兩個值皆為0時不做任何動作
否則就將Sheet1/Sheet2兩列
都複製到Sheet3去

還有
原本的nR1, nR2記錄的是「列號」
而你改寫成 A,B 記錄的是「儲存格裡的值」
兩者意義差蠻多的
就算解決了 Range(Global) 的錯誤
程式也不太可能跑出你要的結果....

ski iT邦新手 5 級 ‧ 2020-06-20 15:33:30 檢舉

最近才剛開始寫VBA 還沒有辦法融會貫通去運用
所以才都用拼湊的方式去寫程式
沒想到改出來的程式越差越多 ......
/images/emoticon/emoticon20.gif

我要發表回答

立即登入回答