日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VBA实战技巧精粹014:关于Range总结

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VBA实战技巧精粹014:关于Range总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、如何復制

按平時的操作習慣可以知道,只需定位第1個位置即可。

??? '如果想通過復制/粘貼方式呢,只需指定第1個單元格即可.
??? With Workbooks("驗證Range.xls").Sheets(2)
??????? .Range("A1").CurrentRegion.Copy Destination:=Workbooks("book2.xls").Sheets(3).Range("A1")
??? End With

當然也可以通過直接賦值的方法來實現復制,但此時就要注意了,必須保證兩塊區域的大小是相同的。這點可以通過resize及計算出待復制區域的行數及列數來確定。

??? '如果想直接賦值 , 必須保證目標區域與源區域的大小一致才可以.以下代碼驗證通過
??? With Sheets(1).Range("A1").CurrentRegion
??????? Sheets(3).Range("X1").Resize(.Rows.Count, .Columns.Count).Value = Sheets(2).Range("A1").CurrentRegion.Value
??? End With
2、如何獲取指定列的列標(即如A、B、C、AA等表示)

利用chr函數可以實現A至Z的列標轉換,但對于第27列以后的列標就沒法轉換了,代碼如下:

Sub 獲取指定列的字母()
??? Dim i As Integer, arr() As String
????Debug.Print Cells(1, 27).Address
??? arr = Split(Cells(1, 27).Address, "$")
??? Debug.Print UBound(arr)
??? For i = 1 To UBound(arr)
??????? Debug.Print arr(i)
??? Next i
End Sub

對于上面的代碼,其中涉及到了split函數,解釋如下:

描述

返回一個下標從零開始的一維數組,它包含指定數目的子字符串。

語法

Split(expression[, delimiter[, limit[, compare]]])

Split函數語法有如下命名參數:

部分描述
expression必需的。包含子字符串和分隔符的字符串表達式 。如果expression是一個長度為零的字符串(""),Split則返回一個空數組,即沒有元素和數據的數組。
delimiter可選的。用于標識子字符串邊界的字符串字符。如果忽略,則使用空格字符(" ")作為分隔符。如果delimiter是一個長度為零的字符串,則返回的數組僅包含一個元素,即完整的 expression字符串。
limit可選的。要返回的子字符串數,–1表示返回所有的子字符串。
compare可選的。數字值,表示判別子字符串時使用的比較方式。關于其值,請參閱“設置值”部分。



設置值

compare參數的設置值如下:

常數描述
vbUseCompareOption–1Option Compare語句中的設置值執行比較。
vbBinaryCompare0執行二進制比較。
vbTextCompare1執行文字比較。
vbDatabaseCompare2僅用于Microsoft Access?;谀臄祿斓男畔绦斜容^。

針對代碼中用到的split函數來看,首先明確split函數返回一個一維數組,代碼的用法就是對$**$***的情況,利用$作為分隔符,將其中的**及***作為一維數組的元素來處理,由于其返回一個一維數組,所以直接在表達式后接(1)表示提取這個一維數組的第1個元素(實際就是第2個),因為這個一維數組的下標是從0開始的。這樣的話,上面的代碼就沒有必要再再返回結果賦值給數組變量arr了,因為其本身就是數組,可以直接引用嘛。

Sub 獲取指定列的字母()
????Debug.Print Cells(1, 27).Address
??? Debug.Print Split(Cells(1, 27).Address, "$")(1)
End Sub

返回AA即第27列的列標。

3、如何快速判斷是否為合并單元格

利用rang對象的mergecells屬性就可判斷。
Sub 判斷是否為合并單元格()
??? If Range("A1").MergeCells = True Then
??????? Debug.Print "為合并單元格"
??????? Range("A1").Value = 100
??? Else
??????? Debug.Print "不是合并單元格"
??? End If
End Sub

利用mergecells屬性可以判斷單個單元格是否為合并單元格,但如果是一個包含多個單元格的區域的話,比如只有range("A1:A10")全是合并單元時才會得到正確的結果。為什么會這樣呢?里面明明包含有合并單元格區域啊,雖然只是一部分。這個很好理解:mergecells屬性只是用來判斷你所選定的區域是否為合并單元格區域,這就要求必須是保持一致才可以的。

那如果所選定的區域只是部分含有合并單元格又如何判斷呢?可以通過遍歷的方法來判斷,不過這樣有點慢了,可以isNull函數來判斷。解釋如下:

返回 Boolean 值,指出表達式是否不包含任何有效數據 (Null)。

語法

IsNull(expression)

必要的 expression 參數是一個 Variant,其中包含數值表達式字符串表達式。

說明

如果 expression 為 Null,IsNull 返回 True;否則 IsNull 返回 False。如果 expression 由多個變量組成,則表達式的任何作為變量組成成分的 Null 都會使整個表達式返回 True。

Null 值指出 Variant 不包含有效數據。Null Empty 不同,后者指出變量尚未初始化。Null 與長度為零的字符串 (““) 也不同,長度為零的字符串指的是空串。

重要 使用 IsNull 函數是為了確定表達式是否包含 Null 值的。在某些情況下,希望表達式取值為 True,比如希望 If Var = Null 和 If Var <> Null 取值為 True,而它們總取值為 False。這是因為任何包含 Null 的表達式本身就是 Null,所以為 False。

這樣的話,利用IsNull函數來判斷選定區域是否包含有合并單元格,即:如果range("A1:A3").mergecells屬性為Null,恰好說明里面包含有合并單元格,若不為空,則說明里面未包含合并單元格。

代碼如下:

