剪切和粘贴动态数据范围,反复进行操作。

huangapple go评论58阅读模式
英文:

Cut and paste dynamic ranges of data repeatedly

问题

我正在尝试对180万个数据点进行数据分析。

我需要自动化以下操作:

将列B中具有相同序列号的连续行的数据范围切割出来。
然后将其粘贴到之前范围的右侧。

我找到了这个链接:https://stackoverflow.com/questions/65541826/excel-vba-cut-and-paste-range-repeatedly

以下是提供的VBA代码,该代码可以切割和粘贴预定范围的单元格(124x14)。在我的数据中,要切割和粘贴的行数需要根据具有相同序列号的行数而变化。

Sub Cutrange()
    Dim i As Long
    Dim Lrow As Long
    Lrow = Cells(Rows.Count, 1).End(xlUp).Row

    Dim oRange As Range, dRange As Range
    Set oRange = Range(Cells(1, 1), Cells(124, 14))
    Set dRange = Cells(1, 1)

    For i = 1 To Lrow 
        oRange.Offset(124 * i).Cut Destination:=dRange.Offset(, 14 * i)
    Next i
End Sub
英文:

I am trying to sort 1,8 million data points for data analysis.

I need to automate the following:

Cut a range of data in x sequential rows with identical Sequence numbers in column B.
剪切和粘贴动态数据范围,反复进行操作。

Then paste it onto the right next to the previous range.
剪切和粘贴动态数据范围,反复进行操作。

I found https://stackoverflow.com/questions/65541826/excel-vba-cut-and-paste-rage-repeatedly

Sub Cutrange()
    Dim i As Long
    Dim Lrow As Long
    Lrow = Cells(Rows.Count, 1).End(xlUp).Row

    Dim oRange As Range, dRange As Range
    Set oRange = Range(Cells(1, 1), Cells(124, 14))
    Set dRange = Cells(1, 1)

    For i = 1 To Lrow 
        oRange.Offset(124 * i).Cut Destination:=dRange.Offset(, 14 * i)
    Next i
End Sub

This code cuts and pastes a pre-determined range of cells (124x14). In my data, the number of rows (to be cut and pasted) needs to change based on how many rows have the same Sequence number.

答案1

得分: 1

以下是你要翻译的代码部分:

Option Explicit

Sub HStackGroups()

    Const SRC_NAME As String = "Sheet1"
    Const SRC_FIRST_CELL As String = "B2"
    Const DST_NAME As String = "Sheet2"
    Const DST_FIRST_CELL As String = "B2"
    Const UNIQUE_COLUMN As Long = 1
    Const COLUMN_GAP As Long = 1

    Dim wb As Workbook: Set wb = ThisWorkbook ' 包含此代码的工作簿
    Dim sws As Worksheet: Set sws = wb.Sheets(SRC_NAME)
    Dim srg As Range: Set srg = sws.Range(SRC_FIRST_CELL).CurrentRegion
    Dim hData(): hData = srg.Rows(1).Value
    Dim cCount As Long: cCount = srg.Columns.Count
    Dim srCount As Long: srCount = srg.Rows.Count - 1 ' 无标题行
    Dim sData(): sData = srg.Resize(srCount).Offset(1).Value

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")

    Dim sr As Long, drCount As Long, srString As String

    For sr = 1 To srCount
        srString = CStr(sData(sr, UNIQUE_COLUMN))
        If Not dict.Exists(srString) Then
            Set dict(srString) = New Collection
        End If
        dict(srString).Add sr
        If dict(srString).Count > drCount Then drCount = dict(srString).Count
    Next sr

    drCount = drCount + 1 ' 1 用于标题行
    Dim dCount As Long: dCount = cCount + COLUMN_GAP
    Dim dcCount As Long
    dcCount = dict.Count * dCount - COLUMN_GAP

    Dim dData(): ReDim dData(1 To drCount, 1 To dcCount)

    Dim Coll, Item, sc As Long, d As Long, dr As Long, dc As Long

    For Each Coll In dict.Items
        dc = d * dCount
        For sc = 1 To cCount
            dData(1, dc + sc) = hData(1, sc)
        Next sc
        dr = 1
        For Each Item In Coll
            dr = dr + 1
            For sc = 1 To cCount
                dData(dr, dc + sc) = sData(Item, sc)
            Next sc
        Next Item
        d = d + 1
    Next Coll

    Dim dws As Worksheet: Set dws = wb.Sheets(DST_NAME)
    Dim dfCell As Range: Set dfCell = dws.Range(DST_FIRST_CELL)
    Dim drg As Range: Set drg = dfCell.Resize(drCount, dcCount)

    With dfCell
        .Resize(dws.Rows.Count - .Row + 1, dws.Columns.Count - .Column + 1) _
            .Clear
    End With

    drg.Value = dData

    drg.EntireColumn.AutoFit

    MsgBox "分组堆叠完成。", vbInformation

