根据行索引转换 Excel 列表

Converting an Excel list according to row indexes

我正在尝试按如下方式转换 Excel VBA 中的列表:

我原来的清单在灰色的那个。它显示了一个序列。 我想根据每个数字位置生成右边​​的列表。

例如:
3 在左侧列表中是 second 所以 2 在右侧列表中是 third 位置;
6 在左侧列表中 第四 所以 4 在右侧列表中 第六 位置 ...

我尝试在 VBA 中使用 'For' 循环,但它变得有点长和复杂,有没有办法通过在 VBA 中使用数组来实现?

一个公式就可以轻松实现。假设数据在 A1:A8,在 B1 并向下复制:

=MATCH(ROW(),A:A,0)

这会起作用,只需根据需要设置第一个、最后一个和范围。

Private Sub cbSort_Click()

Dim wArray As Variant, dArray As Variant
Dim first As Integer, last As Integer
Dim i As Integer, j As Integer

first = 1
last = 8

Set wArray = Range("A" & first & ":A" & last)
ReDim dArray(1 To last - first + 1, 1 To 1)

j = 1
For i = first To last
  dArray(wArray(i, 1), 1) = j
  j = j + 1
Next i

Range("B" & first & ":B" & last) = dArray

End Sub
Option Explicit

Sub Main()
    Dim source As Range
    On Error GoTo ErrTransformIt
    Set source = Application.InputBox(prompt:="Source", Type:=8)
    TransformIt source
    Exit Sub
ErrTransformIt:
    MsgBox Err.Description
End Sub

Private Sub TransformIt(ByVal source As Range)
    Dim target As Range
    Dim c As Range
    Dim i As Integer
    Dim firstRow As Long

    firstRow = source(1).Row
    i = 1

    For Each c In source.Cells
        Set target = ActiveSheet.Cells(firstRow + c.Value - 1, c.Column + 1)
        If target.Value <> "" Then
            MsgBox "Target is already used by [" & target.Value & "]", vbExclamation
            Exit Sub
        End If
        target.Value = i
        i = i + 1
    Next c
End Sub