返回列表 上一主題 發帖

[發問] 如何把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當成最後要的結果
sheet1.JPG
2011-4-24 14:09

sheet2、sheet3當成資料庫
sheet2.JPG
2011-4-24 14:10

sheet3.JPG
2011-4-24 14:10

然後把2、3的資料比對後放回到sheet1

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

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

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

Sheet2、Sheet3欄位沒有關聯性
無法比對
學生跟學號如何配對?
學海無涯_不恥下問

TOP

本帖最後由 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")
這樣只能對單筆
不過配合搜尋後就不知道該怎麼做了

TOP

  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
複製代碼

TOP

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

TOP

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

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

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:  執行後會出現這樣的警告,我該如何存檔會比較好?
警告.PNG
2011-4-25 21:50

大概這五個問題

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

麻煩了~~

TOP

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

TOP

回復 8# atuan207

參考看看
未命名.png
2011-4-25 23:23
  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大大
結果老師得更精簡
用陣列來做也是個好方法
只可惜陣列的用法我還不太熟
受教了

TOP

        靜思自在 : 人要自愛,才能愛普天下的人。
返回列表 上一主題