Board logo

標題: [發問] 想要將大量資料依照段落擷取資料 [打印本頁]

作者: a703130    時間: 2012-6-28 18:58     標題: 想要將大量資料依照段落擷取資料

[attach]11522[/attach]

如附件,想請問一下各位前輩

附件三個column,總共會有四個大段落的資料,中間空白是不一定的
第一個column是分段落用的
第二個column是用來找尋資料的依據
第三個column是需要擷取的資料

因為我的第二個column都會從最高一直到最低
但是最高跟最低不一定,有可能是100~99(高)到15~14(低)
而中間區段我想要區分90、80、70~20,這樣區分下來會有10段

整理出來的結果會像旁邊的數據一樣
請問我要如何搜尋第二個column來分10段抓取資料

我初步是認為應該是要用 xlToDown(找最高跟最低點) 跟find(其他8個點) 這兩個函數來做這件事情
不過執行起來有點困難,因為我還不太會活用
所以到這邊請教各位前輩,也請各位前輩不吝指教
謝謝

作者: Hsieh    時間: 2012-6-28 20:13

回復 1# a703130
  1. Sub nn()
  2. Dim Rng As Range, ay(10, 3)
  3. Set Rng = Range([B2], Cells(Rows.Count, 3).End(xlUp)).SpecialCells(xlCellTypeConstants)
  4. r = 3
  5. For i = 1 To Rng.Areas.Count Step 2
  6.    ar = Union(Rng.Areas(i), Rng.Areas(i + 1))
  7.    k = Application.Max(Application.Index(ar, , 1))
  8.    m = Application.Min(Application.Index(ar, , 1))
  9.    a = Array(k, 90, 80, 70, 60, 50, 40, 30, 20, m)
  10.    n = Rng.Areas(i).Cells(1, 1).Offset(, -1)
  11.    n1 = Rng.Areas(i + 1).Cells(1, 1).Offset(, -1)
  12.    For j = 0 To 9
  13.       s = Application.VLookup(a(j), Rng.Areas(i), 2, 0)
  14.       s1 = Application.VLookup(a(j), Rng.Areas(i + 1), 2, 0)
  15.       ay(j, 0) = s
  16.       ay(j, 1) = s1
  17.       ay(j, 2) = a(j)
  18.    Next
  19.    Cells(r, 8).Resize(10, 3) = ay
  20.    r = r + 12
  21.    Erase ay
  22. Next
  23. End Su
複製代碼

作者: a703130    時間: 2012-6-29 10:00

回復 2# Hsieh

請問一下H大
一開始先range 出四段,但是我不懂
  1. For i = 1 To Rng.Areas.Count Step 2
複製代碼
這段的意思是什麼,是以1、3,2、4各為一個大項來執行嗎??

另外我在執行時有遇到個問題
就是巨集實際抓出來的最大最小值有部分卻是錯的
我不知道為什麼?我檢查了ar 陣列裡面的值都是對的,能請H大幫忙確認嗎??

是否是因為直接+1檢查下一段,結果檢查的欄位大小是一樣的,所以便抓到前一段相同位置的最大最小值??
如果直接將它分成獨立的四段來做是否就沒有此問題

[attach]11528[/attach]

作者: Hsieh    時間: 2012-6-29 14:40

回復 3# a703130
這樣就不懂你抓的是第一個位置的值還是最後位置的值了
以B欄最小值15而言
第一區第一位置對應3239.923,最後位置是3294.462
第二區第一位置對應3510.846,最後位置是3502.923
你都是抓最後位置的值
但是其餘各個級距都是抓第一個位置
請說明你的準則
作者: a703130    時間: 2012-7-2 13:56

回復 4# Hsieh

我了解您的意思了

確實是我抓資料的準則有誤

應該是要像你一樣抓取每個級距的第一個值

謝謝H 大指導




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