Board logo

標題: [發問] 如何 取不同工作表的欄位值,帶入另一工作表做運算 [打印本頁]

作者: peter95    時間: 2016-3-10 23:57     標題: 如何 取不同工作表的欄位值,帶入另一工作表做運算

[attach]23416[/attach]

如何 取不同工作表的欄位值,帶入另一工作表做運算


運作背景:
我有 甲乙工作表 和一個"統計工作表"
請問如何將 "甲工作表"  "乙工作表" 的特定欄位值

帶入  "統計工作表" 做運算使用

可以請大家幫我寫一個VBA
讓我按一下 它直接帶入
感謝大家的幫忙

小弟的檔案
[attach]23417[/attach]
作者: yifan2599    時間: 2016-3-11 08:25

回復 1# peter95


    參考看看附加檔
作者: peter95    時間: 2016-3-11 08:40

回復 2# yifan2599

感謝大大的回覆
小弟很糗 因為我是小學生等級
無法下載附檔

可以請大大 貼源碼 嗎?

不好意思 麻煩你了
謝謝你的幫忙
作者: yifan2599    時間: 2016-3-11 08:54

回復 3# peter95

我放google

https://drive.google.com/open?id=0B8AgCMDaW5jNVnRBRDVEYkJha0E
作者: lpk187    時間: 2016-3-11 09:14

回復 1# peter95
  1. Sub 擷取()
  2.     Dim Rng As Range, aRng As Range, bRng As Range
  3.     With Sheets("統計")
  4.         .Range("B2:C" & .Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
  5.         For Each Rng In .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
  6.             Set aRng = Sheets("甲").Columns(1).Find(Rng.Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=2)
  7.             Set bRng = Sheets("乙").Columns(1).Find(Rng.Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=2)
  8.             If Not aRng Is Nothing Then Rng.Offset(, 1) = aRng.Offset(, 11)
  9.             If Not aRng Is Nothing Then Rng.Offset(, 2) = bRng.Offset(, 11)
  10.         Next
  11.     End With
  12. End Sub
複製代碼

作者: peter95    時間: 2016-3-11 11:30

回復 4# yifan2599

請問大大 以下的程式碼 的意思方便幫我寫註解嗎??
再次感謝你的幫忙
謝謝
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   s1 = Worksheets("甲").Cells(1, 1).End(xlDown).Row
    s2 = Worksheets("乙").Cells(1, 1).End(xlDown).Row
    s3 = Worksheets("統計").Cells(1, 1).End(xlDown).Row
    s3_1 = Worksheets("統計").Cells(10000, 8).End(xlUp).Row
    s3_2 = Worksheets("統計").Cells(10000, 9).End(xlUp).Row
   
   
    w = MsgBox("請問要從統計第一天起開始更新", vbYesNoCancel, "!!")
   
    If w = vbYes Then
        xx = 2
    ElseIf w = vbNo Then
        xx = Application.Max(s3_1, s3_2)
    ElseIf w = vbCancel Then
        b = MsgBox("取消更新!", vbOKOnly, "!!")
        Exit Sub
    End If
   
   
    For x3 = xx To s3
        up = Worksheets("統計").Cells(x3, 1)
   
        For x1 = 2 To s1
            If up = Worksheets("甲").Cells(x1, 1) Then
                q1 = x1
            End If
        Next x1
   
        For x2 = 2 To s2
            If up = Worksheets("乙").Cells(x2, 1) Then
                q2 = x2
            End If
        Next x2
        
        Worksheets("統計").Cells(x3, 2) = Worksheets("甲").Cells(q1, 12)
        Worksheets("統計").Cells(x3, 3) = Worksheets("乙").Cells(q2, 12)
    Next x3
   
   
    b = MsgBox("資料擷取完成!", vbOKOnly, "!!")

End Sub

作者: yifan2599    時間: 2016-3-12 13:09

回復 6# peter95


   我發現 樓上的 那個方法 比較妙,還不賴..
作者: peter95    時間: 2016-3-12 14:48

回復 5# lpk187


Lpk187大大感謝你的回覆

請問方便幫我寫你的程式碼註解嗎

小弟感謝你的幫忙
作者: lpk187    時間: 2016-3-12 18:25

本帖最後由 lpk187 於 2016-3-12 18:29 編輯

回復 8# peter95

以下代碼請Copy到模組中,並按F8逐步執行,會更容易理解
  1. Sub 擷取()
  2.     '分別宣告變數為Range(儲存格)物件,Rng為"統計"工作表的A欄每次循環中所讀取的儲存格,
  3.     'aRng為"甲"工作表查尋後找到的儲存格,bRng為"乙"工作表查尋後找到的儲存格
  4.     'Range到底是什麼?請查看說明
  5.     Dim Rng As Range, aRng As Range, bRng As Range
  6.     With Sheets("統計") 'with 為簡化代碼用,以下的代碼中若有以"."為開始的代碼,其前面都會加上"Sheets("統計")"這串
  7.     '例如".Cells",其完整字句應該是 "Sheets("統計").Cells(...."
  8.         .Range("B2:C" & .Cells(Rows.Count, 1).End(xlUp).Row).ClearContents '清除內容(值)
  9.         '以從A2開始到最後一個位置為範圍(這裡查到的是A11),做迴圈讀到的儲存格為Rng,例如第一個讀的位址為A2,其值(Value)為"2月25日"
  10.         '然後以其值"2月25日"去做搜尋(.Find)"甲"工作表和"乙"工作表,並找到其儲存格,搜尋日期在這裡不能用值去找,這裡必須要用公式去找"LookIn:=xlFormulas"
  11.         '這裡的參數如何使用,請參考Visual Basic 的說明"Range.Find"
  12.         For Each Rng In .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
  13.             Set aRng = Sheets("甲").Columns(1).Find(Rng.Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=2) '搜尋(.Find)"甲"工作表,並設定為aRng物件
  14.             Set bRng = Sheets("乙").Columns(1).Find(Rng.Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=2) '搜尋(.Find)"乙"工作表,並設定為bRng物件
  15.             '若沒有查獲到 Rng 物件,則aRng或bRng會為Nothing,所以下面語句的解釋為如果aRng不是Nothing的話,
  16.             '以第一次循環的值為例,會在Rng.Offset(, 1)放入aRng.Offset(, 11)的值,也就是會在統計的B2放進甲的K2值,bRng亦同,會在C2放進乙的K2值,呼~~~
  17.             If Not aRng Is Nothing Then Rng.Offset(, 1) = aRng.Offset(, 11) '
  18.             If Not bRng Is Nothing Then Rng.Offset(, 2) = bRng.Offset(, 11)
  19.         Next
  20.     End With
  21. End Sub
複製代碼

作者: peter95    時間: 2016-3-12 19:25

回復 9# lpk187

Lpk187大大非常感謝你的回覆
小弟剛剛接觸vba的東西

有你們這些高手幫忙
小弟感激萬分
謝謝你

我自己先消化一下,謝謝
作者: peter95    時間: 2016-3-15 23:31

回復 5# lpk187


    Sub 擷取()
    Dim Rng As Range, aRng As Range, bRng As Range
    With Sheets("統計")
        .Range("B2:C" & .Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
        For Each Rng In .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
            Set aRng = Sheets("甲").Columns(1).Find(Rng.Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=2)
            Set bRng = Sheets("乙").Columns(1).Find(Rng.Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=2)
            If Not aRng Is Nothing Then Rng.Offset(, 1) = aRng.Offset(, 11)
            If Not aRng Is Nothing Then Rng.Offset(, 2) = bRng.Offset(, 11)
        Next
    End With
End Sub
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

請問lpk187 大大 這兩個取出的值 (相加) 然後在加上一個負值  並把它固定放在 ...固定G欄的儲存格(從G3開始將值放入..)

說明一下  "這兩個取出的值 (相加) 然後在加上一個負值 "
比如 取出 192  336,,,-(192+336)=-528
再次感謝你的幫忙  謝謝

作者: lpk187    時間: 2016-3-16 09:05

本帖最後由 lpk187 於 2016-3-16 09:10 編輯

回復 11# peter95

下圖是讓你瞭解Range物件的Offset屬性:運算式.Offset(列的偏移量, 欄的偏移量)

會讓你更容易瞭解程式怎麼運作的

[attach]23460[/attach]
  1. Option Explicit

  2. Sub 擷取()
  3.     Dim Rng As Range, aRng As Range, bRng As Range
  4.     With Sheets("統計")
  5.         .Range("B2:C" & .Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
  6.         For Each Rng In .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
  7.             Set aRng = Sheets("甲").Columns(1).Find(Rng.Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=2)
  8.             Set bRng = Sheets("乙").Columns(1).Find(Rng.Value, LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=2)
  9.             If Not aRng Is Nothing Then Rng.Offset(, 1) = aRng.Offset(, 11)
  10.             If Not bRng Is Nothing Then Rng.Offset(, 2) = bRng.Offset(, 11)
  11.             Rng.Offset(, 6) = -(Rng.Offset(, 1) + Rng.Offset(, 1))
  12.         Next
  13.     End With
  14. End Sub
複製代碼

作者: lpk187    時間: 2016-3-16 09:09

回復 11# peter95


    還有我第一次PO次的代碼中
If Not aRng Is Nothing Then Rng.Offset(, 1) = aRng.Offset(, 11)
If Not aRng Is Nothing Then Rng.Offset(, 2) = bRng.Offset(, 11)<<=這句是錯的
應該修正為
If Not bRng Is Nothing Then Rng.Offset(, 2) = bRng.Offset(, 11)




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