Excel 用“两个”转换矩阵;“是”;将列添加到列表中

Excel 用“两个”转换矩阵;“是”;将列添加到列表中,excel,vba,Excel,Vba,我试图清理一个脚本,该脚本将一个包含两个“Y”列的矩阵转换为一个列表 之前 在之后 子转换表() 变暗Rng As范围 暗cRng As范围 暗rRng As范围 暗xOutRng As范围 xTitleId=“ConvertTable” 设置cRng=Application.InputBox(“选择列标签”,xTitleId,类型:=8) 设置rRng=Application.InputBox(“选择行标签”,xTitleId,类型:=8) 设置Rng=Application.InputB

我试图清理一个脚本,该脚本将一个包含两个“Y”列的矩阵转换为一个列表

之前


之后

子转换表()
变暗Rng As范围
暗cRng As范围
暗rRng As范围
暗xOutRng As范围
xTitleId=“ConvertTable”
设置cRng=Application.InputBox(“选择列标签”,xTitleId,类型:=8)
设置rRng=Application.InputBox(“选择行标签”,xTitleId,类型:=8)
设置Rng=Application.InputBox(“选择您的数据”,xTitleId,类型:=8)
Set-outRng=Application.InputBox(“输出到(单个单元格):”,xTitleId,类型:=8)
设置xWs=Rng.工作表
k=1
xColumns=rRng.Column
xRow=cRng.Row
对于i=Rng.Rows(1)。行到Rng.Rows(1)。行+Rng.Rows.Count-1
对于j=Rng.Columns(1)。列到Rng.Columns(1)。列+Rng.Columns.Count-1
输出单元(k,1)=xWs单元(i,x列)
外部单元(k,2)=外部单元(x行,j)
外部单元(k,3)=外部单元(i,j)
k=k+1
下一个j
接下来我
端接头
它只输出A列数据(A、C、E)。我需要添加一种方式,将B2降低到H3。我当前的代码忽略了所有的B列

使用范围更新代码

Sub-ConvertTablewRef()
变暗Rng As范围
暗cRng As范围
暗rRng As范围
暗xOutRng As范围
设置cRng=范围(“A1:F1”)
设置rRng=范围(“A1:B70”)
设置Rng=范围(“C2:F70”)
放线RNG=范围(“H1”)
设置xWs=Rng.工作表
k=1
xColumns=rRng.Column
xRow=cRng.Row
对于i=Rng.Rows(1)。行到Rng.Rows(1)。行+Rng.Rows.Count-1
对于j=Rng.Columns(1)。列到Rng.Columns(1)。列+Rng.Columns.Count-1
输出单元(k,1)=xWs单元(i,x列)
外部单元(k,2)=外部单元(x行,j)
外部单元(k,3)=外部单元(i,j)
k=k+1
下一个j
接下来我
端接头
这是我代码的结果,而不是我想要的。我需要看看上面第二张图片中显示的内容。页眉不需要在那里。

请测试下一个代码。它将接受其他一些带有日期的列,并且应该非常快,使用数组,仅在内存中工作,并立即删除结果数组:

Sub ConvertTable()
 Dim sh As Worksheet, sh2 As Worksheet, lastRow As Long, lastCol As Long
 Dim arr, arrH, arrFin, i As Long, j As Long, L As Long, k As Long

 Set sh = ActiveSheet
 Set sh2 = sh.Next

 lastRow = sh.Range("A" & rows.count).End(xlUp).row
 lastCol = sh.cells(1, Columns.count).End(xlToLeft).Column

 arr = sh.Range("A1", sh.cells(lastRow, lastCol)).Value
 ReDim arrFin(1 To 3, 1 To (UBound(arr) - 1) * (lastCol - 2) * 2 + 1)
 k = 2
 'arrfin headers:
 arrFin(1, 1) = arr(1, 1): arrFin(2, 1) = "Amount": arrFin(3, 1) = "Date"
 'processed data:
 For i = 2 To UBound(arr)
    For j = 3 To UBound(arr, 2)
       For L = 1 To 2
            If k Mod 2 = 0 Then
                arrFin(1, k) = arr(i, 1): arrFin(2, k) = arr(i, j): arrFin(3, k) = arr(1, j): k = k + 1
            Else
                arrFin(1, k) = arr(i, 2): arrFin(2, k) = arr(i, j): arrFin(3, k) = arr(1, j): k = k + 1
            End If
        Next L
    Next j
 Next i
 'drop the arrFin at once:
 sh2.Range("A1").Resize(UBound(arrFin, 2), 3).Value = WorksheetFunction.Transpose(arrFin) 
End Sub

我必须承认,我不理解您的代码,因为您没有解释使用InputBox设置这些范围所做的选择。每行至少有一条注释。作为一个知道你想做什么的单身汉,恐怕很难得到任何帮助。。。对于第一行,除了列标题,或者可以看到的所有范围,很容易获得您尝试显示的内容,但是我无法理解您的代码尝试。我建议您忘记输入框,使用您尝试处理的精确范围。如果需要帮助,您可以在以后的阶段使用它们。我们是否应该了解B和C在每个日期共享相同的值?右侧是否有更多列,或者所有要处理的范围都显示在您的第一张图片中?这些是如图所示的整个范围。第一张图片是“之前”的,第二张是“之后”的。列标签的范围为A1:F1,行标签的范围为A1:B100。数据范围为C2:F100。此代码更适用于具有一个y轴列和一个x轴行的栅格。我正在尝试添加另一个组件,其中A1和B1不是水平的,而是垂直的,并从右侧获取相应的值和日期。@FaneDuru我将您的请求添加到postWow中。非常感谢你,这真是太棒了!当我添加更多的列/行时,它也会工作得很好,这非常完美。@spacej3di:很高兴我能帮上忙!但我建议你们在提出问题时要更加专注,试着把自己放在能够帮助你们的人身上。您的代码以其呈现方式无法被任何人理解。即使出于未知的原因,你希望以这种方式使用它,你也应该调整它,使它对其他人也清晰,与你打算做的事情相关。。。