簡體   English   中英

水平和垂直搜索表格並打印值

[英]Searching a table both horizontally and vertically and printing the values

抱歉,標題含糊。 我不太確定該如何命名。 我的工作表中的數據如下所示: 在此處輸入圖片說明

我想搜索范圍內的最小數字,並在y軸上寫出名稱和數字。 然后,它將忽略此數字,並在x軸上也搜索最小的數字。 在同一行中,它水平搜索最小值,排除該數字,然后垂直查找。 它以這種方式繼續進行,直到用盡所有可能性。 Excel可以嗎? 示例輸出為:

y5 : 40
x3: 60
y3: 90
x4: 80
y2 : 85
x3: 75
y1 : 70

等等。

有趣的問題。 您應該能夠修改以下內容。 要運行它,您需要包括對Microsoft Scripting Runtime的引用(在VBA編輯器中的“ Tools/References下),因為它使用字典數據結構-跟蹤已選擇的數字的自然選擇:

'The following code assumes than Nums is a 1-based 2-dimensional array

Function MinPath(Nums As Variant) As Variant
    Dim counter As Long
    Dim mins As Variant
    Dim PickedNums As New Dictionary
    Dim i As Long, j As Long, m As Long, n As Long
    Dim report As String
    Dim direction As String
    Dim num As Variant
    Dim min As Variant, min_i As Long, min_j As Long
    m = UBound(Nums, 1)
    n = UBound(Nums, 2)

    ReDim mins(1 To m * n)

    min = Nums(1, 1)
    min_i = 1
    min_j = 1
    For i = 1 To m
        For j = 1 To n
            If Nums(i, j) < min Then
                min = Nums(i, j)
                min_i = i
                min_j = j
            End If
        Next j
    Next i

    PickedNums.Add min, 0
    counter = 1
    mins(counter) = Array(min_i, min_j, min)
    direction = "vertical"
    min = Empty

    Do While True
        If direction = "vertical" Then
            For i = 1 To m
                num = Nums(i, min_j)
                If Not PickedNums.Exists(num) Then
                    If IsEmpty(min) Then
                        min = num
                        min_i = i
                    ElseIf num < min Then
                        min = num
                        min_i = i
                    End If
                End If
            Next i

            If IsEmpty(min) Then
                ReDim Preserve mins(1 To counter)
                MinPath = mins
                Exit Function
            Else
                PickedNums.Add min, 0
                counter = counter + 1
                mins(counter) = Array(min_i, min_j, min)
                direction = "horizontal"
            End If
        Else
            'direction = horizontal case
            For j = 1 To n
                num = Nums(min_i, j)
                If Not PickedNums.Exists(num) Then
                    If IsEmpty(min) Then
                        min = num
                        min_j = j
                    ElseIf num < min Then
                        min = num
                        min_j = j
                    End If
                End If
            Next j

            If IsEmpty(min) Then
                ReDim Preserve mins(1 To counter)
                MinPath = mins
                Exit Function
            Else
                PickedNums.Add min, 0
                counter = counter + 1
                mins(counter) = Array(min_i, min_j, min)
                direction = "vertical"
            End If
        End If
    min = Empty
    Loop
End Function

該函數反復搜索行或列(取決於搜索方向)以找到最小的未選取數字。 在每次通過的開始,變量min設置為Empty直到遇到未選取的數字。 如果在通過min之后仍然為Empty則函數返回。 此函數返回一個數組數組,其中每個數組的格式為Array(i,j,min) (例如,第一步中的值(5,3,40))。 VBA的Array函數返回一個基於0的數組,因此i (行)坐標位於索引0處,而j坐標位於索引1處。 例如:

Sub test()
    Dim i As Long, n As Long
    Dim mins As Variant

    mins = MinPath(Range("B2:F6").Value)
    n = UBound(mins)
    For i = 1 To n
        If i Mod 2 = 1 Then 'odd step
            Range("A7").Offset(i).Value = "y" & mins(i)(0) & ":"
        Else 'even step
            Range("A7").Offset(i).Value = "x" & mins(i)(1) & ":"
        End If
        Range("B7").Offset(i).Value = mins(i)(2)
    Next i
End Sub

結果是:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM