在詳細介紹本的內容前,我們先輕松一下。
據說,在我家的院子里藏著很多金銀珠寶。你一定想知道藏在哪兒吧,告訴你,就在院子里的一棵樹下。當你興沖沖地跑到院子里準備挖寶藏時,傻眼了,因為我家院子太大,幾乎種了上百棵樹,究竟在哪棵樹下呢?珠寶的誘惑力太強了,你決定挨個樹找,夠你找的了……但是,如果我告訴你,在我家院子里有一棵老槐樹,從這棵槐樹起向右第3棵樹下藏著很多金銀珠寶,你一下子就能找到了。
很多情況下,我們會采用相對位置或坐標來描述事物的位置。因為這樣的描述讓人容易理解,從而方便快速找到想要的東西。
言歸正傳。Offset屬性是Range對象的一個很有用的屬性,它能夠幫助我們指定相對于某個單元格的其它單元格。這樣,我們就能夠很方便地以某一個特定的單元格為起點,遍歷其它單元格,或者到達我們想要的單元格。
簡而言之,Offset屬性能夠幫助我們從工作表中的一個單元格移動到另一個單元格。
Offset屬性的語法表達為:
Range對象.Offset(RowOffset,ColumnOffset)
返回基于起點單元格偏移指定的行數和列數后的單元格。
現在要在單元格區域A2:A7中查找姓名為“趙六”的同學,并將他的分數加粗。代碼如下:
Sub OffsetExa1()
Dim rng As Range ‘聲明單元格對象變量
Dim rngTotal As Range ‘聲明單元格對象變量
Set rngTotal = Range(“A2:A7”) ‘將單元格區域賦值給單元格對象變量
Set rng = Range(“A2”) ‘將單元格賦值對單元格對象變量
‘遍歷單元格區域
Do Until rng.Value = “”
If rng.Value = “趙六” Then ‘如果單元格值為趙六,則將其分數加粗
rng.Offset(0, 1).Font.Bold = True ‘使用Offset屬性偏移到分數單元格
End If
Set rng = rng.Offset(1, 0) ‘將下一個單元格賦值給單元格對象變量
Loop
End Sub
由于本例中是在固定的單元格區域內循環,所以還可使用For Each結構來優化代碼,For Each結構負責循環,Offset屬性負責偏移到相應的單元格。代碼如下:
Sub OffsetExa2()
Dim rng As Range ‘聲明單元格對象變量
Dim rngTotal As Range ‘聲明單元格對象變量
Set rngTotal = Range(“A2:A7”) ‘將單元格區域賦值給單元格對象變量
‘遍歷單元格區域
For Each rng In rngTotal
If rng.Value = “趙六” Then’如果單元格值為趙六,則將其分數加粗
rng.Offset(0, 1).Font.Bold = True ‘使用Offset屬性偏移到分數單元格
End If
Next
End Sub
在很多程序中,經常需要先查找滿足特定條件的單元格,然后以該單元格為基準,對其他單元格進行操作。
下面,我們使用Offset屬性對《Excel VBA解讀(19):員工管理系統開發V1.0》中的系統進行優化,使代碼更加靈活。代碼如下:
Sub TotalData1()
‘聲明Worksheet變量
Dim wksInfo As Worksheet
Dim wksBaseInfo As Worksheet
‘聲明單元格對象變量
Dim rng As Range
‘給wksInfo變量賦值
Set wksInfo =ThisWorkbook.Worksheets(“員工信息數據庫”)
Set wksBaseInfo =ThisWorkbook.Worksheets(“員工基本信息表”)
‘將初始單元格賦值給變量
Set rng = wksInfo.Range(“A2”)
‘將<員工基本信息表>中數據自動填入<員工信息數據庫>工作表
With wksBaseInfo
rng.Value = Range(“B2”).Value
rng.Offset(0, 1).Value =.Range(“F2”).Value
rng.Offset(0, 2).Value =.Range(“B3”).Value
rng.Offset(0, 3).Value =.Range(“D3”).Value
rng.Offset(0, 4).Value = .Range(“F3”).Value
rng.Offset(0, 5).Value =.Range(“B4”).Value
rng.Offset(0, 6).Value =.Range(“D4”).Value
rng.Offset(0, 7).Value =.Range(“F4”).Value
rng.Offset(0, 8).Value =.Range(“B5”).Value
rng.Offset(0, 9).Value =.Range(“F5”).Value
rng.Offset(0, 10).Value =.Range(“B6”).Value
rng.Offset(0, 11).Value =.Range(“D6”).Value
rng.Offset(0, 12).Value =.Range(“F6”).Value
rng.Offset(0, 13).Value = .Range(“B7”).Value
rng.Offset(0, 14).Value =.Range(“F7”).Value
rng.Offset(0, 15).Value =.Range(“B8”).Value
rng.Offset(0, 16).Value =.Range(“D8”).Value
rng.Offset(0, 17).Value =.Range(“F8”).Value
rng.Offset(0, 18).Value =.Range(“B9”).Value
rng.Offset(0, 19).Value =.Range(“D9”).Value
rng.Offset(0, 20).Value =.Range(“F9”).Value
rng.Offset(0, 21).Value =.Range(“B10”).Value
rng.Offset(0, 22).Value =.Range(“B11”).Value
rng.Offset(0, 23).Value =.Range(“B12”).Value
End With
End Sub
這樣,避免了“員工信息數據庫”中的單元格采用“硬編碼”(即在代碼中使用固定的單元格對象。使用“硬編碼”的代碼使得以后要修改代碼時,需要逐個修改相應的單元格代碼,很繁鎖,也容易出錯。對于經常變換的單元格,最好使用對象變量,例如例子中“員工信息數據庫”工作表,在填充數據時,單元格經常要變動。而對于不會變化的單元格,可以使用固定的單元格,如例子中“員工基本信息表”中的單元格F2、B3、D3等)。
上述優化后的代碼,使今后代碼需要擴展時,只需修改起始單元格即可,更加靈活。