在EXCEL呼叫別的檔來比對資料?? - PCZONE 討論區

返回   PCZONE 討論區 > ▲ -- 電 腦 軟 體 討 論 區 > -- OFFICE 相 關 軟 體 討 論 版


PCZONE 討論區



通知

-- OFFICE 相 關 軟 體 討 論 版 Word、Excel、PowerPoint、Access、Outlook、FrontPage或Office XP等的問題解答與經驗分享

會員
在EXCEL呼叫別的檔來比對資料??
1.我想在EXCEL呼叫別的EXCEL檔來比對資料,我現在要打開檔案後才能比對,如果不要打開檔案,有什麼參數可以使用嗎?

2.我比對資料粉慢,因為是直接比對,可以用陣列做嗎?
如果可以要怎麼寫?

回覆
台灣水電工

不打開檔就要比對,這我不會
開檔後要比對,通常我會用巨集
回覆
會員

引用:
最初由 沙拉油 發表
不打開檔就要比對,這我不會
開檔後要比對,通常我會用巨集
那巨集又怎麼寫?

我是用這樣的:主要是在這一段比對和COPY資料號很多時間。

Windows("aaa.xls").Activate
Sheets("a1").Select
For I = 13 To 500 Step 1
If Left(Cells(I, 2).Value, 1) = "P" Then
Z1 = I
End If
Next
Windows("aaa.xls").Activate
Sheets("b1").Select
For I = 2 To 500 Step 1
If Left(Cells(I, 3).Value, 1) = "P" Then
Z2 = j
End If
Next

For I = 13 To Z1
Windows("aaa.xls").Activate
Sheets("a1").Select
temp1 = Range("C" & I).Value
For j = 2 To Z2
Windows("aaa.xls").Activate
Sheets("b1").Select
temp2 = Range("D" & j).Value
If (temp1 = temp2) Then
temp3 = Range("F" & j).Value
temp4 = Range("G" & j).Value
temp5 = Range("B" & j).Value
End If
Next
Windows("aaa.xls").Activate
Sheets("a1").Select
Range("D" & I).Value = temp3
Range("E" & I).Value = temp4
Range("A" & I).Value = temp5
Next
回覆
台灣水電工

For I = 13 To 500 Step 1
If Left(Cells(I, 2).Value, 1) = "P" Then
Z1 = I
End If
Next
字元P是列尾還是第500列是列尾
該欄只有一個儲存格內的文字串的首字元為P嗎?
如果是的話你的Z1 = I 的底下再加入一列 Exit For 跳出迴圈,不用再去做無意義的比對

這個巨集一直都只是在aaa.xls裡面執行吧?!
如果你有從其他的檔案執行這個巨集,那底下這一段就應該只需要保留最上面那一行就可以了
Windows("aaa.xls").Activate

還有那幾個開頭為 temp 的變數應該都可以省略
我沒有正規的學過 VBA 或 VB 一切都是自己揣摩的,如果有說錯請高手指導!
回覆
會員

引用:
最初由 沙拉油 發表
For I = 13 To 500 Step 1
If Left(Cells(I, 2).Value, 1) = "P" Then
Z1 = I
End If
Next
字元P是列尾還是第500列是列尾
該欄只有一個儲存格內的文字串的首字元為P嗎?
如果是的話你的Z1 = I 的底下再加入一列 Exit For 跳出迴圈,不用再去做無意義的比對

這個巨集一直都只是在aaa.xls裡面執行吧?!
如果你有從其他的檔案執行這個巨集,那底下這一段就應該只需要保留最上面那一行就可以了
Windows("aaa.xls").Activate

還有那幾個開頭為 temp 的變數應該都可以省略
我沒有正規的學過 VBA 或 VB 一切都是自己揣摩的,如果有說錯請高手指導!
"P"是在儲存格中第一個字元,我用來計算這個資料表中有幾筆資料。
在"a1"和"b1"都有這個欄位的資料,比對資料,主要是要把"a1"和"b1",
相同資料抓出來,然後由"b1"複製到"a1"。
但是這個資料在比對時非常慢,比對時先抓出"a1"的第一筆資料,
,去比對"b1"的每一筆資料。
接著才第2筆、第3比一比一筆比對。
加上我的資料都是好幾百筆,所以我才想找其他方式的寫法。
回覆
台灣水電工

"P"是在儲存格中第一個字元,我用來計算這個資料表中有幾筆資料。
那字首為 "P" 的那個儲存格就是最後一列囉?
如果是那你可以用底下這兩行
Z1 = Sheets("a1").Range("B65536").End(xlUp).Row
Z2 = Sheets("b1").Range("C65536").End(xlUp).Row
來取代這一段
Sheets("a1").Select
For I = 13 To 500 Step 1
If Left(Cells(I, 2).Value, 1) = "P" Then
Z1 = I
End If
Next
Windows("aaa.xls").Activate
Sheets("b1").Select
For I = 2 To 500 Step 1
If Left(Cells(I, 3).Value, 1) = "P" Then
Z2 = j
End If
Next
可以省掉將近一千次的迴圈
回覆
台灣水電工

如果以整體來講應該可以改成這樣
Windows("aaa.xls").Activate
Z1 = Sheets("a1").Range("B65536").End(xlUp).Row
Z2 = Sheets("b1").Range("C65536").End(xlUp).Row

For I = 13 To Z1
For j = 2 To Z2
If (Sheets("b1").Range("D" & j) = Sheets("a1").Range("C" & I)) Then
Sheets("a1").Range("D" & I) = Sheets("b1").Range("F" & j)
Sheets("a1").Range("E" & I) = Sheets("b1").Range("G" & j)
Sheets("a1").Range("A" & I) = Sheets("b1").Range("B" & j)
End If
Next
Next

我沒有資料可以詳加測試,你自己試試好了
回覆
台灣水電工

看齊來很奇怪,底下這段再改一下好了
Sheets("a1").select
For I = 13 To Z1
For j = 2 To Z2
If Sheets("b1").Range("D" & j) = Sheets("a1").Range("C" & I) Then
Range("D" & I) = Sheets("b1").Range("F" & j)
Range("E" & I) = Sheets("b1").Range("G" & j)
Range("A" & I) = Sheets("b1").Range("B" & j)
End If
Next
Next

嗯...這樣應該可以省掉一些時間

回覆
會員

引用:
最初由 沙拉油 發表
看齊來很奇怪,底下這段再改一下好了
Sheets("a1").select
For I = 13 To Z1
For j = 2 To Z2
If Sheets("b1").Range("D" & j) = Sheets("a1").Range("C" & I) Then
Range("D" & I) = Sheets("b1").Range("F" & j)
Range("E" & I) = Sheets("b1").Range("G" & j)
Range("A" & I) = Sheets("b1").Range("B" & j)
End If
Next
Next

嗯...這樣應該可以省掉一些時間
太感謝了,我跑了幾次,用了2千多筆資料去做,
比我之前的方式去做省了大概有1/3的時間。

回覆







 XML   RSS 2.0   RSS 
本站使用 vBulletin 合法版權程式
站務信箱 : [email protected]

本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。