Board logo

標題: 刪除列之vba寫法 [打印本頁]

作者: jim    時間: 2011-6-26 16:08     標題: 刪除列之vba寫法

求較各位先進
   在 Sheet1內 想 刪除 column c 內 非屬於 cat  之各列 應如何寫
        A      B        C      D
1     23    34    cat     34
2     12    23    dog   23
3     34    12     yy     12
4     45    34    cat     45
5     23    23    dog    23
刪除  2 3 5 Rows  只剩
         A      B        C      D
  1     23    34    cat     34
  2     45    34    cat     45
   thanks
作者: am0251    時間: 2011-6-26 16:25

本帖最後由 am0251 於 2011-6-26 16:42 編輯

試一下這個
  1. Sub test()

  2. Dim myRowCount As Integer, Cat As Integer

  3. myRowCount = Range("A1").CurrentRegion.Rows.Count

  4. Cat = 1

  5. For i = 1 To myRowCount

  6. If Range("C" & Cat).Value <> "cat" Then

  7. Rows(Cat).Delete Shift:=xlUp

  8. Else

  9. Cat = Cat + 1

  10. End If

  11. Next i

  12. End Sub
複製代碼

作者: jim    時間: 2011-6-26 16:34

am0251
  對不起無法看到你的解答是否可再上傳謝謝
作者: jim    時間: 2011-6-26 16:43

多謝已經在測試再次感謝一列一列刪好像很慢 (因為有很多資料)
         無論如何謝謝
作者: am0251    時間: 2011-6-26 16:43

不會吧?按"F5"再看看~
作者: am0251    時間: 2011-6-26 16:46

那我再試一下別的更快的方法
作者: GBKEE    時間: 2011-6-26 19:21

回復 4# jim
  1. Sub Ex()
  2.     Dim Rng As Range, R As Range
  3.     For Each R In Range("A1").CurrentRegion.Rows
  4.         If R.Cells(3) <> "cat" Then If Rng Is Nothing Then Set Rng = R Else Set Rng = Union(Rng, R)
  5.     Next
  6.     Rng.Delete xlUp
  7. End Sub
複製代碼

作者: oobird    時間: 2011-6-26 20:25

藉此帖介紹一下ColumnDifferences用法:
Sub delrow()
r = [c:c].Find("cat").Row
[c:c].ColumnDifferences(Cells(r, 3)).Delete (3)
End Sub
作者: am0251    時間: 2011-6-27 14:22

受教了~~!!不過我有一點看不懂的,就是".Delete (3)"括號�堛�"3"是什麼意思呢?謝謝!!!
作者: oobird    時間: 2011-6-27 14:30

[attach]6852[/attach]
整列刪除擺在第3
作者: jim    時間: 2011-6-27 15:50

謝謝各位熱心的指導 再次感謝
作者: jim    時間: 2011-6-28 05:56

再度請較如果要分開來執行刪除應如何寫
          a    b    c    d       e    f    g    h
      ----------------------------------
1      2    3    x    1       2    1   y    1
2      1    2    y    3       2    3   x    3
3      3    2    x    2       3    2   x    2
4      2    3    z    3       4    2   x    3

即 a b c d 行 一組執行   [c:c].Find("x")     若非 x 刪 range(a2:d2) and (a4:d4)  不一定是2 ,4列
另一組 e f g h 行 執行   [g:g].Find("x")      若非 x 刪 range(e1:h1)   不一定是 列1
  這樣是否可行?

另外還有一個問題想請教
  sheet1 式自動篩選 含有隱藏列    5-10 若右手動執行copy a1:h20 至sheet2可以貼上(值)
  但是使用 vba來執行 卻不可貼上  出現 400警告圖  請教各位前輩應如寫此 vba  
謝謝
作者: jim    時間: 2011-7-23 15:35

再求教 oobird 先進
Sub delrow()
r = [c:c].Find("cat").Row
[c:c].ColumnDifferences(Cells(r, 3)).Delete (3)
End Sub

    在 Sheet1內 想 刪除 column c 內 屬於 ""  之各列 應如何寫
         A      B        C      D
1     23    34              34
2     12    23    dog   23
3     34    12              12
4     45    34    cat     45
5     23    23              23
刪除  1 3 5 Rows  只剩
          A      B        C      D
   1     12    23    dog   23
   2     45    34    cat     45
    thanks
作者: GBKEE    時間: 2011-7-23 15:57

回復 13# jim
可刪掉有空白的整列的另一語法 .
  1. Sub Ex()   
  2.     Range("a1").CurrentRegion.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
  3.    'CurrentRegion        傳回 Range 物件,該物件代表目前的區域。目前區域是指以任意空白列及空白欄的組合為邊界的範圍。
  4.    'SpecialCells              傳回 Range 物件,此物件代表與指定型態及值相符合的所有儲存格。
  5.    '參數    xlCellTypeBlanks 。 空儲存格
  6.    'EntireRow                 傳回 Range 物件,該物件代表包含指定範圍的整個列 (或若干列)。
  7. End Sub
複製代碼

