Board logo

標題: 一份新的VBA遇到的問題 [打印本頁]

作者: play9091    時間: 2011-7-22 15:21     標題: 一份新的VBA遇到的問題

我在做一份新的VBA……遇到一個問題,想請教一下版上的先進……

一、
本來是想用進階篩選的,但是發現進階篩選沒有辦法對顏色做篩選。
例如:我要篩選出紅色的儲存格
不知道用VBA是不是有其它的方法可以解決……

二、
另外,如果不用進階篩選的話,可不可能選出唯一值(不要重複的值)
作者: GBKEE    時間: 2011-7-22 16:09

本帖最後由 GBKEE 於 2011-7-22 20:15 編輯

回復 1# play9091
  1. Sub Ex()
  2.     Dim D As Object, E As Variant
  3.     Set D = CreateObject("Scripting.Dictionary")    'Dictionary用於儲存資料關鍵字和項目對。,通常是整數或字串,可以是除陣列外的任何型態。
  4.     For Each E In Sheet1.Range("A2").CurrentRegion.Rows   'Sheet1.A2連續範圍列的集合
  5.         If E.Cells(1).Interior.ColorIndex = 3 Then        'ColorIndex = 3  紅色
  6.             If Not D.EXISTS(E.Cells(1).Value) Then Set D(E.Cells(1).Value) = E
  7.             'Not D.EXISTS(E.Cells(1).Value) 找不重複的值
  8.             'Set D(E.Cells(1).Value) = E : Dictionary.ITEMS->設定為E的整列(Range 物件)
  9.         End If
  10.     Next
  11.     For Each E In D.ITEMS
  12.         Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, E.Columns.Count) = E.Value
  13.         'E.Columns.Count =>傳回E的整列的欄數
  14.        ' E.Copy Sheet2.Range("A" & Rows.Count).End(xlUp).Offset(1)  'copy的方法
  15.     Next
  16. End Sub
複製代碼

作者: play9091    時間: 2011-7-23 12:53

回復 2# GBKEE

感謝版主的回答,新的這一份VBA遇到的問題真的是太多了,不知道我直接在這個討論串裡面問合適不合適,如果版大覺得不合適,我再開分帖……

目前因為寫了很多的「select」,感覺,一直選來選去的,有沒有其它的方法可以減少這種情況,程式的效率應該也會相對提高,然後我就在網路上找到了這篇文章……
一、數數看你的程式裡有多少 "Select" ?
除非程式就是要依使用者選取的物件來做動作,否則 Select 和 Selection 都是多餘的.
◎ 標準的物件控制語法:
  物件.方法 (例如 Range("A1").Copy)
  物件.屬性 = 值 (例如 Range("A1").ColorIndex = 15)
而不是一定要先 Select 物件然後再對 Selection 做動作.

舉例而言,你要複製 Sheet1.A1 的值到 Sheet2.B1 --
 Range("A1").Copy
 Sheets(2).Select
 Range("B1").Select
 Range("B1").PasteSpecial xlPasteValues
其實可以這麼寫 --
 Sheets(2).Range("B1") = Sheets(1).Range("A1")
如果內容與格式都要複製,可以這麼寫 --
 Sheets(1).Range("A1").Copy Sheets(2).Range("B1")

不要看這沒什麼,你的VBA觀念和程度能否更進一步,這是很重要的一點。


他這邊舉的例子,只有單格而已
一、是否有多格的寫法……
二、這種寫法可不可以跨sheet或是跨BOOK??
作者: GBKEE    時間: 2011-7-23 13:10

回復 3# play9091
這種寫法可不可以跨sheet或是跨BOOK??                爬一下文 就有啦!    請看
作者: play9091    時間: 2011-7-23 14:48

回復 4# GBKEE

感謝版主的連結,剛剛看了之後去實做了一下,很好用……少了很多「select」的動作……

一、剛剛又遇到了另外一個問題,就是如果用上面這種方法,沒有辦法取出篩選後的結果
意思是,如果我選定範圍,然後對這個範圍作篩選後,沒有辦法用上面的方法取出篩選後的結果……

二、如果只取出值的話好像不可以實現,如下:
sheets(1).range("A1:A4")=sheets(2).range("A1")      ←Fail

下面這個才是我現在的大問題!!!
三、選定一個範圍後,對這個範圍作篩選,如果這一次的篩選沒有東西(結果)的話,這時候「Selection.Copy」整個選定的資料全部複制……
         有什麼方法可以讓它不複制沒有篩選出來的資料呢??
作者: GBKEE    時間: 2011-7-23 15:14