End Sub

希望这对你有所帮助。如果你有任何其他问题,不要犹豫,可以随时提出。

英文:

HStack Groups of Data (VBA)

剪切和粘贴动态数据范围,反复进行操作。

<!-- language: lang-vb -->

Option Explicit
Sub HStackGroups()
Const SRC_NAME As String = &quot;Sheet1&quot;
Const SRC_FIRST_CELL As String = &quot;B2&quot;
Const DST_NAME As String = &quot;Sheet2&quot;
Const DST_FIRST_CELL As String = &quot;B2&quot;
Const UNIQUE_COLUMN As Long = 1
Const COLUMN_GAP As Long = 1
Dim wb As Workbook: Set wb = ThisWorkbook &#39; workbook containing this code
Dim sws As Worksheet: Set sws = wb.Sheets(SRC_NAME)
Dim srg As Range: Set srg = sws.Range(SRC_FIRST_CELL).CurrentRegion
Dim hData(): hData = srg.Rows(1).Value
Dim cCount As Long: cCount = srg.Columns.Count
Dim srCount As Long: srCount = srg.Rows.Count - 1 &#39; no headers
Dim sData(): sData = srg.Resize(srCount).Offset(1).Value
Dim dict As Object: Set dict = CreateObject(&quot;Scripting.Dictionary&quot;)
Dim sr As Long, drCount As Long, srString As String
For sr = 1 To srCount
srString = CStr(sData(sr, UNIQUE_COLUMN))
If Not dict.Exists(srString) Then
Set dict(srString) = New Collection
End If
dict(srString).Add sr
If dict(srString).Count &gt; drCount Then drCount = dict(srString).Count
Next sr
drCount = drCount + 1 &#39; 1 for headers
Dim dCount As Long: dCount = cCount + COLUMN_GAP
Dim dcCount As Long
dcCount = dict.Count * dCount - COLUMN_GAP
Dim dData(): ReDim dData(1 To drCount, 1 To dcCount)
Dim Coll, Item, sc As Long, d As Long, dr As Long, dc As Long
For Each Coll In dict.Items
dc = d * dCount
For sc = 1 To cCount
dData(1, dc + sc) = hData(1, sc)
Next sc
dr = 1
For Each Item In Coll
dr = dr + 1
For sc = 1 To cCount
dData(dr, dc + sc) = sData(Item, sc)
Next sc
Next Item
d = d + 1
Next Coll
Dim dws As Worksheet: Set dws = wb.Sheets(DST_NAME)
Dim dfCell As Range: Set dfCell = dws.Range(DST_FIRST_CELL)
Dim drg As Range: Set drg = dfCell.Resize(drCount, dcCount)
With dfCell
.Resize(dws.Rows.Count - .Row + 1, dws.Columns.Count - .Column + 1) _
.Clear
End With
drg.Value = dData
drg.EntireColumn.AutoFit
MsgBox &quot;Groups hstacked.&quot;, vbInformation
End Sub

huangapple
  • 本文由 发表于 2023年2月9日 02:55:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/75390482.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定