iT邦幫忙

1

EXCEL 刪除多個工作表內的資料,並且做剪下貼上動作

  • 分享至 

  • xImage

EXCEL 有多個工作表(如範本有清單、AA、BB、CC),並且AA、BB、CC工作表有超過50筆的資料
問題如下
針對工作表AA、BB、CC,資料從第2列開始,並且每個工作表內的資料筆數都不一樣
當資料筆數超過30列時,就刪除前面的30筆舊資料,如Range("A2:D31"),但TOTAL欄位是不動的
並且將工作表AA、BB、CC底下的資料(第31筆)往上做移動 (如剪下/貼上)

我上網找到一些資料如下針對單一工作表動作,但執行上有些問題,能幫幫我嗎?或是有其他簡單的程式碼可做到,附上測試檔案圖片,謝謝
Sub Cut()
Dim lDataRows As Long
lDataRows = Range("$A$2:$D$30").Rows.Count

Dim vEndCell As Variant
Set vEndCell = Range("$A" & Worksheets("表格名稱").Rows.Count).End(xlUp)
If (vEndCell.Row > 30) Then

Worksheets("表格名稱").Range(Range("$A$" & (vEndCell.Row - lDataRows + 1)), Range("$D$" & vEndCell.Row)).Cut

Worksheets("表格名稱").Range("$A$2").PasteSpecial XlPasteType:=xlPasteValues
End If
End Sub!

https://ithelp.ithome.com.tw/upload/images/20230102/20156572xu4FMb67fy.jpg
https://ithelp.ithome.com.tw/upload/images/20230102/20156572V6wCAO76t4.jpg
https://ithelp.ithome.com.tw/upload/images/20230102/20156572Y4pjESJICJ.jpg

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
haiyen_lee
iT邦新手 5 級 ‧ 2023-01-02 20:08:41

TOTAL 是 B、C、D 三欄計算而得,看起來是可以直接刪除掉,不刪的原因應該是怕刪掉後後面預留的 TOTAL 計算會越來越少。其實只要設為表格就可避免這個問題。 設為表格後問題就簡單了,只要確定資料超過 30 列直接刪 2-31 列就解決了。
Sub Cut()
Rows("2:31").Select
Selection.Delete
End Sub

chenp123 iT邦新手 5 級 ‧ 2023-01-02 21:48:54 檢舉

感謝haiyen_lee大大的回覆,用Delete有試過,但這樣我的列會越來越少(預設為100列)之後還是要手動在增加,另外試了您說的將TOTAL"設為表格"方式,預設的100列還是變少到70列,所以才會想TOTAL這行不能刪,A~D只能使用剪下\貼上的方式。

另外一個問題,能針對多個工作表AA、BB、CC執行程式做到嗎?謝謝

1
海綿寶寶
iT邦大神 1 級 ‧ 2023-01-03 07:47:47

除了剪下貼上
也可以試試「刪除儲存格(上移)」

Range("A2:D31").Select
Selection.Delete Shift:=xlUp
chenp123 iT邦新手 5 級 ‧ 2023-01-03 08:02:36 檢舉

感謝 海綿寶寶
試著使用提共的方式,發現TOTAL欄位發生了問題https://ithelp.ithome.com.tw/upload/images/20230103/20156572WEYWqyC2Qj.jpg
不過還是謝謝您

0
la1ala0rz
iT邦新手 5 級 ‧ 2023-01-03 13:48:45

結合haiyen_lee大的想法, 加上自動補足100行, 加上用陣列儲存固定的sheet名稱, 大概會長這樣吧

Sub gg()

For Each a In Array("bb", "CC", "aa")
    Set s = Sheets(a)
    If s.Range("a1").End(xlDown).Row > 31 Then
        s.Range("2:31").Delete
        cc = s.Range("a2").End(xlDown).Row
        If cc < 100 Then
            For i = 1 To 100 - cc
                x = cc + i
                s.Range("e" & x).Formula = "=b" & x & "+c" & x & "+d" & x
            Next i
        End If
    End If
Next a

End Sub
chenp123 iT邦新手 5 級 ‧ 2023-01-05 19:33:34 檢舉

感謝la1ala0rz,只是我有多個sheet(上面只是範列AA、BB 、CC),若有多個SHEET有什麼方式ㄋ

0
aaron3399
iT邦好手 1 級 ‧ 2023-01-03 15:01:00

試試這個.......
與1-30刪除的方法不同的是,這是從後面將31-100區域往上搬移蓋回去

另外多工作表執行的寫法,就參考其他大大內容自行增加嘍~

Sub test()
Set s = Sheets("AA") '指定工作表AA
If s.Range("A1").End(xlDown).Row > 31 Then
   s.Range("A2:D101").Value = s.Range("A32:D131").Value '直接將30以後區間複製上移
 End If
End Sub
chenp123 iT邦新手 5 級 ‧ 2023-01-05 19:36:04 檢舉

感謝這方式有點接近我想要的,只差若有多個工作表(SHEET)要如何執行了,謝謝

aaron3399 iT邦好手 1 級 ‧ 2023-01-06 00:17:57 檢舉

真是拿你沒辦法....XDXD

Sub test()
For i = 1 To Worksheets.Count   '跑所有Sheets
Set s = Sheets(i) '指定工作表
  If s.Range("A1").End(xlDown).Row > 31 Then
   s.Range("A2:D101").Value = s.Range("A32:D131").Value '直接將30以後區間複製上移
  End If
End Sub
0
eric_hsu58
iT邦新手 3 級 ‧ 2023-01-05 11:45:12

用隱藏的方式,把 2 ~ 31列 隱藏就可以了。

chenp123 iT邦新手 5 級 ‧ 2023-01-05 19:37:26 檢舉

這.....手動嗎??有很多個工作表會累死人的,不過還是感謝您

我要發表回答

立即登入回答