【问题标题】:Find row number in column and move data Excel vba在列中查找行号并移动数据Excel vba
【发布时间】:2014-12-05 14:35:33
【问题描述】:

我希望你们能帮助我。我有一个 Excel 表,其中包含我想复制一些值并将它们移动到另一列的数据。

目前的数据是这样的:

A           B
...
20:00:00    2456
21:00:00    2147
22:00:00    5623
23:00:00    1247
00:00:00    3549
01:00:00    1234
...

我有几天的数据,当我发现字符串“00:00:00”是另一天的开始时,我想将之前的 24 个值复制到下一列。

结果应该是这样的:

A           B       C      D
...
20:00:00    2456
21:00:00    2147
22:00:00    5623
23:00:00    1247
00:00:00            3549
01:00:00            1234
...
22:00:00            2418
23:00:00            3245
00:00:00                   3549
01:00:00                   5437

我已经开始尝试找到等于“00:00:00”的值的行号,将它们保存在一个数组中,然后在行值(i+1)“00:00:00”之间求差" 和行值(i) "00:00:00"

感谢和问候, 丹尼尔·杜阿尔特

【问题讨论】:

  • Daniel,你总是每小时都有一个条目吗?如果是这样,您可以使用Step 24 执行For...Next 循环,然后执行Range.Offset() 以获取数据并剪切粘贴。
  • 不,它可以是一个小时、15 分钟、分钟或其他一些频率。这就是我开始查找 00:00:00 行的原因。
  • 您可以编辑您的帖子以包含您尝试过的代码吗?

标签: arrays excel vba row


【解决方案1】:

这已经测试过了:

Sub move()
Dim column As Integer
column = 3

For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

   If Cells(i + 1, 1).Value > Cells(i, 1).Value and Cells(i + 1, 1).Value <> "" Then
      Cells(i, column).Value = Cells(i, 2).Value
      Cells(i, 2).Value = ""
   Else
      column = column + 1
      Cells(i, column).Value = Cells(i, 2).Value
      Cells(i, 2).Value = ""
   End If

Next

End Sub

在这种情况下需要注意的是,它正在检查下一个小时是否小于当前时间,即小时在午夜回到零并且它也会增加它粘贴的列。它将在 24 小时窗口内的任何时间工作,与分钟/秒无关

【讨论】:

  • 我已经测试了你的代码,它可以找到第一个“00:00:00”,但没有检测到下一个,只在单元格“00:00:04”添加列”。我会尝试处理你的代码。非常感谢
  • 您的数据是否被格式化为时间,但实际上也包含日期?如果是这样,在它到达 24:00:00 之后,它实际上并没有重置为 0,而是继续运行。仔细检查你的格式。我的代码在这种情况下将不起作用,但是可以轻松更改,因为这意味着您可以检查单元格值中的日期部分是否不同,而不是单元格值的时间部分。
  • 是的,它在另一列中有关联的日期。可能这是一个很好的方法。我会试一试。非常感谢
【解决方案2】:

您提到了“24”,所以我一直认为它是 24 个元素。时间是一致的还是可变的?

VBA 中的解决方案如下。

鉴于这样的事情:

time    value
20:00   100
21:00   200
22:00   300
23:00   400
0:00    500
1:00    600
2:00    700
3:00    800
4:00    900
5:00    1000
6:00    1100
7:00    1200
8:00    1300
9:00    1400
10:00   1500
11:00   1600
12:00   1700
13:00   1800
14:00   1900
15:00   2000
16:00   2100
17:00   2200
18:00   2300
19:00   2400
20:00   2500
21:00   2600
22:00   2700
23:00   2800
0:00    2900
1:00    3000
2:00    3100
3:00    3200
4:00    3300
5:00    3400
6:00    3500
7:00    3600
8:00    3700
9:00    3800
10:00   3900
11:00   4000
12:00   4100
13:00   4200
14:00   4300
15:00   4400
16:00   4500
17:00   4600
18:00   4700
19:00   4800
20:00   4900
21:00   5000
22:00   5100
23:00   5200

