excel 如何通过交叉方式复制数据?

xpszyzbs  于 2022-12-01  发布在  其他
关注(0)|答案(2)|浏览(415)

我需要在一个交叉点上复制值,如下图所示:
我将数据排列为两行(有值),然后一个空行等等。
我尝试了下面的代码,但是输出结果不正确。
提前感谢你的帮助。

Sub Copy_by_crossing()
 
  Dim ws As Worksheet, lastRow As Long, i As Long
 
  Set ws = ThisWorkbook.ActiveSheet
  lastRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
 
  For i = 2 To lastRow
 
    If ws.Range("E" & i + 1).Value = "" Then
       ws.Range("E" & i + 1).Resize(, 4).Value = ws.Range("A" & i, "D" & i).Value
    End If
 
   Next i
 
End Sub

sbdsn5lh

sbdsn5lh1#

这似乎行得通:

Option Explicit
Sub Copy_By_Crossing()
    Dim WS As Worksheet, rSrc As Range, rRes As Range
    Dim vSrc, vRes
    Dim I As Long, J As Long
    

'work in VBA arrays for faster execution times
    
Set WS = ThisWorkbook.Worksheets("Sheet1")
With WS
    Set rSrc = Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(columnsize:=4)
    vSrc = rSrc
    Set rRes = rSrc.Offset(0, UBound(vSrc, 2))
    ReDim vRes(1 To UBound(vSrc, 1), 1 To UBound(vSrc, 2))
End With

'create results array
'headers
For J = 1 To UBound(vSrc, 2)
    vRes(1, J) = vSrc(1, J)
Next J

'Reverse each pair of data
For I = 2 To UBound(vSrc, 1) Step 3
    For J = 1 To UBound(vSrc, 2)
        vRes(I + 1, J) = vSrc(I, J)
        vRes(I, J) = vSrc(I + 1, J)
    Next J
Next I
        
'Write back to the worksheet
With rRes
    .EntireColumn.Clear
    .Value = vRes
    .Style = "Output" 'This line may not work with non-english versions
    .EntireColumn.AutoFit
End With

End Sub

juud5qan

juud5qan2#

如果您放弃了 MS 365 的较新动态功能(尤其是关于LET函数),您可以在单元格E2中尝试以下公式替代,从而产生溢出范围。
该公式本身定义了1、2或0索引,并通过CHOOSE将不同的表区域分配给这些索引。

=LET(data,A2:A103,rep,3,cols,4,idx,IF(data & "" <>"",MOD(ROW(data)-1,rep),rep),CHOOSE(idx,OFFSET(data,1,,,cols),OFFSET(data,-1,,,cols),""))

LET函数允许在函数的参数中为部分计算结果赋值,从而避免嵌套函数具有冗余计算。
为了更好地理解此处的内容,请使用换行符:

=LET(
    data,A2:A103,
    rep,3,
    cols,4,
    idx,IF(data & "" <>"",MOD(ROW(data)-1,rep),rep),
    CHOOSE(idx,OFFSET(data,1,,,cols),OFFSET(data,-1,,,cols),"")
    )
  • 附注 *:还可以尝试使用部分尚未处理的函数ChooseColsChooseRows,通过额外应用于每个双行的=CHOOSECOLS(CHOOSEROWS(A2:A3,{2,1}),{2,3,4})对给定范围进行切片和重新排列,例如显示class、date和hr列2、3和4。

相关问题