如何用VBA 刪除EXCEL 的舊資料


EXCEL 有超過50筆的資料

資料從第9列 開始
當資料超過58列時
就刪除前面的舊資料
例如 超過10筆 就刪除前面10列的資料

請問VBA 語法該如何寫??
2016-01-27 15:39 發佈
文章關鍵字 VBA excel 資料
依在下所知而言,
你所列需求可以用二種方式來處理,
1.直接圈選 "整列" 舊的資料部份,然後再做刪除,這樣新的資料自然會往上替位取代舊的資料位置。
2.只自資料最後端當起始點,往上圈選需要留存的資料範圍後,然後 "剪下" 接著在上頭原本資料最開頭的起始點 "貼上"。
以上這二種方式都能達到您要的目的。


假設您的表格內容是如下這般,資料一樣是從第9列開始,
總資料有12列[A9:C20],只想保留的範圍為7列[A9:C15]
那麼以上二種方式做法分別如下:



方式(1.)

因為超過 "第15列" 後的資料共有5列,所以在資料最開頭處要刪除5列,才能把往下的資料都提升5列至範圍內,
意思也就是要刪除 "第9~第13列",如下

Worksheets("表格名稱").Range("$9:$13").Delete

Worksheets("表格名稱").Range(Rows(9),Rows(13)).Delete
以上二個式子都是表達相同的做法意思,不過是寫法不同而已。

不過,更簡便的方式是用自動判斷有資料的最後一列位置,然後再算出要刪多少列,接著再來做刪除動作,如下

'求得 "A欄" 最後一格有資料存在的參照位址
Dim vEndCell As Variant
Set vEndCell = Range("$A"& Worksheets("表格名稱").Rows.Count).End(xlUp)
'假如最後一格有資料存在的參照位址是超過底部資料範圍 "第15列",就進行刪除舊資料做移位
If (vEndCell.Row > 15) Then
Worksheets("表格名稱").Range("$9:$" & Range("$9").Offset((vEndCell.Row-15)-1).Row).Delete
End If

'求得 "A欄" 最後一格有資料存在的參照位址
Dim vEndCell As Variant
Set vEndCell = Range("$A"& Worksheets("表格名稱").Rows.Count).End(xlUp)
'假如最後一格有資料存在的參照位址是超過底部資料範圍 "第15列",就進行刪除舊資料做移位
If (vEndCell.Row > 15) Then
Worksheets("表格名稱").Range(Rows("$9"), Rows("$9").Offset((vEndCell.Row-15)-1)).Delete
End If

其實上面 (vEndCell.Row-15)-1 可以直接寫成 vEndCell.Row-16
但為了讓您能比較容易第一眼就看出其每個數值所代表的意思,因此才故意這樣寫的。


方式(2.)

因為原本欲保留的資料範圍為[A9:C15]共有7列,
而最後一列有資料的位置是 "第20列",
所以要實際要保留的資料範圍為[A14:C20]共有7列,
做法上就是把[A14:C20]的內容剪下,然後在[A9]的位置貼上,
式子如下

Worksheets("表格名稱").Range("$A$14:$C$20").Cut
Worksheets("表格名稱").Range("$A$9").PasteSpecial XlPasteType
:=xlPasteValues


Worksheets("表格名稱").Range(Range("$A$14"),Range("$C$20")).Cut
Worksheets("表格名稱").Range("$A$9").PasteSpecial XlPasteType
:=xlPasteValues


能自動找有資料的最後一列位置進行動作的方式如下

'求得原資料保留區的範圍之列數
Dim lDataRows As Long
lDataRows = Range("$A$9:$C$15").Rows.Count
'求得 "A欄" 最後一格有資料存在的參照位址
Dim vEndCell As Variant
Set vEndCell = Range("$A"& Worksheets("表格名稱").Rows.Count).End(xlUp)
If (vEndCell.Row > 15) Then
'由最後有資料的那一列位置,往上圈選要保留的資料範圍(即原資料保留區的範圍之大小),並剪下
Worksheets("表格名稱").Range(Range("$A$" & (vEndCell.Row-lDataRows +1)),Range("$C$" & vEndCell.Row)).Cut
'在[A9]儲存格的位置將資料貼上
Worksheets("表格名稱").Range("$A$9").PasteSpecial XlPasteType :=xlPasteValues
End If

Dim lDataRows As Long, lDataColumns As Long
'求得原資料保留區的範圍之列數
lDataRows = Range("$A$9:$C$15").Rows.Count
'求得原資料保留區的範圍之欄數
lDataColumns = Range("$A$9:$C$15").Columns.Count
'求得 "A欄" 最後一格有資料存在的參照位址
Dim vEndCell As Variant
Set vEndCell = Range("$A"& Worksheets("表格名稱").Rows.Count).End(xlUp)
If (vEndCell.Row > 15) Then
'由最後有資料的那一列位置,往上圈選要保留的資料範圍(即原資料保留區的範圍之大小),並剪下
Worksheets("表格名稱").Range("$A$" & (vEndCell.Row-lDataRows+1)).Resize(lDataRows, lDataColumns).Cut
'在[A9]儲存格的位置將資料貼上
Worksheets("表格名稱").Range("$A$9").PasteSpecial XlPasteType :=xlPasteValues
End If

唉~問問題,就算不會,至少也上傳圖片、表格吧

誰知道資料是幾欄,想回答還要用猜的

交給您了,我沒興趣回答

不過 yuehmao 這篇如果有您的問題,我會回答
snare wrote:
....
不過 yuehmao 這篇如果有您的問題,我會回答(恕刪)


很謝謝您這麼說^^,
也真的很感謝您能指點在下的迷津。
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?