Board logo

標題: Array 陣列應用 [打印本頁]

作者: hugh0620    時間: 2010-12-8 16:59     標題: Array 陣列應用

本帖最後由 hugh0620 於 2010-12-8 17:22 編輯

Dear 大大

     小弟對於陣列的應用方式不熟悉,所以,有些地方可以使用到陣列簡化程式碼的撰寫,卻寫了一堆程式碼,
       雖可以答達目的,還是請教大大如何使用array(陣列)來解決問題,也可以讓小弟吸收一下

    附件是我工作上的一個舉例
    1. Customer 資料有兩筆       (大約需放大至100筆)
    2. 狀態 資料有三筆
    3. AB欄是我展開後所需要的結果
   
    請大大們指導一下

    [attach]3995[/attach]
作者: hugh0620    時間: 2010-12-8 17:13

本帖最後由 hugh0620 於 2010-12-8 17:22 編輯

回復 1# hugh0620


   大大們

   後來我看到一些大大以前寫的方式,幫忙看一下有沒有需要改進的  (若是陣列中的資料有幾十筆時,有否更好的方式呢?????)
    N = 0
     I = 0
     Do Until Sheet1.Cells(3 + I, 4) = ""
           For Each R In Array("F", "O", "P")
               Sheet1.Cells(3 + N, 1) = R
               Sheet1.Cells(3 + N, 2) = Sheet1.Cells(3 + I, 4)
               N = N + 1
           Next
         I = I + 1
     Loop
作者: oobird    時間: 2010-12-8 20:05

這個不是解決過了嗎?怎麼又來一次?
作者: hugh0620    時間: 2010-12-9 09:32

回復 3# oobird


    大大 這是我第一次發       我在發之前有現找尋過後
            沒有查到相關的資料   我才發帖
        請勿誤會
作者: oobird    時間: 2010-12-9 09:39

那麼應該是你傳錯文件了。
你的文件中並沒有你說的
1. Customer 資料有兩筆       (大約需放大至100筆)
    2. 狀態 資料有三筆
    3. AB欄是我展開後所需要的結果
作者: hugh0620    時間: 2010-12-9 09:43

回復 5# oobird


    抱歉唷~ 是我傳錯檔~ 讓大大誤會了~
    重傳一次
    [attach]4004[/attach]
作者: oobird    時間: 2010-12-9 10:05

陣列的意義在於把資料存取置於記憶體中運算,運算完後再一次寫入工作表上,主要是縮短操作時間,程式碼不一定能精簡。
你的須求可以這樣:
  1. Private Sub CommandButton1_Click()
  2. Dim a, b, arr(), i%, j%, m%
  3. a = [e3:e5]
  4. b = [d3:d4]
  5. For i = 1 To UBound(b)
  6. For j = 1 To UBound(a)
  7. m = m + 1
  8. ReDim Preserve arr(1 To 2, 1 To m)
  9. arr(1, m) = a(j, 1)
  10. arr(2, m) = b(i, 1)
  11. Next j, i
  12. [a3].Resize(m, 2) = Application.Transpose(arr)
  13. End Sub
複製代碼

作者: hugh0620    時間: 2010-12-9 10:39

回復 7# oobird


    謝謝大大的說明~

   另請教一個問題,若我資料是浮動的 (如customer 是未知筆數,狀態還是固定三種時)
        這樣大大程式碼跑起來就無法達到需求,這樣的問題該如何解決呢???
作者: oobird    時間: 2010-12-9 10:54

03.a = [e3:e5]

04.b = [d3:d4]
改這兩行
a=range([e3],[e3].end(4))
b=range([d3],[d3].end(4))
作者: hugh0620    時間: 2010-12-9 11:07

本帖最後由 hugh0620 於 2010-12-9 11:15 編輯

回復 9# oobird

       真的很感謝大大~ 真的是厲害~   
       最後再請教大大語法的意思
       1. Dim a, b, arr(), i%, j%, m%                   i%的意思是什麼呢? (我沒用過這樣的寫法,請大大教導一下)
           a = [e3:e5]
           b = [d3:d4]
          For i = 1 To UBound(b)
                    For j = 1 To UBound(a)
                    m = m + 1
       2.            ReDim Preserve arr(1 To 2, 1 To m)           ReDim 與 Preserve 的意思與用法??
                             arr(1, m) = a(j, 1)
                             arr(2, m) = b(i, 1)
           Next j, i
          [a3].Resize(m, 2) = Application.Transpose(arr)
作者: GBKEE    時間: 2010-12-9 12:01

回復 10# hugh0620
Dim i As Integer
Integer 的型態宣告字元是百分比符號(%)。
Preserve 選擇性引數。當改變原有陣列最後一維的大小時,仍然保有原來的資料的關鍵字。
作者: oobird    時間: 2010-12-9 13:30

dim i% = dim i as integer
把游標定在redim上按f1,看說明。
要學vba首先學如何看說明。
作者: hugh0620    時間: 2010-12-9 18:40

回復 12# oobird


    大大~ 我都有先使用F1看說明~ 可是....公司的電腦~ 在OFFICE的說明~ 無法跳出
         所以~ 才先請教大大們

         [attach]4019[/attach]
作者: oobird    時間: 2010-12-9 19:11

ReDim Preserve arr(1 To 2, 1 To m)
在迴圈內重新宣告陣列的大小。
假設不能預知程式運行的結果須要的陣列大小(雖然可以先算出來,但用動態陣列就不用)
每一次的迴圈m=m+1,所以這個陣列是不斷的長大的,必須要注意陣列只能改變最後一維的大小,這裡就是指第二維。所以最後要把這個陣列轉置寫入工作表中。
作者: hugh0620    時間: 2010-12-10 12:31

回復 14# oobird


    謝謝大大詳細的說明




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