Board logo

標題: [發問] 如何把EXCEL SHEEP中的內容當資料庫,搜尋後再丟至要的分頁中? [打印本頁]

作者: atuan207    時間: 2011-4-24 14:16     標題: 如何把EXCEL SHEEP中的內容當資料庫,搜尋後再丟至要的分頁中?

本帖最後由 atuan207 於 2011-4-24 15:50 編輯

最近看到同學幫他媽做了一個比對統編的程式
不過他寫得很複雜(應該說是註解和定義都寫得很不清楚)
所以不太懂他在寫啥
他是sheet1是輸入的資料,sheet2是資料庫
sheet3是比對後的結果
看得出來的是
比對的部分用類似九九乘法的方法
兩個FOR迴圈在跑
EX:
    For i = 2 To ROWCNT1
        Set a = Worksheets("Sheet1").Cells(i, 2)
        Worksheets("Sheet3").Cells(i, 1) = a
        c = 2
        Dim ROWCNT2 As Integer
        ROWCNT2 = Worksheets("Sheet2").Range("A2").CurrentRegion.Rows.Count
        Worksheets("Sheet3").Range("H3") = ROWCNT2 - 1
            
        For d = 1 To ROWCNT2
            Set b = Worksheets("Sheet2").Cells(c, 1)
            If a = b Then
                Set e = Worksheets("Sheet2").Cells(c, 2)
                Worksheets("Sheet3").Cells(i, 2) = e
            End If
            c = c + 1
        Next
    Next
End Sub


現在在想
如果sheet1當成最後要的結果
[attach]5790[/attach]
sheet2、sheet3當成資料庫
[attach]5791[/attach]
[attach]5792[/attach]
然後把2、3的資料比對後放回到sheet1

不知道該怎麼做???
想請教版上的大大

我目前是想用Hsieh大大教的
Sheets(1).Range("A1").Copy Sheets(2).Range("B1")
用這個方式來複製資料,但是搜尋的部分還不知道怎麼做
而且用這種方式複製只有單筆...
成績三筆...不知道怎麼做比較好
作者: Hsieh    時間: 2011-4-24 22:38

本帖最後由 Hsieh 於 2011-4-24 22:40 編輯

Sheet2、Sheet3欄位沒有關聯性
無法比對
學生跟學號如何配對?
作者: atuan207    時間: 2011-4-24 22:53

本帖最後由 atuan207 於 2011-4-25 00:23 編輯

不對耶,我的問題不需要關連
我想我真的問題問的不好,不好意思

我是想把sheet2、3當成資料庫,sheet1的A、B行各自當成一個比對資料的值,做兩次比對,第一次是對sheet1的A、接著再做B
EX sheet2 依據是從sheet1 B行 找到相同的"姓名"後 把sheet2  B、C行資料送回sheet1的C、D行
     sheet3 依據是從sheet1 A行 找到相同的"學號"把sheet3 B、C、D資料送回aheet1的E、F、G行

這樣該怎麼做呢?
我目前自己翻書找到的方式是Range("B2:C2").copy range("C2")
這樣只能對單筆
不過配合搜尋後就不知道該怎麼做了
作者: oobird    時間: 2011-4-25 08:37

  1. Sub yy()
  2.     Dim c As Range, i%
  3.     With Sheet1
  4.         For i = 2 To .[a65536].End(3).Row
  5.             Set c = Sheet2.[a:a].Find(.Cells(i, 2))
  6.             If Not c Is Nothing Then
  7.                 .Cells(i, 3).Resize(, 2) = c(1, 2).Resize(, 2).Value
  8.             End If
  9.             Set c = Sheet3.[a:a].Find(.Cells(i, 1))
  10.             If Not c Is Nothing Then
  11.                 .Cells(i, 5).Resize(, 3) = c(1, 2).Resize(, 3).Value
  12.             End If
  13.         Next
  14.     End With
  15. End Sub
複製代碼

作者: Hsieh    時間: 2011-4-25 14:20

回復 3# atuan207
這是資料庫建置時就要考量,
我們知道學號當然是不重複的唯一索引值
但是,你在個人資料中以姓名做為索引值
而同名同姓是可能發生的問題
到時候就會產生同名不同學號的情形
請問兩表是否應該建立關聯性才能解決?
作者: atuan207    時間: 2011-4-25 16:51

感謝oobird大大,
程式可以執行,不過晚點想在請教一下中間的寫法

也感謝Hsieh大大
這個問題問得沒錯,我確實忽略了應該要把姓名及學號做關連
遇到相同姓名,但學號不同的人就會有問題,
晚一點來思考一下好了
現在正在忙著弄家裡的東西,晚點再來回
作者: atuan207    時間: 2011-4-25 21:36

本帖最後由 atuan207 於 2011-4-25 21:50 編輯

oobird大大我想請教一下程式
因為我正在自學VBA中,所以可能有些變數和用法不是那麼熟悉。
想試著做註解讓自己更觀念能清楚
下面我試著註解來請教