回復 5# play9091
是這樣嗎?
  1. Sub ttt()
  2.     Sheets("Sheet1").Range("E3") = ""
  3.     Sheets("Sheet1").Range("E4").Value = "=AND(TEXT(RIGHT(A11, 8), ""hh:mm:ss"") >= ""02:00:00"",TEXT(RIGHT(A11, 8), ""hh:mm:ss"") <= ""21:30:00"")"
  4.     Set Rng = Range("A10").CurrentRegion
  5.     Rng.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range("E3:E4"), Unique:=False
  6.     Set Rng = Rng.SpecialCells(xlCellTypeVisible)   '資料區可見的儲存格
  7.     If Rng.Count > Rng.Columns.Count Then           '有篩選到資料
  8.     'Rng.Count: 篩選到資料總數 > Rng.Columns.Count: 資料區可見儲存格的的欄位數
  9.         Rng.Copy Sheets("SheetX").[A1]              '你要的位置
  10.     End If
  11. End Sub
複製代碼

作者: play9091    時間: 2011-7-26 10:41

回復 6# GBKEE

感謝版主,熱心的指教。
因為使用「CurrentRegion」的話,會把第一列也選進去,所以後來我用了其它的方法來解決了我的問題。如下……
  1.     NowR = Range("A65535").End(xlUp).Row '取得可見列的列號
  2.     If NowR <> 2 Then '第二列為抬頭,若等於二就不做下面的事
  3.     Selection.Copy
  4.     Sheets("頻點").Select
  5.     Range("A1").Select
  6.     Call 貼上值
  7.     Selection.Font.Color = RGB(255, 0, 0)
  8.     Call 移除重複
  9.     Sheets("Cluster " & i).Select
  10.     End If
複製代碼
然後……現在我遇到了另外一個問題,上面也問過了,版主也有回答過了,但小弟功力尚淺,沒有辦法理解為什麼這樣子寫……
而我用我自已的方法也弄不出來,所以想請教一下……下面這樣子的寫法哪裡有錯了,又:應該怎麼樣子去修正呢??
  1. Workbooks("X').Sheets("Y").Range("B11:D12").Copy Workbooks("Z").Sheets("G").Range("A1")
複製代碼

作者: GBKEE    時間: 2011-7-26 11:34




回復 7# play9091
第一個問題好像沒有完全決解  當 篩選到的資料 不是連續範圍, 時就不行哦!
  1. Rng.Copy Sheets("Sheet2").[A2] '你要的位置
  2.            Sheets("Sheet2").[A2:D2].Delete xlUp '刪除那一列的範圍
  3. 或是    Sheet2.[A2].EntireRow.Delete '整列刪除
複製代碼
      
錯誤在那裡找找看
Workbooks("X').Sheets("Y").Range("B11:D12").Copy Workbooks("Z").Sheets("G").Range("A1")
作者: play9091    時間: 2011-7-26 12:13

回復 8# GBKEE

第一個問題我已經用我的方法解決了!

然後……出錯的地方,那是我打錯啦!!
Workbooks("book1").Sheets("sheet1").Range("B11:D12").Copy Workbooks("book2").Sheets("sheet2").Range("A1")
即使是這樣子還是錯!沒有辦法執行!!!!
作者: GBKEE    時間: 2011-7-26 12:55

回復 9# play9091
又出錯  公式沒問題啊, 執行階段錯誤 9:  對嗎?
檢查WorkBook 是已開啟的嗎?  工 作表名稱存在嗎?
作者: play9091    時間: 2011-7-26 13:27

本帖最後由 play9091 於 2011-7-26 13:32 編輯

回復 10# GBKEE

感謝版主耐心的回答,我試成功了……之前是檔名抓錯……

還有另外一個用這種方法有沒有辦法只COPY值,因為我的來源是用公式來的!我想要只貼上結果的話有可能嗎?!

我找到方法了……
  1.     Workbooks(KPI).Sheets("Sheet2").Range(W).Copy
  2.     Workbooks(con).Sheets("暫存頁").Range("A1").PasteSpecial Paste:=xlPasteValues
複製代碼
原來,它可以是二段分開來寫的語法……看來我還得多學習一下……
作者: GBKEE    時間: 2011-7-26 13:35

回復 11# play9091
多多利用錄製巨集,會進步的.
作者: play9091    時間: 2011-7-26 13:44

回復 12# GBKEE

我強迫我自已,非到不得以不用錄制的,錄制的會錄一大堆用不到的東西。
大部分忘記的語法,就上網查,不記得的東西就查書!!!




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