在EXCEL呼叫別的檔來比對資料??



贊助商連結


ericks
2002-02-03, 03:26 PM
1.我想在EXCEL呼叫別的EXCEL檔來比對資料,我現在要打開檔案後才能比對,如果不要打開檔案,有什麼參數可以使用嗎?

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

贊助商連結


沙拉油
2002-02-04, 09:05 AM
不打開檔就要比對,這我不會
開檔後要比對,通常我會用巨集

ericks
2002-02-04, 03:17 PM
最初由 沙拉油 發表
不打開檔就要比對,這我不會
開檔後要比對,通常我會用巨集

那巨集又怎麼寫?

我是用這樣的:主要是在這一段比對和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

沙拉油
2002-02-04, 10:15 PM
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 一切都是自己揣摩的,如果有說錯請高手指導!

ericks
2002-02-05, 11:31 AM
最初由 沙拉油 發表
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比一比一筆比對。
加上我的資料都是好幾百筆,所以我才想找其他方式的寫法。

沙拉油
2002-02-05, 12:29 PM
"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
可以省掉將近一千次的迴圈

沙拉油
2002-02-05, 12:39 PM
如果以整體來講應該可以改成這樣
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

我沒有資料可以詳加測試,你自己試試好了

沙拉油
2002-02-05, 12:46 PM
看齊來很奇怪,底下這段再改一下好了
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

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

ericks
2002-02-06, 12:00 AM
最初由 沙拉油 發表
看齊來很奇怪,底下這段再改一下好了
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的時間。