这是你要找的吗?

Option Explicit
Sub shift()
      Dim Test As String
      Dim NumRows As Integer
      Dim CurrentRow As Integer
      Dim ToCopy As String
      Dim x As Integer
      Dim i As Integer
      ' Set numrows = number of rows of data.
      NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count
      ' loop around
      For x = 0 To NumRows - 1
         Range("A2").Offset(x, 0).Select
         Test = ActiveCell.Text
         If Val(Test) = 0 Then
         CurrentRow = ActiveCell.Row
            If ((CurrentRow - 24) > 1) Then
                For i = 1 To 24
                        If ((CurrentRow - i - 24) > 0) Then
                            ToCopy = ActiveCell.Offset(-i - 24 + 1, 1).Text
                            ActiveCell.Offset(-i + 1, 2).Value = ToCopy 
                        End If
                Next i
            End If
         Else

         End If


      Next



End Sub

【讨论】:

  • 不幸的是,数据的频率是可变的,所以它可以是一小时、一分钟、15 分钟。非常感谢您的快速回答
  • 不,这行不通,他在 cmets 中补充说,这不一定是小时的事情。
  • 我认为最好的方法是保存所有“00:00:00”的行号,然后将数据之间的数据从rownumber(i+1)-rownumber(i)复制到下一列。
  • danuca9 - 是的;更聪明的想法;然而,这只是假设时间间隔是一致的。好主意!
【解决方案3】:

针对任意情况修改它;例如,时差为 0:15。

这有点罗嗦/悬而未决,但给了你想法。

Option Explicit

Sub shift_arb()
      Dim Test As String
      Dim StartRow As Integer
      Dim EndRow As Integer
      Dim NumRows As Integer
      Dim nZeroRows As Integer
      Dim CurrentRow As Integer
      Dim ToCopy As String
      Dim x As Integer
      Dim i As Integer
      ' Set numrows = number of rows of data.
      NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count
      ' Establish "For" loop to loop "numrows" number of times.
      For x = 0 To NumRows - 1
         Range("A2").Offset(x, 0).Select
         Test = ActiveCell.Text

         ' If we meet the critera; store the row values of the zero rows
         If TimeValue(Test) = "12:00:00 AM" Then
            nZeroRows = nZeroRows + 1
            StartRow = EndRow
            EndRow = ActiveCell.Row

             ' Only do this if you've hit the second zero row
             ' After this, we have to backfill the first, since we don't know the
             ' gap between the zeros
             If (nZeroRows > 1) Then
             ' Go from one zero row to the next

                For i = 0 To (EndRow - StartRow)

                    If ((StartRow - i) > 1) Then
                        ToCopy = Cells(StartRow - i, 2).Text
                        Cells(EndRow - i, 3).Value = ToCopy
                    End If

                Next i

                End If

            End If

        Next x

        ' At the end, cleanup, and do the rest.
        Debug.Print StartRow, EndRow, ActiveCell.Row
        For i = 0 To (EndRow - StartRow)
            If ((i + EndRow - 1) < ActiveCell.Row) Then
                ToCopy = Cells(StartRow + i, 2).Text
                Cells(EndRow + i, 3).Value = ToCopy
            End If
        Next i

End Sub

【讨论】:

  • 非常感谢您,对于我迟到的回复感到抱歉。我已经测试了您的代码,但它似乎无法正常工作。
  • 嗯...我想知道 0:00 的值是不是真的“0:00”。这可能是问题的一部分。也许文本比较会更好。您可以检查格式,并确保数据不是 0:00:01 或类似的。
  • 是的,正好是 00:00:00。这似乎很容易,但我无法让宏工作。
猜你喜欢
  • 2013-08-18
  • 1970-01-01
  • 2019-02-08
  • 2021-01-21
  • 2021-05-04
  • 1970-01-01
  • 2021-06-02
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多