我在一個陣列中有 2 個嵌套回圈,但據我所知,我需要第三個,但我無法實作。
我有以下資料(黃色):

當前代碼按照實際行為列中的指示進行計算:
Dim arr, outarr as Variant
Dim lastc, lastr as long
lastc = 2
lastr = Cells(ws.Rows.count, lastc).End(xlUp).Row
arr = Range(Cells(2, lastc), Cells(lastr, lastc))
cnt = ((UBound(arr, 1) - 1) * UBound(arr, 1)) / 2
k = 1
ReDim outarr(1 To cnt, 1 To 1)
For i = LBound(arr, 1) 1 To UBound(arr, 1)
For j = LBound(arr, 1) To i - 1
outarr(k, 1) = arr(j, 1) - arr(i, 1)
k = k 1
Next j
Next i
期望的行為是將 1.1 到 6.1 的值存盤在該范圍內的最小值作為結果。10 - 0 = 10 但我需要該范圍內的實際最小值(1.6 到 6.6),最小值為 10 - 40 = -30。
最小值始終計算為范圍的第一個值 - 范圍的 X 值,這一點非常重要。給定回圈中的第一個值是一個常數。
我相信需要第三個回圈來存盤最小值,然后將此值插入到 outarr 但我還沒有成功。
感謝您的幫助。
uj5u.com熱心網友回復:
我相信這會輸出所需的結果。
我沒有在混合中添加第三個嵌套回圈,而是在第一級中添加了一個額外的輔助回圈。
請注意: 這應該讓您很好地了解如何以比另一層For Next回圈更低的復雜性來解決這個問題,但是由于定位,性能會隨著迭代的增長而下降。
我已將一些變數重命名為更具描述性(除非x因為我太懶了)。
解釋在代碼下面,這里是重新設計的回圈部分。
OutputCounter = 1
For LayerOneStep = LBound(ValueArray, 1) To UBound(ValueArray, 1)
ReDim TempArray(1 To LayerOneStep)
For x = 1 To UBound(TempArray)
TempArray(x) = ValueArray(x, 1)
Next x
For LayerTwoStep = LBound(ValueArray, 1) To LayerOneStep - 1
MaxValue = WorksheetFunction.Max(TempArray)
TempValue = (ValueArray(LayerOneStep, 1) - ValueArray(LayerTwoStep, 1))
If ValueArray(LayerOneStep, 1) = 0 Or ValueArray(LayerTwoStep, 1) = 0 Then
OutputArray(OutputCounter) = TempValue
OutputCounter = OutputCounter 1
ElseIf TempValue < ValueArray(LayerOneStep, 1) - MaxValue Then
OutputArray(OutputCounter) = TempValue
OutputCounter = OutputCounter 1
Else
OutputArray(OutputCounter) = ValueArray(LayerOneStep, 1) - MaxValue
OutputCounter = OutputCounter 1
End If
Next LayerTwoStep
Next LayerOneStep
TempArray()用于存盤您的分組值。即B3 & B2或B5 & B4 & B3 & B2等。這是通過將 B 列第 2 行的值分配給LayerOne 計數器最多行的任何值來實作的。這些值是從現有ValueArray陣列分配的,而不是每次都再次訪問作業表。- 以這種方式分配它允許我們使用該
WorksheetFunction.Max()函式找到集合中的最大數。(請記住,如上所述,不是最基于性能的方式) - 然后我們使用一些變數來分配一些計算。在
MaxValue上文和TempValue作為XY方法-相同的結果作為作業表公式。 - 然后我們使用一些
If...Then...Else邏輯開始根據計算范圍計算出絕對最小值。 - 第一個
If條件是檢查作為TempValue計算一部分的任一值是否為零 (0)。如果是,它會回傳一些奇怪的結果,這樣可以確保我們將 x - 0 或 0 - y 結果用于OutputArray. - 其次是檢查
TempValue計算結果是否小于 x -MaxValue。如果是,則回傳TempValue到OutputArray. - 否則,我們將 x - 回傳
MaxValue到OutputArray.
上述代碼的結果;

uj5u.com熱心網友回復:
我沒有進行另一個回圈,而是記錄每個回圈中的最低值,并與內部回圈中的新值進行比較:
Option Explicit
Private Sub Test()
Const startRow As Long = 2
Const valueCol As Long = 2
Const outputCol As Long = 4
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, valueCol).End(xlUp).Row
Dim inputArr As Variant
inputArr = ws.Range(ws.Cells(startRow, valueCol), ws.Cells(lastRow, valueCol)).Value
Dim outputSize As Long
outputSize = ((UBound(inputArr, 1) - 1) * UBound(inputArr, 1)) / 2
Dim outputIndex As Long
Dim outputArr As Variant
ReDim outputArr(1 To outputSize, 1 To 1) As Variant
Dim i As Long
Dim n As Long
Dim currFirst As Long
Dim currLowest As Long
For i = 2 To UBound(inputArr, 1)
currFirst = inputArr(i, 1)
currLowest = currFirst - inputArr(i - 1, 1)
For n = i - 1 To 1 Step -1
Dim testLowest As Long
testLowest = currFirst - inputArr(n, 1)
If testLowest < currLowest Then currLowest = testLowest
outputIndex = outputIndex 1
outputArr(outputIndex, 1) = currLowest
Next n
Next i
ws.Cells(startRow, outputCol).Resize(UBound(outputArr, 1)).Value = outputArr
End Sub

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/372351.html
上一篇:VBA:有兩組用戶輸入。需要檢查是否有任何連續的*對*輸入在兩組之間復制,我該怎么做?
下一篇:從兩個陣列創建直方圖
