- 帖子
- 552
- 主題
- 3
- 精華
- 0
- 積分
- 578
- 點名
- 0
- 作業系統
- win7
- 軟體版本
- office 2010
- 閱讀權限
- 50
- 性別
- 男
- 註冊時間
- 2015-2-8
- 最後登錄
- 2024-7-9
  
|
10#
發表於 2016-10-19 15:24
| 只看該作者
回復 9# markbaseball
上述程序代碼都是很基礎的語句,若你有善用區域變數視窗以及F8(逐步執行)來觀看其代碼的話。其實不用解釋,
就可以很容易的觀察其程序的內容以及意思,會比我解釋,更容易理解!!
以下代碼為了解釋,修改了變數名稱(容易觀看),其內容也有做稍微的修正。- Sub ro()
- Dim sht2EndRow As Range, sht2EndColumn As Range
- Dim sht_1 As Worksheet, sht_2 As Worksheet
- Dim rng As Range, findCusIP As Range, sht1EndColumn As Range
- Dim crng As Range, ng As Range
- Set sht_1 = Worksheets("工作表1")
- Set sht_2 = Worksheets("工作表2")
- Set sht2EndRow = sht_2.[D65535].End(xlUp) '找 工作表2 的 D欄 最後一儲存格,其語句的意思為:從儲存格的D65535往上找,找到有值的儲存格,這裡一定要往上找,因為D欄為不連續的範圍(有空的儲存格),
- Set sht2EndColumn = sht_2.[E1].End(xlToRight) '找 工作表2 的 第一列 的最後一儲存格,其語句的意思為:從 E1 往右找到最後有值的儲存格
- Set sht1EndColumn = sht_1.[c1].End(xlToRight) '找 工作表1 的 第一列 的最後一儲存格
-
- For Each rng In sht_2.Range("D2", sht2EndRow) '以工作表2的 D2 到 D欄 最後一儲存格的範圍做迴圈循環,這裡指向的範圍是 D2:D1068
- If rng <> "" Then '如果 目標儲存格 rng 不為空值才執行內部語句
- Set findCusIP = sht_1.Columns(2).find(rng, LookIn:=xlFormulas) '先找到 CusIP 在B欄的哪一 列 的儲存格
- If Not findCusIP Is Nothing Then '如果有找到 CusIP才執行下列語句
- For Each crng In sht_2.Range("e1", sht2EndColumn) '以工作表2 的 第一列 從 E1 到 第一列 的最後一儲存格的範圍做迴圈循環,這裡指向的範圍是 E1:I1
- ''''''下面迴圈開始尋找
- For Each ng In sht_1.Range("c1", sht1EndColumn) '以工作表1 的 C1:KT1 做範圍 比對年份以及其下一格的儲存格內容,比如:1978Return on Equity[Y78]
- ''''''下列的 ng.Value & ng.Offset(1).Value(工作表1的 年份和名稱) 和 rng.Offset(, -2) & crng.Value & "*"(工作表2的年份和名稱) 做比對
- ''''''這裡的 "*" 是把工作表1的第二列名稱中的中括號以及其內容去除掉(說是去除掉,但應該說可以是任何的內容)
- If ng.Value & ng.Offset(1).Value Like rng.Offset(, -2) & crng.Value & "*" Then
- sht_2.Cells(rng.row, crng.column) = sht_1.Cells(findCusIP.row, ng.column) '比對成功後寫入儲存格,比如說 E2、F2、G2、H2、I2 依此類推
- Exit For
- End If
- Next
- '''''''''''''
- Next
- End If
- Set findCusIP = Nothing '當次的迴圈結束後,設定為沒有物件,以利下個迴圈搜尋,沒設的話,則有可能找到錯誤的資料
- End If
- Next
- End Sub
複製代碼 |
|