返回列表 上一主題 發帖

[發問] 請問如何使用VBA計算方陣

[發問] 請問如何使用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縮短時間
方陣.rar (8.64 KB)

本帖最後由 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
複製代碼

TOP

回復 2# lpk187
謝謝lpk187大的回答,有幾個地方想在請問一下
這裡為甚麼需要用一個k?為什麼k需要先設為11?

TOP

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

回復 3# linlin00

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

以此例題,其實有很多方式可以做,但我選擇最基礎的一種方式,讓你容易理解,這方式如果資料很多的時候,其實速度會有些慢的!

TOP

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

TOP

我的資料多的時候多半會超過1000筆,請問有辦法讓這個程式執行得更快嗎?

TOP

回復 5# linlin00

更正,K的部分問題已經解決了!

TOP

回復 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
複製代碼

TOP

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

TOP

回復 2# lpk187

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

TOP

        靜思自在 : 【時間如鑽石】時間對一個有智慧的人而言,就如鑽石般珍貴;但對愚人來說,卻像是一把泥土,一點價值也沒有。
返回列表 上一主題