會員 ![]() | 在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 一切都是自己揣摩的,如果有說錯請高手指導! |
回覆 |
會員 ![]() | 引用:
在"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 嗯...這樣應該可以省掉一些時間 |
回覆 |
會員 ![]() | 引用:
比我之前的方式去做省了大概有1/3的時間。 | |
回覆 |
|
XML | RSS 2.0 | RSS |
本論壇所有文章僅代表留言者個人意見,並不代表本站之立場,討論區以「即時留言」方式運作,故無法完全監察所有即時留言,若您發現文章可能有異議,請 email :[email protected] 處理。