删除单元格_VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法...
生活随笔
收集整理的這篇文章主要介紹了
删除单元格_VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法...
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 要解決的問(wèn)題:刪除某列中的空單元格/空行
暫時(shí)只實(shí)現(xiàn)了刪除一列中的空行,并沒(méi)有實(shí)現(xiàn)多行的判斷空行和刪除方法。----之后再做更復(fù)雜的
1.1 需求分析
用VBA刪除如下內(nèi)容,解決思路都不同
2 如果是刪除全表/某區(qū)域的空單元格, 直接在當(dāng)前列刪除
簡(jiǎn)潔代碼:刪除區(qū)域內(nèi)所有空單元格 cells ---實(shí)際需要少,so用處不大
使用 sheet.usedrange / region.currentregion .specialcells()
- 刪除,表格頁(yè)面內(nèi)使用區(qū)域的空格所在的行
- 局限性就是表格的上方,左邊還會(huì)存在一些空行空列,不過(guò)這個(gè)手動(dòng)刪下就可以了
- 這個(gè)只是刪除了空的cells 并不是刪除了空行
ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Delete
End Sub
3 如果是刪一列的空行
3.1 代碼1:基礎(chǔ)代碼,假設(shè)確認(rèn)知道這列的長(zhǎng)度,關(guān)鍵是倒著刪
- 熟悉 isempty() 或者用 if xxxx=""
- 刪除單元格后,要設(shè)置屬性 shift:=xlup等
- 需要倒著刪除,否則會(huì)因?yàn)橐贿厔h除行,一遍重新排列有問(wèn)題
For i = 20 To 1 Step -1 '需要倒著刪除
If IsEmpty(Cells(i, 1)) Then
Cells(i, 1).Delete shift:=xlUp
End If
Next i
End Sub
3.2 改進(jìn)版: 先查這一列的非空最大行數(shù)
Sub jackma_delete_row()For i = Range("c65536").End(xlUp).Rows To 1 Step -1
If IsEmpty(Cells(i, 3)) Then
rows(i).Delete shift:=xlUp
End If
Next i
End Sub
3.3 也可以不用 isempty() 函數(shù),直接判斷 if cells()=""
- 直接判斷 if cells(i,j) =""
- 這種刪除整行不合適 rows(i) .delete,會(huì)影響其他列的元素
For i = Range("c65536").End(xlUp).Row To 1 Step -1
If Cells(i, 3) = "" Then
Cells(i, 3).Delete
' Rows(i).Delete
End If
Next i
End Sub
4 不動(dòng)原數(shù)據(jù),將非空數(shù)據(jù)放到另外一列
4.1 錯(cuò)誤版:
要明白“寫(xiě)入列”的循環(huán)數(shù),明顯和“輸出列”的循環(huán)數(shù) 應(yīng)該不同!這么寫(xiě)相當(dāng)于 輸出列 那行為空的時(shí)候,只是不往 寫(xiě)入列寫(xiě),所以沒(méi)覆蓋,也是空的
Sub jackma_delete_row2()
For i = 1 To Range("c65536").End(xlUp).Rows
If Not IsEmpty(Cells(i, 3)) Then
Cells(i, 9) = Cells(i, 3)
End If
Next i
End Sub
4.2 正確版: 寫(xiě)入列/輸出列,應(yīng)該是單獨(dú)的循環(huán)變量!
Sub jackma_delete_row2()k = 1
For i = 1 To Range("c65536").End(xlUp).Rows
If Not IsEmpty(Cells(i, 3)) Then
Cells(k, 9) = Cells(i, 3)
k = k + 1
End If
Next i
End Sub
5 先寫(xiě)入數(shù)組array中,再寫(xiě)到其他地方,據(jù)說(shuō)這樣能大幅提高速度!
把需要的篩選的數(shù)據(jù),存在數(shù)據(jù),然后從數(shù)組寫(xiě)到需要的地方,這是個(gè)好習(xí)慣
第1版:局限性很大,沒(méi)有自動(dòng)查這列的 元素個(gè)數(shù),以及 最大非空行是多少
Sub 刪除空格4()Dim arr1() '定義了一個(gè)數(shù)組,并且是動(dòng)態(tài)數(shù)組,因?yàn)闆](méi)指定大小
ReDim arr1(11) '動(dòng)態(tài)數(shù)組,使用前必須重新redim,數(shù)組大小
j = 0 'j=1開(kāi)始,不會(huì)越界,但arr1(0)為空,因?yàn)橘x值跳過(guò)了它
For i = 1 To 11 Step 1
If Not IsEmpty(Cells(i, 1)) Then
arr1(j) = Cells(i, 1)
j = j + 1
End If
Next i
For j = 0 To UBound(arr1())
Cells(j + 1, 9) = arr1(j) '單元格得從1開(kāi)始,arr(),默認(rèn)得從0開(kāi)始,但可以改
Next j
End Sub
第2版重寫(xiě)
注意debug.print用來(lái)監(jiān)測(cè)的時(shí)候,需要注意,放在循環(huán)的位置,尤其是在k=K+1這種變化時(shí),和放在哪個(gè)for循環(huán)之內(nèi)外!
Sub ponyma_array22()Dim arr1() '當(dāng)數(shù)組定義,且默認(rèn)開(kāi)始的index為0! preserve時(shí)需要有0的index
'dim arr1 當(dāng)變量定義
k = 1
m = 1
ReDim arr1(0 To Application.WorksheetFunction.CountA(Range("c:c")))
For i = 1 To Range("c65536").End(xlUp).Row Step 1
If Cells(i, 3) <> "" Then
Debug.Print Cells(i, 3)
arr1(k) = Cells(i, 3)
Debug.Print arr1(k)
k = k + 1
' Debug.Print arr1(k),寫(xiě)在這里問(wèn)題1:k已經(jīng)變了,下一個(gè)k還沒(méi)賦值為空,2最后的k越界
' 循環(huán)是很精巧的,放的地方很講究,放得不對(duì),就錯(cuò)誤百出
' Debug.Print arr1(k) 如果放在k=K+1 后,就看起來(lái)沒(méi)打印出東西,因?yàn)槎即蛴〉腶rr1的空元素
End If
Next i
For j = 1 To UBound(arr1(), 1)
Cells(m, 10) = arr1(j)
m = m + 1
Next j
End Sub
第3版
Option ExplicitSub ponyma1()
Dim arr1()
Dim k1, k2, k
Dim i, j
k1 = WorksheetFunction.CountA(Range("a:a"))
k2 = Range("a65536").End(xlUp).Row
Debug.Print "這列非空數(shù)據(jù)個(gè)數(shù)k1=" & k1
Debug.Print "這列最后1個(gè)有數(shù)據(jù)的行數(shù)k2=" & k2
'arr1(0) = 1
'ReDim Preserve arr1(1, k)
'這樣會(huì)越界,因?yàn)槟阈枰猵reserve數(shù)據(jù)。但是index系不符合
'但是,如果不preserve 就無(wú)所謂
'或者雖然 dim arr1() 是動(dòng)態(tài)數(shù)據(jù)從index0開(kāi)始,但是arr1()一直為空,preserve也不會(huì)出現(xiàn)index越界問(wèn)題
ReDim Preserve arr1(1 To k1)
'ReDim Preserve arr1(1, k1) 這樣就會(huì)越界。。。因?yàn)檎Z(yǔ)法是2維數(shù)組了!
'ReDim Preserve arr1(1 to k1) 這樣就對(duì)的
k = 1
For i = 1 To k2
If Cells(i, 1) <> "" Then
arr1(k) = Cells(i, 1)
Debug.Print arr1(k)
k = k + 1
End If
Next i
————————————————
版權(quán)聲明:本文為CSDN博主「奔跑的犀牛先生」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:【原創(chuàng)】VBA(實(shí)驗(yàn)1)用VBA 刪除某列空單元格的3種方法:刪除法,轉(zhuǎn)移到其他列方法,數(shù)組方法
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的删除单元格_VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么进入主板设置启动u盘 进入主板设置启
- 下一篇: java arraylist底层实现原理