Board logo

標題: [發問] 為何使用index陣列跑11000筆A-G的資料須要四分鐘呢? [打印本頁]

作者: dechiuan999    時間: 2011-2-6 16:01     標題: 為何使用index陣列跑11000筆A-G的資料須要四分鐘呢?

各位大大新年好:

    小弟有一資料表,總列數為10989筆。
現想將從A-G的每一列資料合併至H位置。
現使用陣列方式來逹成卻須發費約四分鐘
左右才能逹成。
    請問是否小弟引用的INDEX方式不適當
,還是另有更適當的方式可逹成嗎?

下列語法如下:
Sub pp()
   
    Dim mSht As Worksheet
    Dim mArr()
    Dim s%, m%, r%
    Dim mRng
   
    Set mSht = Worksheets("Test")
    With mSht
        mRng = .Range("a1:g10989")
        r = UBound(mRng, 1)        
        For s = 1 To r            
            ReDim Preserve mArr(m)
            mArr(m) = Trim(Join(Application.WorksheetFunction.Index(mRng, s)))
            m = m + 1            
        Next        
        mArr = Application.Transpose(mArr)                       
       .Range("h1").Resize(m) = mArr
       .Range("h1") = "合併簽審"
        
    End With
End Sub

感恩大大!
作者: oobird    時間: 2011-2-6 20:47

改這樣會快得多
Sub pp()
   
    Dim mSht As Worksheet
    Dim d As Object, arr
    Dim s%, m%, r%
    Dim mRng
    Set d = CreateObject("Scripting.Dictionary")
    Set mSht = Worksheets("Test")
    With mSht
        mRng = .Range("a1:g10988")
        r = UBound(mRng, 1)
        
        For s = 1 To r
arr = Array(mRng(s, 1), mRng(s, 2), mRng(s, 3), mRng(s, 4), mRng(s, 5), mRng(s, 6), mRng(s, 7))
MyCom = Join(arr)
d(s) = MyCom
           
        Next
       .Range("h1").Resize(r) = Application.Transpose(d.items)
       .Range("h1") = "合併簽審"
        
    End With
End Sub
作者: dechiuan999    時間: 2011-2-6 21:16

oobird版主大大新年好:

        小弟改用版主大大提供的語法,
可說是超快速的,簡直無法讓人想象。
更令小弟驚呀的是大大引用dictionary
是如此的神奇。
For s = 1 To r
            arr = Array(mRng(s, 1), mRng(s, 2), mRng(s, 3), mRng(s, 4), mRng(s, 5), mRng(s, 6), mRng(s, 7))
            MyCom = Trim(Join(arr))
            d(s) = MyCom           
        Next

為何二者之差異性會是如此之大呢?

感恩大大!
作者: GBKEE    時間: 2011-2-7 14:45

回復 1# dechiuan999
你的程式因 ReDim Preserve mArr(m) 這一行 而延遲了,即然知道範圍就直接給陣列的大小

  1. Sub Ex()
  2.     Dim Rng As Range, AR()
  3.     With Sheets("Test")
  4.         Set Rng = .Range("a1:g10989")
  5.         ReDim AR(2 To Rng.Rows.Count)
  6.         For I = 2 To Rng.Rows.Count
  7.             AR(I) = Trim(Join(Application.Transpose(Application.Transpose(Rng.Rows(I)))))
  8.         Next
  9.         .Range("h1") = "合併簽審"
  10.         .[H2].Resize(UBound(AR) - 1, 1) = Application.Transpose(AR)
  11.     End With
  12. End Sub
複製代碼

作者: dechiuan999    時間: 2011-2-7 16:06

謝謝二位版主大大。

GBKEE版主大大使用此語法
也讓小弟受益良多。

年頭一開始就收二位大大如此珍貴作品,
真是一個大豐收的一年。

感恩大大!

祝各位大大新春愉快!




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