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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

删除单元格_VBA(实验1)用VBA 删除某列空单元格的3种方法:删除法,转移到其他列方法,数组方法...

發(fā)布時(shí)間:2025/3/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 删除单元格_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)容,解決思路都不同

  • 刪除1列的空行(本文要做的)
  • 刪除整個(gè)區(qū)域內(nèi)的空行
  • 刪除整個(gè)區(qū)域內(nèi)的空格(這個(gè)一般很少有這種需求,用處不大----可用currentregion .specialcells()解決)
  • 下面是原始數(shù)據(jù),下面看看如何處理
  • 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 并不是刪除了空行
    Sub 刪空單元格()
    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)題
    Sub 刪一列的空行()
    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ì)影響其他列的元素
    Sub ponyma_del_row1()
    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 Explicit
    Sub 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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。