返回列表 上一主題 發帖

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

[發問] 如何把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當成最後要的結果

sheet2、sheet3當成資料庫
sheet2.JPG
sheet3.JPG
然後把2、3的資料比對後放回到sheet1

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

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

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

TOP

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



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

TOP

Hsieh你好你給的程式碼很好用,有一問題如Sheet2或Sheet2比Sheet1少了一兩個學號則程式碼不能執行,請問如何解決.

TOP

感謝Hsieh大大
結果老師得更精簡
用陣列來做也是個好方法
只可惜陣列的用法我還不太熟
受教了

TOP

回復 8# atuan207

參考看看
  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
複製代碼
學海無涯_不恥下問

TOP

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

TOP

本帖最後由 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:  執行後會出現這樣的警告,我該如何存檔會比較好?

大概這五個問題

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

麻煩了~~

TOP

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

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

TOP

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

TOP

        靜思自在 : 好事要提得起,是非要放得下,成就別人即是成就自己。
返回列表 上一主題