Board logo

標題: [發問] 請問如何使用VBA計算方陣 [打印本頁]

作者: linlin00    時間: 2015-7-28 18:04     標題: 請問如何使用VBA計算方陣

我想請問有一個例題,已經將兩兩的中心求出,
例如:n筆資料(A,B)
第一筆資料(5,5)
第二筆資料(6,6)
先計算得1跟2的中心為(5.5  ,  5.5)
而在矩陣上對照1跟2的計算公式為 (第一筆資料A-(12的A平均))^2+(第二筆資料A-(12的A平均))^2+(第一筆資料B-(12的B平均))^2+(第二筆資料B-(12的B平均))^2
不是很會敘述,不知道這樣有沒有比較清楚
附件內是我用手打的方陣,因為花的時間比較長,想請問能否用VBA縮短時間
[attach]21548[/attach]
作者: lpk187    時間: 2015-7-28 20:40

本帖最後由 lpk187 於 2015-7-28 20:43 編輯

回復 1# linlin00

我利用上次的程式來完成它!
也就是原來的A、B、C 3欄的原有資料來完成
  1. Public Sub Ex()
  2. s = 2
  3. k = 11
  4. For i = 2 To 6
  5.     X = i + 1
  6.     For j = X To 7
  7.         Cells(s, "F") = Cells(i, 1) & "," & Cells(j, 1)
  8.         Cells(s, "G") = (Cells(i, 2) + Cells(j, 2)) / 2
  9.         Cells(s, "H") = (Cells(i, 3) + Cells(j, 3)) / 2
  10.         Cells(j, k) = (Cells(i, 2) - Cells(s, "G")) ^ 2 _
  11.                          + (Cells(j, 2) - Cells(s, "G")) ^ 2 _
  12.                          + (Cells(i, 3) - Cells(s, "h")) ^ 2 _
  13.                          + (Cells(j, 3) - Cells(s, "h")) ^ 2
  14.         s = s + 1
  15.     Next
  16.     k = k + 1
  17. Next
  18. End Sub
複製代碼

作者: linlin00    時間: 2015-7-28 23:16

回復 2# lpk187
謝謝lpk187大的回答,有幾個地方想在請問一下
這裡為甚麼需要用一個k?為什麼k需要先設為11?
作者: lpk187    時間: 2015-7-29 01:08

本帖最後由 lpk187 於 2015-7-29 01:18 編輯

回復 3# linlin00

K值為什麼要11如下圖
K值為Column數,從K欄開始計數所以為11,L欄為12,依此類推!
    [attach]21555[/attach]

以此例題,其實有很多方式可以做,但我選擇最基礎的一種方式,讓你容易理解,這方式如果資料很多的時候,其實速度會有些慢的!
作者: linlin00    時間: 2015-7-29 09:56

回復 4# lpk187
很容易明白的解釋,非常感謝!!
再請教一下,我輸入後K的位置會發生編譯錯誤,這個問題該如何排除?
作者: linlin00    時間: 2015-7-29 10:15

我的資料多的時候多半會超過1000筆,請問有辦法讓這個程式執行得更快嗎?
作者: linlin00    時間: 2015-7-29 10:19

回復 5# linlin00

更正,K的部分問題已經解決了!
作者: lpk187    時間: 2015-7-29 12:43

回復 6# linlin00

不知是不是你想要的
其實只是把它以陣列的方式去跑(陣列比在儲存格跑快很多)
  1. Public Sub Ex1()
  2. Dim ar1(), ar2()
  3. n = 1
  4. arr = Range("a2:c" & Cells(Rows.Count, 1).End(xlUp).Row) '當ABC三欄往下增加資料時會自動讀取位置
  5. ReDim ar2(1 To UBound(arr) + 1, 1 To UBound(arr) + 1)
  6. ar2(1, 2) = 1
  7. For i = 1 To UBound(arr) - 1
  8.     ar2(1, i + 2) = i + 1
  9.     X = i + 1
  10.     For j = X To UBound(arr)
  11.         ReDim Preserve ar1(1 To 3, 1 To n)
  12.         ar1(1, n) = arr(i, 1) & "," & arr(j, 1)
  13.         ar1(2, n) = (arr(i, 2) + arr(j, 2)) / 2
  14.         ar1(3, n) = (arr(i, 3) + arr(j, 3)) / 2
  15.         ar2(j, 1) = j - 1
  16.         ar2(j + 1, i + 1) = (arr(i, 2) - ar1(2, n)) ^ 2 _
  17.                       + (arr(j, 2) - ar1(2, n)) ^ 2 _
  18.                       + (arr(i, 3) - ar1(3, n)) ^ 2 _
  19.                       + (arr(j, 3) - ar1(3, n)) ^ 2
  20.         n = n + 1
  21.     Next
  22. Next
  23. ar2(j, 1) = i
  24. Range("F2").Resize(UBound(ar1, 2), UBound(ar1, 1)) = Application.Transpose(ar1)
  25. Range("J1").Resize(UBound(ar2, 2), UBound(ar2, 1)) = ar2
  26. End Sub
複製代碼

作者: linlin00    時間: 2015-7-29 14:23

回復 8# lpk187
謝謝,這個速度變很快,而且也能得到我想要的結果,不過多了好多我不懂的東西還需要花點時間吸收.....
作者: linlin00    時間: 2015-7-29 23:10

回復 2# lpk187

我目前使用這一個來操作,想請問如果要找方陣範圍內的最小值並回傳是哪兩個的組合,有辦法做到嗎?
下一步想要將這一個最小值的兩組做結合,接著算新的一個方陣
作者: lpk187    時間: 2015-7-29 23:25

回復 10# linlin00


   不好意思!不是很懂你的意思。我對算數方面不是很熟!如果有公式或結果,倒可以試一下!
作者: linlin00    時間: 2015-7-29 23:57

回復 11# lpk187
好的,我先整理一下我手算的部分
作者: linlin00    時間: 2015-7-30 00:57

[attach]21566[/attach]回復 11# lpk187
前面跟原本都相同以編號1跟2舉例,計算得到在這個方陣範圍中最小的是1,想要傳回這個1是(1,2)以及(3,4)的組合
之後是以前面得到的結果合併(1,2),計算一張新的方陣
如附件工作表二內,先將(1,2)合起來後,計算(1,2),3就變成
(編號1.2.3分別-(1,2,3)的平均數)^2的總和
不知道這樣有沒有比較清楚
作者: lpk187    時間: 2015-7-30 15:19

回復 13# linlin00

不好意思!還是不懂!可能要請其他大大出手相助了
作者: linlin00    時間: 2015-7-31 20:33

回復 14# lpk187
好的,沒關係,非常感謝!!




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