Sub yy()
    Dim c As Range, i%
// 這個i%有點不太懂,但是試著讓他輸出後,可以知道是我有幾個值,它便會是幾個值
(所以應該是算變數有幾筆,並和位置做連結EX (i,2) 就是(1,2)、(2,2)....一直下去)

   With Sheet1
// with是同樣的東西做精簡,所以後面只要是"sheet1."什麼的都只要用".什麼表示"

        For i = 2 To .[a65536].End(3).Row
//For 初值 To 到 結束的值 但不懂後面這 .End(3).Row這邊是做什麼用的

            Set c = Sheet2.[a:a].Find(.Cells(i, 2))
//配合Nothing的用法,set  範圍A = 相交的範圍
//不知道這樣解釋對不對    sheet2[a:a] 中的值,去找(sheet1.cells(i,2))中的值
//但是sheet2[a:a]  我不懂[a:a]的用法

            If Not c Is Nothing Then
                .Cells(i, 3).Resize(, 2) = c(1, 2).Resize(, 2).Value
//如果沒有和c的一樣的結果,
//那麼將把值放回Sheet1的第C行,.Resize(, 2) 這我不懂是什麼  所以後面就不懂了

            End If
            Set c = Sheet3.[a:a].Find(.Cells(i, 1))
//比對完Sheet2換Sheet3

            If Not c Is Nothing Then
                .Cells(i, 5).Resize(, 3) = c(1, 2).Resize(, 3).Value
            End If
        Next
    End With
End Sub

以下是把想問的彙整一下
Q1:  i%的用法和我想的一樣嗎???,那"變數%"的用法是什麼啊??
Q2:  .End(3).Row這邊是做什麼用的???
Q3:  [a:a]的用法
Q4:  .Resize的用法
Q5:  執行後會出現這樣的警告,我該如何存檔會比較好?
[attach]5862[/attach]
大概這五個問題

我自己有稍微google一下,但是像Q4找出來的結果看了還是不太懂,
而且手邊的書本好像也沒有提到,所以想請教板上的大大

麻煩了~~
作者: atuan207    時間: 2011-4-25 21:41

回Hsieh老師,
老師說的沒錯,有些名子是菜市場名,
在做資料庫比對的時候很容易會造成誤判,
所以我想也許一開始資料建的時候就不應該把姓名單獨一個當成關鍵字,
要找一些其它可以辨別的一起當關鍵來做判斷,EX身分證字號+名子、或者是學號+名字
才不會讓資料在比對上造成更多的問題
謝謝老師的提醒
作者: Hsieh    時間: 2011-4-25 23:24

回復 8# atuan207

參考看看
[attach]5866[/attach]
  1. Sub ex()
  2. With Sheet1
  3. For Each a In .Range(.[A1], .[a65536].End(xlUp))
  4.     Set b = Sheet2.Columns("A").Find(a, lookat:=xlWhole)
  5.     Set c = Sheet3.Columns("A").Find(a, lookat:=xlWhole)
  6.     a.Resize(, 7) = _
  7.     Array(a, b.Offset(, 1).Value, b.Offset(, 2).Value, b.Offset(, 3).Value, c.Offset(, 1).Value, c.Offset(, 2).Value, c.Offset(, 3).Value)
  8. Next
  9. End With
  10. End Sub
複製代碼

作者: atuan207    時間: 2011-4-26 00:33

感謝Hsieh大大
結果老師得更精簡
用陣列來做也是個好方法
只可惜陣列的用法我還不太熟
受教了
作者: mmggmm    時間: 2011-5-3 14:48

Hsieh你好你給的程式碼很好用,有一問題如Sheet2或Sheet2比Sheet1少了一兩個學號則程式碼不能執行,請問如何解決.
作者: hugh0620    時間: 2011-5-3 15:06

回Hsieh老師,
老師說的沒錯,有些名子是菜市場名,
在做資料庫比對的時候很容易會造成誤判,
所以我想也 ...
atuan207 發表於 2011-4-25 21:41



    樓主可能對一些日常生活的應用不太熟悉唷~
    身份證字號:一定要是唯一性  (若有兩個人身份證id會一樣,那樣戶政人員要抓起來打屁股)
    Hsieh大大講得是真理~ 資料庫的設計有時比程式撰寫要來的更重要~
    資料庫設計的不好~ 或是沒有關聯性的話~ 程式寫的再好~ 抓出來的資料還是有問題~
    樓主~ 要在這一塊多著墨一些唷~ 對未來處理資料上~ 會更加方便~
作者: atuan207    時間: 2011-5-3 20:02

謝謝hugh0620大大的指教
您與Hsieh說的都沒錯,
小弟確實當初在構思時只想說以簡單的方式為主,
卻不夠細心,沒有思考到其關連性,
確實在資料庫這一塊一要再多做加強,
之後必會多多注意
謝謝你們的指教




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