Sub 判斷區域內是否包含有部分合并單元格()
??? If IsNull(Range("A1:A3").MergeCells) Then
??????? MsgBox "包含有合并單元格"
??? Else
??????? MsgBox "不包含合并單元格"
??? End If
End Sub
由于A1:A2為合并單元格,但由于A3不是合并單元格,所以range("A1:A3").mergecells屬性為null,而如果為null的話,那么isnull()函數就為true,故輸出“包含有合并單元格”的提示。

實際上仔細想想,想判斷是否有合并單元格的目的就是想找到單元格所在的位置并對其進行操作,比如解除合并等。那上面的代碼感覺沒有多少實用的價值,倒不如遍歷更有價值,但上面的代碼也有借鑒的意義,尤其是在大數據量的情況下,靠目視不大好看的時候這個就可顯示出其價值了。

4、合并單元格且保留原有內容

基本的思路就是指定需要合并的單元格區域,利用遍歷,將所有需要合并單元格的內容提取至一個變量中,然后合并,將變量賦值給合并后的單元格。

忽然想到一個問題:for each 對單元格遍歷時是先行后列還是先列后行?猜一下:先行后列

Sub 合并單元格且保留原框內容()
??? Dim MyRange As Range, s As String, MeRange As Range
??? Set MyRange = Range("A1").CurrentRegion '將當前單元格區域賦給MyRange,返回對象為Range
??? For Each MeRange In MyRange
??????? s = s & MeRange.Value
??? Next MeRange
??? Debug.Print s
??? Application.DisplayAlerts = False
??? MyRange.Merge
??? MyRange.Value = s
??? Application.DisplayAlerts = True
End Sub
上面的猜題結果正確!!因為Excel VBA的習慣就是先行后列。

5、取消合并單元格且在每個單元格里保留內容

為便于練習,先建立一個含有合并單元格的例子:

Sub 自動合并單元格并賦值()
??? Dim i As Integer, MyRange As Range
??? Application.DisplayAlerts = False
??? For i = 1 To 10
??????? Set MyRange = Range(Cells(2 * i - 1, 1), Cells(2 * i, 1))
??????? MyRange.Merge
??????? MyRange.Value = i
??? Next i
??? Application.DisplayAlerts = True
End Sub
下面要做的工作就是在指定工作表中取消合并單元格,并且在每個單元格中保留內容

Sub 取消合并單元格并每個單元格均保留內容()
??? Dim totalR As Integer, i As Integer, Tt As String, Cnt As Integer
??? totalR = Range("A65536").End(xlUp).Row + 1 '合并后單元格在計數時少1個,故真正的行數應+1
??? For i = 1 To totalR
??????? Debug.Print "i=" & i
??????? Tt = Cells(i, 1).Value
??????? Cnt = Cells(i, 1).MergeArea.Count
??????? Cells(i, 1).UnMerge
??????? Range(Cells(i, 1), Cells(i + Cnt - 1, 1)).Value = Tt
??????? i = i + Cnt - 1 '明白了!!
??? Next i
End Sub
上面的代碼有個地方終于搞明白了,就是關于為什么i = i + Cnt - 1,而不是i=i+Cnt?這里給i重新賦值后,就到了下一次循環,本來如果i=i+Cnt正好是從下一個合并單元格的第1個單元格開始操作,但由于到了下一循環i會自動加上1,就導致跑到第2個單元格了,會出現漏取消的情況。而如果令i=i+Cnt-1的話,正好由于循環本身要給i加1正好可以實現從下一個合并單元格的第1個單元格開始。

6、合并相同內容的單元格

這個也經常用到,但首先要搞清楚,是要在保留現狀的基礎進行合并,還是先按要合并的內容排序后再進行合并。一般情況下都是先排序,即將相同的內容排在一起,然后進行合并單元格操作。

為了防止漏掉,可以從最后一個單元格開始倒序合并,這樣可以有效的避免漏合并現象。

建立一個樣表:

Sub 建立一系列相同內容的單元格()
??? Dim i As Integer
??? Columns(2).Delete '如何刪除整列(第2列)啊?這不就可以了嗎?
??? Rows(2).Delete '如何刪除整行(第2行)啊?這也可以啊。
??? Columns(1).Insert '如何插入一整行(在第1列之前插入)?一樣可現.
??? For i = 1 To 10
??????? Range(Cells(2 * i - 1, 2), Cells(2 * i, 2)).Value = i
??? Next i
End Sub
合并相同內容單元格

Sub 合并相同內容單元格()
??? Dim totalR As Integer, i As Integer
??? totalR = Range("B65536").End(xlUp).Row
??? Application.DisplayAlerts = False
??? For i = totalR To 2 Step -1
??????? If Cells(i, 2).Value = Cells(i - 1, 2).Value Then
??????????? Range(Cells(i - 1, 2), Cells(i, 2)).Merge
??????? End If
??? Next i
??? Application.DisplayAlerts = True
End Sub

?

43 Things: Excel, Excel VBA, Range, VBA, 愛好者, 程序設計, 工作表, 循環
BuzzNet: Excel, Excel VBA, Range, VBA, 愛好者, 程序設計, 工作表, 循環
del.icio.us: Excel, Excel VBA, Range, VBA, 愛好者, 程序設計, 工作表, 循環
Flickr: Excel, Excel VBA, Range, VBA, 愛好者, 程序設計, 工作表, 循環
IceRocket: Excel, Excel VBA, Range, VBA, 愛好者, 程序設計, 工作表, 循環
LiveJournal: Excel, Excel VBA, Range, VBA, 愛好者, 程序設計, 工作表, 循環
Technorati: Excel, Excel VBA, Range, VBA, 愛好者, 程序設計, 工作表, 循環
?今天你菊子曰了么?

轉載于:https://www.cnblogs.com/xiehui/archive/2011/04/26/2029691.html

總結

以上是生活随笔為你收集整理的VBA实战技巧精粹014:关于Range总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。