【问题标题】:Excel VBA code that moves large amounts of data from multiple ranges to columns将大量数据从多个范围移动到列的 Excel VBA 代码
【发布时间】:2020-05-27 07:45:22
【问题描述】:

我正在研究鸟类迁徙模式,但在试图找出在 Excel 中移动数据的最佳和最简单的方法时遇到了麻烦。我擅长 excel,但我不擅长宏和 VBA 编码,所以如果我的编码想法看起来完全错误,我提前道歉,并且寻求专家建议没有错。到目前为止,我已经使用数据透视表根据物种数量、位置和日期来缩小鸟类的范围。

之后,我将数据从每个物种的日期中移出,并将它们从一个范围堆叠到一列。

我确实找到了一个有效的 vba 代码(即使输出实际上是从左到右横向移动数据,它仍然是同一件事“移动 B4:P4、B5:P5、B6:P6 等。 ”),但这一次只有一个范围:

Sub main()
Dim i As Long
Dim cell As Range

For Each cell In Range("B4:P13")
    Range("S4").Offset(i).Value = cell.Value
    i = i + 1
Next cell
End Sub

我的问题是有 56 个物种和 3 个位置。所以我需要移动数据 168 次,这很荒谬。在我整理好它们之后,我在三个位置中的每一个位置对每个物种进行了 56 次单因素分析。如果有人能提供帮助,那就太棒了,对科学很有帮助。

我的想法/希望和梦想:

如果我可以在同一个 VBA 代码模块中重复代码并更改每个物种的范围和输出位置的值。所有 3 个位置都具有相同的一般格式和范围位置(加上减去两个额外日期),或者如果我可以将位置设置到另一张表。像这样……

Sub main()
Dim i As Long
Dim cell As Range

For Each cell In Range("B4:P13")
    Range("S4").Offset(i).Value = cell.Value
    i = i + 1
For Each cell In Range("B15:P24")
    Range("U4").Offset(i).Value = cell.Value
    i = i + 1
For Each cell In Range("B26:P35")
    Range("W4").Offset(i).Value = cell.Value
    i = i + 1
For Each cell In Range("B37:P46")
    Range("Y4").Offset(i).Value = cell.Value
    i = i + 1
etc…
Next cell
End Sub

看起来像这样:

或者更喜欢这样:

再次感谢您的帮助和贡献。 :D

【问题讨论】:

  • 如果您已经对数据进行了规范化,则可以使用最适合此类转换的 Power Query
  • 数据透视表的源数据是什么样的?
  • 大概数据量——物种、位置等——都是动态的?
  • @omegastripes 当前数据透视表:imgur.com/a/o0B1F1X
  • @SJR 在所有位置(床单)中,物种都是相同的。每个物种的点数相同(1-10)。在位置 1 中,有 15 个日期,在位置 2 -3 中,有 17 个日期。所以大概物种、位置和点是静态的。并且数据(其中的数字)是动态的。

标签: excel vba pivot-table


【解决方案1】:

乍一看似乎更多。我做了一些假设,如果这些假设不成立,可能需要进行一些调整:

  • 起始工作簿的每个位置只有一张工作表,即工作表的数量等于位置的数量
  • 每张纸上的数据从 B4 开始(以及 A3、A14 等中的物种名称)
  • 每个位置表都有相同数量的物种

为您的实际代码使用更有意义的过程和变量名称。

Sub x()

Dim nSpec As Long, nLoc As Long, i As Long, vSpec(), j As Long, k As Long, wsOut As Worksheet, r As Range

nLoc = Worksheets.Count 'number of locations
Set r = Worksheets(1).Range("A3")
Do Until IsEmpty(r)
    i = i + 1
    ReDim Preserve vSpec(1 To i)
    vSpec(i) = r.Value
    Set r = r.Offset(11)
Loop
nSpec = UBound(vSpec) 'number of species

Set wsOut = Worksheets.Add(after:=Worksheets(Worksheets.Count)) 'add results sheet
wsOut.Name = "Results"

For i = 1 To nLoc 'headings for results sheet
    With Worksheets(i) 'for each location
        For j = 1 To nSpec 'for each species
            wsOut.Cells(1, (j - 1) * (nLoc + 1) + 1).Value = vSpec(j) 'species heading
            wsOut.Cells(2, (j - 1) * (nLoc + 1) + i).Value = .Name 'location heading
            Set r = .Range("B4").Offset((j - 1) * 11).Resize(10) 'assumes B4 is top left cell of data
            Do Until IsEmpty(r(1))
                wsOut.Cells(Rows.Count, (j - 1) * (nLoc + 1) + i).End(xlUp)(2).Resize(10).Value = r.Value 'transfer data
                k = k + 1 'move to next column
                Set r = .Range("B4").Offset((j - 1) * 11, k).Resize(10)
            Loop
            k = 0
        Next j
    End With
Next i

End Sub

【讨论】:

  • 我会尝试你的代码,但我注意到输出与预期有点不同。首选输出格式:imgur.com/a/I53mQWO,再次感谢:D
  • 抱歉弄混了稍后看看。
  • 非常感谢。
  • 用户可以选择在代码中输入物种和位置的数量吗?
  • 你的意思是代码要求用户输入物种数量(即:36)和位置(即:3),然后是。每个物种有 3 个地点。
猜你喜欢
  • 2013-11-05
  • 2016-07-19
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多