作者: jim    時間: 2011-7-23 16:41

多謝你的指導
   但是其他 rows 還有空格 所以執行時全部刪除
作者: oobird    時間: 2011-7-23 20:59

多謝你的指導
   但是其他 rows 還有空格 所以執行時全部刪除
jim 發表於 2011-7-23 16:41



    [c:c].SpecialCells(4).Delete (3)
作者: jim    時間: 2011-7-24 10:05

再度求教 oobird 先進
SpecialCells(4).  4是何意思或作用
Sub delrow()
r = [c:c].Find("").Row
[c:c].SpecialCells(4).Delete (3)
End Sub
所有資料全刪

我把C位移至E
         A      B      C      D       E      F
1                     23    34              34
2             12           23    dog   23
3            34    12                      12
4     45                   34    cat     45
5     23    23                             23
刪除  1 3 5 Rows  只剩
           A      B        C      D      E       F
    1            12              23    dog   23
    2     45                     34    cat     45
   
Sub delrow()
r = [E:E].Find("").Row
[E:E].SpecialCells(4).Delete (3)
End Sub
       修改如下是否正確?          TKS
作者: oobird    時間: 2011-7-24 12:32

SpecialCells(4).  4是表示空白儲存格
   r = [E:E].Find("").Row~這行是多餘的

Sub delrow()
[E:E].SpecialCells(4).Delete (3)
End Sub
這樣即可
作者: jim    時間: 2011-7-24 13:20

oobird 先進
謝謝你的解說  試一下可行

請教一個問題 在純空格上執行 完全沒問題
若是再用 copy 貼上則無法執行 是否在4這個指令尚有問題?
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
作者: ABK    時間: 2020-7-18 22:08

[借題發問]
請教各位大大!  若第一列為表頭標題列( 需要保留),
在 Sheet1內 想 刪除 column c 內 非屬於 cat 和 dog 之各列  程式要如何修改呢?

           A         B           C          D
  1    編號    位置     名稱     天數
  2     23        34        cat        34
  3     12        23      dog        23
  4     34        12         yy        12
  5     45        34       cat         45
  6     23        23      dog        23
  7     13        18         xx        32


刪除  4 、7 Rows  只剩

           A          B          C          D
  1    編號    位置     名稱     天數
  2     23        34        cat        34
  3     12        23      dog        23
  5     45        34        cat        45
  6     23        23      dog        23
作者: 准提部林    時間: 2020-7-19 12:02

回復 20# ABK

沒檔案, 盲寫:
Sub TEST()
Dim xA As Range, xR As Range, xU As Range
Set xA = Sheets("Sheet1").UsedRange.Offset(1, 0)
For Each xR In xA.Columns(3).Cells
    If InStr("/cat/dog/", "/" & xR & "/") < 2 Then
       If xU Is Nothing Then Set xU = xR Else Set xU = Union(xU, xR)
    End If
Next
If Not xU Is Nothing Then xU.EntireRow.Delete
End Sub


=====================
作者: ABK    時間: 2020-7-21 22:01

回復 21# 准提部林


謝謝准堤大 !
cat 的列 也被刪除了!
作者: 准提部林    時間: 2020-7-22 09:47

回復 22# ABK

加一右斜線~~
If InStr("//cat/dog/", "/" & xR & "/") < 2 Then
作者: ABK    時間: 2020-7-22 13:14

回復 23# 准提部林


    感謝 准堤大 !
    OK了!
作者: ssooi    時間: 2020-12-18 13:26

回復 7# GBKEE


請問.......
如果我用「區域變數」來觀察他的變化
我該看rng裡面哪個數值?
裡面大概有30項跑不掉吧

抱歉
問了個很基礎的問題⋯⋯
但是我真的不曉得range裡面的各個數值代表的意義是什麼
作者: luhpro    時間: 2020-12-18 23:38

本帖最後由 luhpro 於 2020-12-19 00:02 編輯
回復  GBKEE


請問.......
如果我用「區域變數」來觀察他的變化
我該看rng裡面哪個數值?
裡面大概 ...
ssooi 發表於 2020-12-18 13:26


關於7#
要看的關鍵在那一行 : Rng = Union(Rng, R)
結果是個 "儲存格集合(即Range Union)".
儲存格本身是個 "物件" 組成元素太多了,
而我們要看的是該集合中變化(加減)了哪個儲存格,
所以只需要了解Union組成中儲存格的 "位址" 變化就夠了,
運算式用 :  Rng.address

關於 21#
要看的關鍵在那一行 : Set xU = Union(xU, xR)
運算式用 :  xU.address

在 "即時運算視窗" 中打上 ?(上述的運算式)
例如 :  ?Rng.address
再按 Enter 就可以知道集合中儲存格物件的增減(觀看顯示的位址群變化).

若不想F8跑一步就要按Enter看一次,
也可以在 "新增監看式" 中監看 : (上述的運算式) .
例如 :  Rng.address
作者: ssooi    時間: 2020-12-19 22:35

原來如此
物件裡面一堆數值
看的眼都花了
謝謝




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)