數(shù)據(jù)有復制次數(shù)限制,如何用VBA來復制內(nèi)容?
?
作者:E圖表述來源:部落窩教育發(fā)布時間:2021-12-10 09:27:13點擊:5723
編按:
復制、粘貼,同學們一定不陌生,大部分的情況下,都可以選中區(qū)域,CTRL+C,CTRL+V搞定。但是如果遇到數(shù)據(jù)有復制次數(shù)的限制又怎么辦呢?趕緊來看一看吧!
這是作者的一個朋友問的問題,按照復制次數(shù)在E:F列中粘貼內(nèi)容,效果圖如下:
這樣的情況,同學們?nèi)绾翁幚砟??還是CTRL+C、CTRL+V?那也是可以操作的,詳細見動圖:
如果,這份數(shù)據(jù)有幾千行的話,使用快捷鍵就極有可能出錯。今天就讓我們來看看如何用3段VBA代碼來解決這個問題吧!
第一段代碼:
Sub 按指定次數(shù)復制()
Range("E2:F10000").ClearContents
For Each rng In Range("C2:C" & Cells(Rows.Count, "C").End(3).Row)
Range(Cells(rng.Row, "A"), Cells(rng.Row, "B")).Copy
For i = 1 To Cells(rng.Row, "C")
Cells(Cells(Rows.Count, "E").End(3).Row + 1, "E").Select
ActiveSheet.Paste
Next i
Next
End Sub
代碼解析:
''Line1:工程起始語句
''Line2:清空E2:F10000區(qū)域原有的數(shù)據(jù)
''Line3:在“復制次數(shù)”的C列中,循環(huán)每一個單元格變量rng
''Line4:使用copy方法,復制對應行的AB兩列單元格
''Line5:按照C列中的復制次數(shù),確定循環(huán)次數(shù)
''Line6:選中E列最后一個沒有值的空單元格
''Line7:使用Paste方法粘貼
''Line8:結束i變量的循環(huán)
''Line9:結束對單元格的循環(huán)
''Line10:工程結束語句
這是典型的把手動操作“直譯”為代碼的過程,遍歷“復制次數(shù)”,然后就COPY和PASTE,相當于就是讓代碼去CTRL+C和CTRL+V。雖然功能上可以達到要求,但是對于代碼的運算效率來說,也只能是解放了雙手的勞動,而不能很好提速。
第二段代碼:
Sub 按指定次數(shù)復制2()
arr = Range("A2:C" & [A10000].End(3).Row)
a = Application.WorksheetFunction.Sum(Application.Index(arr, , 3))
ReDim brr(1 To a, 1 To 2)
For i = 1 To UBound(arr)
For j = 1 To arr(i, 3)
k = k + 1
brr(k, 1) = arr(i, 1)
brr(k, 2) = arr(i, 2)
Next j
Next i
Range("E2:F10000").ClearContents
[E2].Resize(UBound(brr), UBound(brr, 2)) = brr
End Sub
代碼解析:
‘’Line1:工程起始語句
‘’Line2:將A~C列裝入數(shù)組arr
‘’Line3:按照數(shù)組第3列的復制總次數(shù),確定新數(shù)組brr的行數(shù)
‘’Line4:定義新數(shù)組brr
‘’Line5:循環(huán)數(shù)組arr
‘’Line6:此行判斷需要復制x次
‘’Line7:計數(shù),確定新數(shù)組當下要處理的行號
‘’Line8:將arr第1列的對應內(nèi)容賦值給新數(shù)組brr的第1列
‘’Line9:將arr第2列的對應內(nèi)容賦值給新數(shù)組brr的第2列
‘’Line10:結束當下的復制過程
‘’Line11:進行下一列關鍵字的復制過程
‘’Line12:清空E1:F10000的區(qū)域
‘’Line13:將新數(shù)組賦值給從E1單元格開始的區(qū)域
‘’Line14:工程結束語句
將操作對象的過程,轉換成放到內(nèi)存數(shù)組中運算,這樣的操作對于代碼的運行效率是相當有效果的。只是這十幾行的統(tǒng)計,大家可以從動圖中感覺到快慢了吧!那么還有沒有其他的代碼可以解決“按次數(shù)復制粘貼”的過程呢?答案是肯定的。
第三段代碼:
Sub 按指定次數(shù)復制3()
arr = Range("A2:C" & [A10000].End(3).Row)
Set d = CreateObject("scripting.dictionary")
For i = 1 To UBound(arr)
For j = 1 To arr(i, 3)
d(arr(i, 1) & "|" & arr(i, 2) & "|" & j) = ""
Next j
Next i
Range("E2:F10000").ClearContents
For Each d1 In d.keys
k = k + 1
Cells(k + 1, 5).Resize(1, 2) = Split(d1, "|")
Next
End Sub
代碼解析:
''Line1:工程起始語句
''Line2:將A~C列裝入數(shù)組arr
''Line3:創(chuàng)建變量d為字典變量
''Line4:循環(huán)數(shù)組arr
''Line5:判斷需要復制x次
''Line6:將數(shù)組arr的第1列、第2列、被復制的次數(shù)序號,用|符號鏈接起來最為新的關鍵字,賦值到字典中
''Line7:結束當下的復制過程
''Line8:進行下一列關鍵字的復制過程
''Line9:清空E1:F10000的區(qū)域
''Line10:在字典d中循環(huán)每一個字典關鍵字元素
''Line11:計數(shù),確定單元格對應的行號
''Line12:從E2單元格開始逐行賦值,用split函數(shù)按照|符號拆分字符串(相當于分列的功能)
''Line13:結束字典變量循環(huán)
''Line14:工程結束語句
這第三段代碼,是使用了“字典”功能來處理的。雖然也在使用數(shù)組,但是不得不說,字典的運行效率要比數(shù)組會更快。如果我們要處理一個幾千、幾萬行數(shù)據(jù)的情況,第四種方式的處理效率,就會立竿見影。
【結束語】
很多同學都是“談VBA色變”,甚至是抵觸,但是作者E圖表述在十幾年的實際工作EXCEL操作中總結出一句話,在這里和大家分享:函數(shù)學的越多,只會讓你的工作越來越多,因為你的能力強,領導自然讓你多分擔;只有學會使用VBA,才能讓你真正的解放雙手,從眾多統(tǒng)計員中脫穎而出,才有可能升職加薪。
所以不要再說學EXCEL沒用,而是你要學習有用且可變現(xiàn)的能力。
本文配套的練習課件請加入QQ群:902294808下載。
做Excel高手,快速提升工作效率,部落窩教育《一周Excel直通車》視頻和《Excel極速貫通班》直播課全心為你!
掃下方二維碼關注公眾號,可隨時隨地學習Excel:
相關推薦:
將excel中的數(shù)據(jù)按照指定數(shù)量進行重復,非得用VBA才能實現(xiàn)嗎?
Power Query的數(shù)據(jù)替換技巧比Excel函數(shù)更萬能!
版權申明:
本文作者E圖表述;同時部落窩教育享有專有使用權。若需轉載請聯(lián)系部落窩教育。
最熱教程
- 像綠皮火車一樣長像珠穆拉瑪峰一樣高的Excel表怎么操作才方便?
- Power Query實戰(zhàn):按指定次數(shù)遞增數(shù)據(jù)
- 2019年全網(wǎng)最全—excel提取身份證信息合集!(建議收藏)-下篇
- 明明沒有重復,Excel卻判定數(shù)據(jù)重復,這是怎么回事?
- 文本格式的求和,及求和中最容易出現(xiàn)的問題解疑
- 致命缺陷:不懂一維表!
- 函數(shù)組合思維,你有嗎?
- 學會這2個公式,整理考勤數(shù)據(jù)只要一分鐘
- 就算被說是拍馬屁也成,今天你應該這樣發(fā)Excel報表……
- 如何計算Excel單元格中的算式,四種求和方法請收好!